Я пишу 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
Обратите внимание, что я использую двойные кавычки для включений в моем проекте и угловые скобки для внешних библиотек. Я открыт для предложений об альтернативных способах включения пути включения, которые облегчают мою жизнь.