制造:取决于目标的可变需求

时间:2018-11-18 12:00:17

标签: makefile

制定:取决于目标的可变要求

我有一个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)的值。但是,它会在运行规则时解决。

那我怎么做呢?

1 个答案:

答案 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(无效设置),则会收到错误消息。

还有其他方法可以做到这一点,但是如果不能完全了解您想要的内容,我们就无法确定。