簡體   English   中英

如何使用 Makefile 編譯目錄及其子目錄中的所有程序集文件?

[英]How can I compile all assembly files in a directory and its subdirectories using Makefile?

我正在嘗試創建一個 makefile,它將編譯“src/kernel”目錄及其子目錄中的所有“.asm”文件。 我已經能夠使用“查找”命令找到所有文件,但我無法在不創建子目錄的情況下在“構建”目錄中創建 object 文件。

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”文件,但它創建了 object 文件,其中的文件與 src/kernel 文件夾中的文件相同,但名稱正確讓我解釋一下,例如我有三個文件 src/ kernel/test1.asm src/kernel/something/file.asm 和 src/kernel/something2/something.asm 我想將它們編譯成 object 文件,這樣 output 將是 test1_asm.o 第一個 file_asm.o第二個和第三個 something_asm.o 但實際上 src/kernel/test1.asm 為 test1_asm.o 和 file_asm.o 和 something_asm.o 編譯

編譯對象的規則:

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

聲明每個 object 文件都依賴於所有源文件。 '$<' 指的是 ASMSOURCES 中的第一項。 這不是你想要的。 您希望每個 object 文件都依賴於正確源文件夾中相應的“.asm”文件。

嘗試從 object 列表構建規則將很困難,因為 object 文件名不包含源文件夾。 或者,考慮構建虛擬路徑 (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 $@

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM