代码之家  ›  专栏  ›  技术社区  ›  Swiss Frank

建立依赖关系:使用gcc跳过供应商和包标题?

  •  1
  • Swiss Frank  · 技术社区  · 6 年前

    我正在启动一个新项目,并考虑使用gcc 6.3.1 -MM 将依赖项生成到名为 Make.Dep ,我将从 Makefile .

    这个 -M 选项输出 全部的 标题,包括系统标题。这个 -嗯 option不会输出系统头,但我仍然被成千上万的供应商和包头埋在里面,比如Sybase和Boost,我认为它们不会改变(如果它们改变了,我很高兴不得不手动进行完整的重建)。

    显然,我可以用Perl脚本包装GCC—MM,或者你知道我认为包的目录是什么,但是有一些更广泛接受的解决方案吗?

    请注意,我的一个供应商的标题查找特定的gcc定义的预处理器符号,以配置其可移植性。我不希望手动策划一组这样的符号,以允许使用一些非gcc方法生成依赖项(例如。, makedepend ).

    1 回复  |  直到 6 年前
        1
  •  1
  •   Swiss Frank    6 年前

    而不是 -I 使用 -isystem 声明不希望与之一起输出的目录 -MM .

    这一点目前还没有提到 https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html 尽管它似乎与 -M -嗯 选项。

    示例:这会创建foo的正确依赖项。cpp和酒吧。cpp, 包括…在内 Sybase头文件:

    gcc -MM -I/opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/include foo.cpp bar.cpp
    

    示例:这也是一样的,但是 不包括 Sybase头文件:

    gcc -MM -isystem /opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/include foo.cpp bar.cpp
    

    这是一个样本 Makefile 实施 gmake 这个 patsubst 函数是一种模式替换,使用%作为匹配“before”的部分,然后在“after”中捕获并使用该部分 isystem 后面似乎需要一个空格,但这很容易生成 帕萨斯特 因为百分号可以防止空间被截断。上的负选项 -include 说明 gmake 如果名为的文件不存在,不要抱怨。这允许你使用 gmake 使 depend 生产 Make.Dep 甚至在那之前 A. Make.Dep. 最后,假设 $(PkgIncDirs) hold package包括所有不应更改的目录,而 $(ProjIncDirs) 将在项目中包含您希望为其生成依赖项的目录。

    depend:
        gcc -MM $(CFlags) $(Defines) $(patsubst -I%, -isystem %, $(PkgIncDirs)) $(ProjIncDirs) $(Source) >Make.Dep
    
    -include Make.Dep