如何将计算变量传递给包含的make文件'功能扩大了吗?

时间:2018-04-14 00:47:06

标签: makefile gnu-make

为了减少顶级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中包含这两行(重复)并不会太繁琐。

有人可以建议一个可行的替代方案吗?

1 个答案:

答案 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