仅用于快速术语:
#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/