在目标依赖项之前设置Makefile变量

时间:2015-02-10 21:25:08

标签: makefile

我正在使用Makefile来构建列表TARGETS中的一个或所有目标(在本例中,RPMS用于一个或多个体系结构)。

如果给出变量TARGET,则构建该特定RPM。如果未设置变量TARGET,则将调用TARGETS中每个TARGET的规则,即:

TARGETS = x86_64 i686
ifdef TARGET
all: $(TARGET)
else
all: $(TARGETS)
endif

<magical part:>
$(TARGETS): TARGET = $@: rpm

rpm:
  rpmbuild --target=$(TARGET) SPECS/foo.spec

我也尝试过:

TARGETS = x86_64 i686
ifdef TARGET
all: $(TARGET)
else
all: $(TARGETS)
endif

<magical part:>
$(TARGETS): TARGET = $@
$(TARGETS): rpm

rpm:
  rpmbuild --target=$(TARGET) SPECS/foo.spec

可以这样做,或者我会更好地为每个目标重新调用make,例如:

TARGETS = x86_64 i686
ifdef TARGET
all: rpm
else
all: $(TARGETS)
endif

$(TARGETS):
  make TARGET=$@

rpm:
  rpmbuild --target=$(TARGET) SPECS/foo.spec

理想的调用TARGET=x86_64 make相当于make x86_64

1 个答案:

答案 0 :(得分:1)

我不完全确定你为什么要这样做,但这是一种方法:

TARGETS = a b c
ifdef TARGET
all: $(TARGET)
else
all: $(TARGETS)
endif

$(sort $(TARGETS) $(TARGET)):
    @echo $@

sort函数删除重复项。如果您的TARGETTARGETS中的元素之一,那么Make会在目标列表中抱怨重复,除非您将其删除。