生成依赖项:使用gcc跳过供应商和包标头



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

-M选项输出所有标头,包括系统标头。-MM选项不输出系统头,但我仍然沉浸在成千上万的供应商和包头中,如Sybase和Boost,我认为这些头不会改变(如果它们改变了,我很高兴不得不手动进行完全重建(。

显然,我可以将gcc-MM封装在perl脚本中,或者您知道我认为包的目录,但是否有更广泛接受的解决方案?

请注意,我的一个供应商的头文件查找特定的gcc定义的预处理器符号,以配置它们的可移植性。我宁愿不手动策划一组这样的符号,以允许使用一些非gcc方法(例如makedepend(生成依赖关系。

使用-isystem来声明不希望使用-MM输出的目录,而不是-I

目前在https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html尽管它似乎与CCD_ 10和CCD_。

示例:这将创建foo.cpp和bar.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

以下是gmake的示例Makefile实现。patsubst函数是一种模式替换,使用%作为匹配"before"的部分,然后捕获并在"after"中使用。isystem似乎需要在其后面有一个空格,但使用patsubst很容易生成,因为百分号可以防止空格被截断。如果名为的文件不存在,则-include上的minus选项会告诉gmake不要抱怨。这允许您使用gmake来生成depend并生成Make.Dep,甚至在Make.Dep.之前也是如此。最后,这假设$(PkgIncDirs)持有包包含目录,这些目录都不应该更改,而$(ProjIncDirs)将是您希望为其生成依赖项的项目内的包含目录。

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

相关内容

  • 没有找到相关文章

最新更新