帮助rake依赖关系映射

时间:2010-02-25 15:50:31

标签: c++ ruby build rake

我正在为C ++项目编写Rakefile。我希望它能够自动识别#includes,强制重建依赖于已更改源文件的目标文件。我有一个有效的解决方案,但我认为它会更好。我在寻找建议:

  • 改善我的功能的建议
  • 为我工作的图书馆,宝石或工具
  • 链接到酷C ++ Rakefiles,我应该检查它做类似的事情

这是我到目前为止所拥有的。它是一个函数,它返回给定源文件的依赖项列表。我提供了给定目标文件的源文件,我想要一个文件列表,这将迫使我重建我的目标文件。

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 个答案:

答案 0 :(得分:6)

使用gcc命令生成Make依赖项列表,并解析:

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

有关详细信息,请参阅man gccinfo gcc

答案 1 :(得分:3)

我确信在#include指令中放入什么有不同的思想流派。我建议不要把整个路径放在#includes中。而是在编译命令中设置正确的包含路径(使用-I)。这使得将来重新定位文件更容易,更易读(在我看来)。这可能听起来很小,但随着项目的发展而重组的能力绝对有价值。

使用预处理器(请参阅@greyfade)生成依赖关系列表的优势在于它将根据include dirs扩展标题路径。


更新:另请参阅Importing Dependencies section of the Rakefile doc以获取读取makefile依赖关系格式的库。