我正在启动一个新项目,并考虑使用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