gpt4 book ai didi

makefile - 如何参数化生成文件目标

转载 作者:行者123 更新时间:2023-12-01 03:46:31 25 4
gpt4 key购买 nike

我得到了一个 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 $@

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

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

最佳答案

如果你使用 GNU Make 你可以写一个函数(一个可调用的宏)。单例$$(call ...) 期间被替换双$执行时被替换 $(eval $(call ...)) .背景资料here .

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))

关于makefile - 如何参数化生成文件目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26522359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com