我正在尝试创建一个makefile,该makefile将编译“src/kernel”目录及其子目录中的所有I“asm”文件。我已经能够使用“find”命令找到所有文件,但在不创建子目录的情况下在“build”目录中创建目标文件时遇到问题。
ASMSOURCES = $(shell find src/kernel -name '*.asm')
ASMOBJECTS = $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.asm, %_asm.o, $(ASMSOURCES))))
$(ASMOBJECTS): $(BUILD_DIR)/%_asm.o : $(ASMSOURCES)
$(ASM) $(ASFLAGS) $< -o $@
上面的代码正确地找到了所有. asm文件,但它创建的目标文件与src/kernel文件夹中的文件相同,但名称正确。例如,我有三个文件src/kernel/test1. asm src/kernel/something/file. asm和src/kernel/something 2/something. asm,我希望将它们编译为目标文件,以便输出为test1_asm。o表示第一个,file_asm.o表示第二个,something_asm.o表示第三个,但实际上,src/kernel/test1.asm编译器用于test1_asm. o、file_asm. o和something_asm.o
1条答案
按热度按时间vuktfyat1#
编译对象的规则:
表示每个对象文件依赖于所有源文件。"$〈“引用ASMSOURCES中的第一项。这不是您想要的。您希望每个对象文件依赖于正确源文件夹中相应的.”asm“文件。
尝试从对象列表构建规则将很困难,因为对象文件名不包含源文件夹。作为替代方法,请考虑构建虚拟路径(vpath)以引用所有源文件夹。