Помогите с отображением зависимости от рейка - PullRequest
3 голосов
/ 25 февраля 2010

Я пишу Rakefile для проекта C ++. Я хочу, чтобы он автоматически определял #includes, заставляя пересоздавать объектные файлы, которые зависят от измененных исходных файлов. У меня есть рабочее решение, но я думаю, что оно может быть лучше. Я ищу предложения для:

  • Предложения по улучшению моей функции
  • Библиотеки, драгоценные камни или инструменты, которые делают всю работу за меня
  • Ссылки на классные Rake-файлы C ++, которые я должен проверить и которые делают подобные вещи

Вот что у меня есть. Это функция, которая возвращает список зависимостей данного исходного файла. Я передаю исходный файл для данного объектного файла и хочу получить список файлов, которые заставят меня перестроить мой объектный файл.

def find_deps( file )
  deps = Array.new
  # Find all include statements
  cmd = "grep -r -h -E \"#include\" #{file}"
  includes = `#{cmd}`
  includes.each do |line|
    dep = line[ /\.\/(\w+\/)*\w+\.(cpp|h|hpp)/ ]
    unless dep.nil?
      deps << dep # Add the dependency to the list
      deps += find_deps( dep )
    end
  end
  return deps
end

Я должен отметить, что все мои включения сейчас выглядят так:

#include "./Path/From/Top/Level/To/My/File.h" // For top-level files like main.cpp 
#include "../../../Path/From/Top/To/My/File.h" // Otherwise

Обратите внимание, что я использую двойные кавычки для включений в моем проекте и угловые скобки для внешних библиотек. Я открыт для предложений об альтернативных способах включения пути включения, которые облегчают мою жизнь.

Ответы [ 2 ]

6 голосов
/ 25 февраля 2010

Используйте команду gcc для генерации списка зависимостей Make вместо этого и выполните синтаксический анализ:

g++ -M -MM -MF - inputfile.cpp

Подробнее см. man gcc или info gcc.

3 голосов
/ 27 февраля 2010

Я уверен, что существуют разные точки зрения относительно того, что помещать в директивы #include. Я советую не помещать весь путь в ваши #includes. Вместо этого установите правильные пути включения в вашей команде компиляции (с -I). Это облегчает перемещение файлов в будущем и делает их более читаемыми (на мой взгляд). Это может звучать незначительно, но возможность реорганизации по мере развития проекта, безусловно, ценно.

Использование препроцессора (см. @Greyfade) для генерации списка зависимостей имеет то преимущество, что он расширяет пути заголовков для вас на основе ваших включаемых каталогов.


Обновление : см. Также раздел Импорт зависимостей документа Rakefile для библиотеки, которая читает формат зависимостей make-файла.

...