Makefile-如何在创建其他目标的目标中定义变量?

时间:2015-02-20 15:11:28

标签: makefile

我不完全了解如何使用特定于目标的变量作为目标,拥有自己的依赖项和配方。

示例Makefile有效,但不使用特定于目标的变量:

VAR=progName
ATARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)
$(VAR):
    @echo Do actions on $@
  

制作ATARGET

     

对progName执行操作

     

根据完成的目标progName

对ATARGET执行操作

尝试使用特定于目标的变量不起作用的Makefile(注意执行make时缺少“对progName执行操作”):

ATARGET:VAR=progName
ATARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)
$(VAR):
    @echo Do actions on $@
  

制作ATARGET

     

根据完成的目标progName

对ATARGET执行操作

所需的Makefile行为:

ATARGET:VAR=progName
ATARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)

BTARGET:VAR=otherProgName
BTARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)

$(VAR):
    @echo Do actions on $@
  

制作ATARGET

     

对progName执行操作

     

根据完成的目标progName

对ATARGET执行操作      

制作BTARGET

     

对otherProgName执行操作

     

根据已完成的目标otherProgName

执行BTARGET的操作

这些是简单的Makefile来说明问题 - 实际的makefile有几个目标,具体取决于VAR的值。

PGM = $(VAR)_test.exe;
LIB = lib$(VAR).a;
LIBLINKNAME = $(VAR);

1 个答案:

答案 0 :(得分:2)

根据您正在构建的目标,您无法更改make变量的值;在所有这些之前处理它们。但是,您可以拥有包含多个目标的规则,并使用它们生成所需的行为。例如:

VAR = progName otherProgName

ATARGET: progName
    echo Do actions for $@ based on the completed target $<

BTARGET: otherProgName
    echo Do actions for $@ based on the completed target $<

$(VAR):
    echo Do actions on $@

VAR现在不再是一个非常好的名字(也许更好地称之为LIST或其他东西)。这样,相同的配方适用于progNameotherProgName目标,生成哪一个取决于您正在构建的目标的先决条件。

结合字符串处理功能,这适用于更复杂的用例。例如,您可以使用

# pattern substitution: append _test.exe to all entries in VAR
PGM = $(VAR:%=%_test.exe)

$(PGM):
    recipe for individual *_test.exe programs here.

您可能非常static pattern rules感兴趣。