assembly 如何使用Makefile编译一个目录及其子目录中的所有程序集文件?

lg40wkob  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在尝试创建一个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

vuktfyat

vuktfyat1#

编译对象的规则:

$(ASMOBJECTS): $(BUILD_DIR)/%_asm.o : $(ASMSOURCES)
 $(ASM) $(ASFLAGS) $< -o $@

表示每个对象文件依赖于所有源文件。"$〈“引用ASMSOURCES中的第一项。这不是您想要的。您希望每个对象文件依赖于正确源文件夹中相应的.”asm“文件。
尝试从对象列表构建规则将很困难,因为对象文件名不包含源文件夹。作为替代方法,请考虑构建虚拟路径(vpath)以引用所有源文件夹。

BUILD_DIR = build
ASMSOURCES = $(shell find src/kernel -name '*.asm')
ASMDIRS = $(sort $(dir $(ASMSOURCES)))
ASMOBJECTS = $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.asm, %_asm.o, $(ASMSOURCES))))

all: $(ASMOBJECTS)

vpath %.asm $(ASMDIRS)

$(ASMOBJECTS): $(BUILD_DIR)/%_asm.o: %.asm
    $(AS) $(ASFLAGS) $< -o $@

相关问题