1

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

-M选项输出所有标题,包括系统标题。该-MM选项不输出系统头文件,但我仍然沉浸在数以千计的供应商和包头文件中,例如 Sybase 和 Boost,我认为这不会改变(如果他们这样做,我很高兴不得不这样做手动完全重建)。

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

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

4

1 回答 1

1

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

尽管它似乎与选项密切相关,但目前在https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html中没有提到这一点。-M-MM

示例:这将创建 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

这是一个示例Makefile实现gmake。该patsubst函数是一个模式替换,使用 % 作为匹配“之前”的部分,然后捕获并在“之后”中使用。 isystem后面似乎需要一个空格,但这很容易生成,patsubst因为百分号可以防止空格被截断。如果命名的文件不存在,则减号选项-include告诉不要抱怨。gmake这使您甚至可以在没有最后的情况下使用gmake来制作depend和生产 ,这假定包含不应更改的包包含目录,而将包含您希望为其生成依赖项的项目中的目录。Make.DepMake.Dep.$(PkgIncDirs)$(ProjIncDirs)

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

-include Make.Dep
于 2020-03-24T08:20:31.223 回答