我不完全了解如何使用特定于目标的变量作为目标,拥有自己的依赖项和配方。
示例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);
答案 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
或其他东西)。这样,相同的配方适用于progName
和otherProgName
目标,生成哪一个取决于您正在构建的目标的先决条件。
结合字符串处理功能,这适用于更复杂的用例。例如,您可以使用
# 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感兴趣。