ARM GNU Makefile文件夹依赖时间戳问题

ARM GNU Makefile文件夹依赖时间戳问题,makefile,dependencies,directory,gnu,Makefile,Dependencies,Directory,Gnu,我想为我的新raspberry pi开发一个小内核,并使用了以下课程: 去理解它。当我从这个站点下载一个包含多个源文件的示例时,它会正确编译第一个源文件,然后告诉我:make***没有规则生成目标“build/”,这是“build/gpio.o”所需要的。停止 让我解释一下。有一个包含所有源文件的文件夹sources。在makefile中,这些文件被编译为build文件夹中的.o文件,但编译汇编程序文件时,build文件夹也被设置为依赖项。因此,当编译第一个文件并创建生成文件夹时,文件夹时间戳已

我想为我的新raspberry pi开发一个小内核,并使用了以下课程: 去理解它。当我从这个站点下载一个包含多个源文件的示例时,它会正确编译第一个源文件,然后告诉我:make***没有规则生成目标“build/”,这是“build/gpio.o”所需要的。停止

让我解释一下。有一个包含所有源文件的文件夹sources。在makefile中,这些文件被编译为build文件夹中的.o文件,但编译汇编程序文件时,build文件夹也被设置为依赖项。因此,当编译第一个文件并创建生成文件夹时,文件夹时间戳已过期,第二个编译文件不能将此目录用作依赖项。这是要解决的问题,但我不知道如何解决

以下是生成文件:

ARMGNU ?= arm-none-eabi

# The intermediate directory for compiled object files.
BUILD = build/

# The directory in which source files are stored.
SOURCE = source/

# The name of the output file to generate.
TARGET = kernel.img

# The name of the assembler listing file to generate.
LIST = kernel.list

# The name of the map file to generate.
MAP = kernel.map

# The name of the linker script to use.
LINKER = kernel.ld

# The names of all object files that must be generated. Deduced from the 
# assembly code files in source.
OBJECTS := $(patsubst $(SOURCE)%.s,$(BUILD)%.o,$(wildcard $(SOURCE)*.s))

# Rule to make everything.
all: $(TARGET) $(LIST)

# Rule to remake everything. Does not include clean.
rebuild: all

# Rule to make the listing file.
$(LIST) : $(BUILD)output.elf
$(ARMGNU)-objdump -d $(BUILD)output.elf > $(LIST)

# Rule to make the image file.
$(TARGET) : $(BUILD)output.elf
$(ARMGNU)-objcopy $(BUILD)output.elf -O binary $(TARGET) 

# Rule to make the elf file.
$(BUILD)output.elf : $(OBJECTS) $(LINKER)
$(ARMGNU)-ld --no-undefined $(OBJECTS) -Map $(MAP) -o $(BUILD)output.elf -T      $(LINKER)

# Rule to make the object files.
$(BUILD)%.o: $(SOURCE)%.s $(BUILD)
$(ARMGNU)-as -I $(SOURCE) $< -o $@

$(BUILD):
mkdir $@

# Rule to clean files.
clean : 
-rm -rf $(BUILD)
-rm -f $(TARGET)
-rm -f $(LIST)
-rm -f $(MAP)
因此,现在它在这里工作得非常完美,我更改了几行:

$(BUILD)%.o: $(SOURCE)%.s 
$(ARMGNU)-as -I $(SOURCE) $< -o $@

$(OBJECTS): | $(BUILD)
$(构建)%.o:$(源)%.s
$(ARMGNU)-as-I$(源)$<-o$@
$(对象):|$(生成)

您要做的是使
$(构建)
成为:


我以前试过,但对我不起作用:(它仍然说没有制定目标的规则……你得到的错误似乎与你的分析无关。显然有一个制定
构建
的规则。你确定没有任何其他奇怪的事情发生吗?我知道了,在问题中,如果你真的找到了答案,你应该回答你自己的问题,这样当其他人搜索时,他们就会发现答案。)我们将确保这一问题得到解决。
$(OBJECTS): | $(BUILD)
$(BUILD)%.o: $(SOURCE)%.s 
$(ARMGNU)-as -I $(SOURCE) $< -o $@

$(OBJECTS): | $(BUILD)
$(BUILD)%.o: $(SOURCE)%.s | $(BUILD)