2010-02-25 70 views
3

我正在写一个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 

请注意,我使用双引号为我的项目和尖括号内包括外部库包括。我愿意提供其他方式的建议,使我的生活更轻松。

回答

6

使用gcc的命令生成制作依赖列表,而是和解析:

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

详见man gccinfo gcc

3

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

使用预处理器(请参阅@greyfade)生成依赖项列表的优点是,它将根据您的包含目录为您扩展标题路径。


更新:还看Importing Dependencies section of the Rakefile doc该读取makefile依存格式的库。