【发布时间】:2015-03-26 07:42:33
【问题描述】:
我在为我的用例编写合适的 makefile 目标时遇到问题。
我有一个可以生成头文件和源文件的脚本。生成头文件 myHeader.h 的输入文件是 config/myHeader.h.template 和 config/myHeader.xlsx。 可以看到,输入文件和头文件不在同一个目录,而是在“config”子目录中。
在 makefile 中,我有一个列表,包含脚本生成的所有头文件和源代码。
MY_GENERATED_HEADERS = $(sort \
foo/bar/myHeader1.h \
foo/bar/myHeader2.h)
此外,我还有一个可以从“外部”调用的目标:
generate: $(MY_GENERATED_HEADERS)
所以当我写的时候
make generate
在命令行上,我想检查列表中的每个标题是否需要再次生成。
所以,现在是复杂的部分。 当 .h.template 或 .xlsx 发生变化时,我必须编写一个最终调用我的脚本的目标。
$(MY_GENERATED_HEADERS): %.h: %.h.template %.xlsx
@echo $@
#invoke the script...
在规则中,我可以设置调用脚本所需的绝对文件名。没问题,jsut使用一些自动变量和字符串操作函数。
实际的问题是先决条件列表:在上述解决方案中,假设 .h.template 和 .xlsx 文件与输出标头 (foo/bar/) 位于同一目录中,但是,我希望它们是在 foo/bar/config 中稍微清理一下文件系统。
在上述解决方案中,我会收到错误消息
No rule to make target 'foo/bar/myHeader1.h.template'.
是的,没错,因为 myHeader1.h.template 在 foo/bar/config...
我已将所有目录添加到 VPATH,但这并没有改变任何东西。
对此有什么想法吗?
【问题讨论】:
-
试试
$(MY_GENERATED_HEADERS): %.h: $(dir %)/config/$(notdir %).h.template $(dir %)/config/$(notdir %).xlsx -
似乎 $(dir %) 返回 "."并且 $(notdir %) 返回“foo/bar/myHeader1”。所以,你的解决方案抛出错误:没有规则使目标'config/foo/bar/myHeader1.h.template"。根据gnu.org/software/make/manual/html_node/File-Name-Functions.html,这不是dir和notdir应该工作的方式。也许他们不工作先决条件清单?
-
我只是在 ./ 中尝试我的建议,所以我没有看到这个。感谢 Louis 的最终更正答案