我有一个makefile,它使用特定于模式的变量和特定于目标的变量来控制编译设置。单个目标可以指定特定于目标的变量以覆盖更常规的编译设置。但是,有些设置是互斥的,我在如何将条件添加到makefile以根据另一个在为配方设置了特定于目标的变量之后调整设置时受到了阻碍。
我的makefile运行在很多人不熟悉的IBM i(GNU Make 4.0)上,所以这里有一个捏造的例子,希望对大多数人更有意义:
.PHONY: all
all: object1.o object2.o
%.o: TYPE = solid
%.o: ITEM = stone
%.o: %.c
compile_command -type $(TYPE) -item $(ITEM)
object1.o: ITEM = helium
object1.o: object1.c
object2.o: ITEM = water
object2.o: object2.c
特定于模式的变量为所有TYPE
文件设置ITEM
和.o
的默认值。 object1.o
会将ITEM
覆盖为"氦气"。如何插入条件,以便ITEM
等于"氦"那么TYPE
可以自动设置为" gas"?同样,如果ITEM
等于" water"然后我们如何自动将TYPE
设置为" liquid"?目标是避免必须明确指定TYPE
作为特定于目标的变量;它应该能够通过规则得出。
答案 0 :(得分:1)
您可以执行以下操作:
GASSES = helium argon
LIQUIDS = water
derive_type = $(or $(if $(filter $(ITEM),$(GASSES)),gas),$(if $(filter $(ITEM),$(LIQUIDS)),liquid),$(TYPE))
%.o: %.c
compile_command -type $(derive_type) -item $(ITEM)
基本上,or
函数是短路的,并返回传入列表中非空的第一项,filter
函数返回匹配值。所以这就是说,如果ITEM
变量中存在$(GASSES)
的值,那么返回第一个值为“gas”的值,同样为$(LIQUIDS)
和liquid
,如果还有其他值失败返回$(TYPE)
值的值。
如果要允许TYPE
成为第一个被设置的选项,可能需要做一些与默认值相关的工作。