我有一个Makefile
,看起来像这样:
default: en
.PHONY: default en es
en: NUMBER=number
es: NUMBER=numero
TARGET=$(NUMBER)-word
INTERMEDIATE=$(NUMBER)-tmp
en: number
es: number
number: $(INTERMEDIATE)
touch $(TARGET)
$(INTERMEDIATE):
@echo Please provide file $(INTERMEDIATE)
@exit 1
clean:
rm *-word *-tmp
要使用它,请致电make en
(也是默认值)或make es
。如我所见,此Makefile具有两个主要功能:
$(INTERMEDIATE)
。运行此命令时,我得到以下信息:
$ make
Please provide file number-tmp
make: *** [-tmp] Error 1
此错误向我表明,对于我想要的目标,变量的解析太迟了。失败的规则为-tmp
,表示在确定要运行的规则时无法告诉$(NUMBER)
的值。但是,它会在运行规则时解决。
那我怎么做呢?
答案 0 :(得分:3)
The documentation很明显,您不能在目标或先决条件内使用目标特定的变量值:
另一个例外是特定于目标的变量值。此功能使您可以根据make当前正在构建的目标为同一变量定义不同的值。 与自动变量一样,这些值仅在目标配方的上下文中(以及在其他特定于目标的分配中)可用。
您可以通过多种方式处理此问题。最简单的方法是将选择更改为使用变量而不是目标,然后使用constructed macro names。假设您将值存储在LV
变量中(您不应该使用LANG
等,因为这对于shell来说是特殊的),如下所示:
# Must be set on the command line
LV =
en_NUMBER := number
es_NUMBER := numero
TARGET := $($(LV)_NUMBER)-word
INTERMEDIATE := $($(LV)_NUMBER)-tmp
ifeq ($(TARGET),-word)
$(error Missing/invalid LV value: '$(LV)')
endif
number: $(INTERMEDIATE)
touch $(TARGET)
clean:
rm *-word *-tmp
如果您运行make LV=en
,则会得到number-word
。如果您运行make LV=es
,则会得到numero-word
。如果您运行make
(无设置)或make LV=foo
(无效设置),则会收到错误消息。
还有其他方法可以做到这一点,但是如果不能完全了解您想要的内容,我们就无法确定。