为了减少顶级makefile中重复的锅炉板数量,我创建了一个包含使用计算变量名称的make文件。我遇到困难的地方摘自包含的makefile:ftp-files.mk
:
...
$($(FNMPFX)_FTP_CFG): $(CFG_MAKE_FILE) | $($(FNMPFX)_FTP_CFG_DIR)
$(call ftp_helper, $@, $($(FNMPFX)_FTP_DIR), $($(FNMPFX)_CACHE_DIR), $($(FNMPFX)_FTP_NAME))
...
在主要的makefile中,我希望做类似的事情:
CFG_MAKE_FILE := Makefile
define ftp_helper
echo "quote USER anonymous" > $(1)
echo "quote PASS" >> $(1)
echo "cd $(2)" >> $(1)
echo "lcd $(3)" >> $(1)
echo "binary" >> $(1)
echo "get $(4)" >> $(1)
echo "quit" >> $(1)
endef
FNMPFX := FILE_A
include ftp-files.mk
...
FNMPFX := FILE_Z
include ftp-files.mk
...
麻烦的是,仅订单的先决条件(也将其作为正常的先决条件尝试)扩展到包含文件的最后一个... instanciation(?)。
似乎正在发生的事情是两个目标的第一次扩展,就像它们被写成一样:
# Point of confusion V
# |
$(FILE_A_FTP_CFG): $(CFG_MAKE_FILE) | $(FILE_Z_FTP_CFG_DIR)
$(call ftp_helper, $@, $(FILE_A_FTP_DIR), $(FILE_A_CACHE_DIR), $(FILE_A_FTP_NAME))
$(FILE_Z_FTP_CFG): $(CFG_MAKE_FILE) | $(FILE_Z_FTP_CFG_DIR)
$(call ftp_helper, $@, $(FILE_Z_FTP_DIR), $(FILE_Z_CACHE_DIR), $(FILE_Z_FTP_NAME))
这可能吗?
我的工作是将主要Makefile中的简单目标规则包含在内(ftp-file.mk
在100行时合理冗长),因此在主Makefile中包含这两行(重复)并不会太繁琐。
有人可以建议一个可行的替代方案吗?
答案 0 :(得分:0)
通常,您无法像shell脚本一样读取整个Makefile。它分多个阶段进行读取,在继续下一步之前,使用Makefile的全部内容完成某些操作。规则相当复杂,但足以说它看起来像是使用了最后一个赋值:
$ cat Makefile
variable := original
first:
echo $(variable)
variable := other
second:
echo $(variable)
$ make first
echo other
other
$ make second
echo other
other