我正在为C ++项目编写Rakefile。我希望它能够自动识别#includes
,强制重建依赖于已更改源文件的目标文件。我有一个有效的解决方案,但我认为它会更好。我在寻找建议:
这是我到目前为止所拥有的。它是一个函数,它返回给定源文件的依赖项列表。我提供了给定目标文件的源文件,我想要一个文件列表,这将迫使我重建我的目标文件。
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
请注意,我在项目中使用双引号和外部库包含的尖括号。我愿意接受有关使用包含路径的替代方法的建议,这些方法可以让我的生活更轻松。
答案 0 :(得分:6)
使用gcc命令生成Make依赖项列表,并解析:
g++ -M -MM -MF - inputfile.cpp
有关详细信息,请参阅man gcc
或info gcc
。
答案 1 :(得分:3)
我确信在#include指令中放入什么有不同的思想流派。我建议不要把整个路径放在#includes中。而是在编译命令中设置正确的包含路径(使用-I
)。这使得将来重新定位文件更容易,更易读(在我看来)。这可能听起来很小,但随着项目的发展而重组的能力绝对有价值。
使用预处理器(请参阅@greyfade)生成依赖关系列表的优势在于它将根据include dirs扩展标题路径。
更新:另请参阅Importing Dependencies section of the Rakefile doc以获取读取makefile依赖关系格式的库。