Makefile(自动依赖生成)

标签 makefile dependencies gnu

仅用于快速术语:

#basic makefile rule
target: dependencies
    recipe

问题:我想自动生成依赖项。

例如,我希望将其变为:

#one of my targets
file.o: file.cpp 1.h 2.h 3.h 4.h 5.h 6.h 7.h 8.h another.h lots.h evenMore.h
    $(COMPILE)

进入此:

#one of my targets
file.o: $(GENERATE)
    $(COMPILE)

我不太确定这是否可能..

我所知道的:

我可以使用这个编译器标志:

g++ -MM file.cpp

它将返回正确的目标和依赖项。
因此从示例中,它将返回:

file.o: file.cpp 1.h 2.h 3.h 4.h 5.h 6.h 7.h 8.h another.h lots.h evenMore.h  

但是,“make”不允许我在规则的目标或依赖项部分显式编写 shell 代码:(
我知道有一个名为 shell 的“make”函数

但我不能完全将其作为依赖项插入并进行解析魔法,因为它依赖于代表目标的宏 $@ ..或者至少我认为这就是问题所在

我什至尝试用这个 makefile 函数替换“file.cpp”依赖项,但这也不起作用..

#it's suppose to turn the $@ (file.o) into file.cpp
THE_CPP := $(addsuffix $(.cpp),$(basename $@))

#one of my targets
file.o: $(THE_CPP) 1.h 2.h 3.h 4.h 5.h 6.h 7.h 8.h another.h lots.h evenMore.h
    $(COMPILE)
#this does not work

所以在谷歌上,似乎有两种解决方案。这两点我都没有完全掌握。
From GNU Make Manual

Some Site that says the GNU Make Manual one is out-of-date

所以我的最终问题是:是否可以按照我想要的方式去做,
如果没有,有人可以分解这些网站之一的代码并向我详细解释它们是如何工作的。如果有必要的话,我会用其中一种方法来实现它,但我厌倦了在理解它之前将一大块代码粘贴到我的 makefile 中

最佳答案

较新版本的 GCC 有一个 -MP 选项,可以与 -MD 一起使用。我只是将 -MP 和 -MD 添加到我的项目的 CPPFLAGS 变量中(我没有编写用于编译 C++ 的自定义配方),并添加了“-include $(SRC:.cpp=.d)”行。

使用 -MD 和 -MP 给出一个依赖文件,其中包括依赖项(无需使用一些奇怪的 sed)和虚拟目标(这样删除头文件就不会导致错误)。

关于Makefile(自动依赖生成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025766/

相关文章:

android - Gradle构建顺序

php - 如何处理具有多个依赖项的函数

c++ - 有没有一种简单的方法可以从嵌入式 C++ GNU ARM 中的字符串解析 float ?

makefile - 如何在递归构建中忽略命令行变量赋值?

migration - 有没有工具可以帮助从 make 迁移到 waf?

linux - 共享库不包含包含方法的符号?

android - 如何了解 Android 支持依赖项的最新稳定次要版本?

java - GNU 加密货币 : JCE cannot authenticate the provider GNU-CRYPTO

vim - 如何在 vim 中处理具有另一个名称的 Makefile?

gcc - 链接器输入文件未使用,因为链接未完成 - gcc