我有一个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 $@
不能按预期工作。我想我需要访问匹配%
的目标部分,我无法做到这一点。
有没有办法将两个变体合并为一个(参数化的)?
答案 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}}