如何参数化makefile目标

时间:2014-10-23 06:25:34

标签: makefile

我有一个Makefile,它构建了一个32位和64位版本的项目:

#############################
# 32 bit variant of test tool
#############################
hidtest_32: $(OBJS_32)
    $(CXX_32) -m32 -g $^ $(LIBS) -o hidtest_32

hid_32.o: hid.c
    $(CC_32) -m32 $(CFLAGS) $< -o hid_32.o

../hidtest/hidtest_32.o: ../hidtest/hidtest.cpp
    $(CC_32) -m32 $(CFLAGS) $< -o ../hidtest/hidtest_32.o


#############################
# 64 bit variant of test tool
#############################
hidtest_64: $(OBJS_64)
    $(CXX_64) -m64 -g $^ $(LIBS) -o hidtest_64

hid_64.o: hid.c
    $(CC_64) -m64 $(CFLAGS) $< -o hid_64.o

../hidtest/hidtest_64.o: ../hidtest/hidtest.cpp
    $(CC_64) -m64 $(CFLAGS) $< -o ../hidtest/hidtest_64.o

正如您所看到的,两个变体都使用完全相同的构建过程,但数字32已替换为64

我尝试过像

这样的事情
hidtest64: ARCH=64
hidtest64: hidtest_64
hidtest32: ARCH=32
hidtest32: hidtest_32

hidtest_%: $(OBJS_$(ARCH))
   $(CXX_$(ARCH)) -m$(ARCH) -g $^ $(LIBS) -o $@

不能按预期工作。我想我需要访问匹配%的目标部分,我无法做到这一点。

有没有办法将两个变体合并为一个(参数化的)?

1 个答案:

答案 0 :(得分:1)

如果您正在使用GNU Make您可以编写一个函数(一个可调用的宏)。在执行$时,$(call ...)$代替$(eval $(call ...))define add_target $(info compiling hidtest_$(1)) # logged when doing $(call ...) $$(info evaluating hidtest_$(1)) # logged when doing $(eval $(call ...)) hidtest_$(1): $(OBJS_$(1)) $(CXX_$(1)) -m$(1) -g $$^ $(LIBS_$(1)) -o $$@ endef $(eval $(call add_target,32)) $(eval $(call add_target,64)) 。背景信息here

{{1}}