我有一个正在尝试执行以下操作的生成文件:使用.c和.s扩展名标识当前目录(包括所有子目录)下的所有文件,为每个文件编译非链接对象文件并将其放入一个目录。所有的C文件都以对象/ c结尾,所有的程序集文件都以对象/驴结尾。为什么makefile表现出非确定性行为?
makefile在第一次执行时总是按预期工作(所有命令按正确顺序调用)并且不会产生错误。
但是,如果我再次打电话给make,那么我有一半时间“没有任何工作可以完成”。这是你所期望的,因为没有文件被修改。但另一半时间,make则是选择一个随机汇编文件并编译该文件。也就是说,如果我继续做“make”,有时我会编译file1.s,有时候是file2.s。并且它会在程序集文件之间随机交换添加无限(它永远不会达到“无法完成”)状态。
如何使参展非确定性行为?
这是最小的makefile我能有这样的重现错误:
SRC_C = $(wildcard *.c) $(wildcard **/*.c)
SRC_ASS = $(wildcard *.s) $(wildcard **/*.s)
OBJECTS_C = $(addprefix $(OBJECT_DIR)c/, $(notdir $(SRC_C:.c=.o)))
OBJECTS_ASS = $(addprefix $(OBJECT_DIR)ass/, $(notdir $(SRC_ASS:.s=.o)))
OBJECTS = $(OBJECTS_C) $(OBJECTS_ASS)
OBJECT_DIR = objects/
all: $(OBJECTS)
%/:
mkdir [email protected]
$(OBJECTS_C): $(OBJECT_DIR) $(OBJECT_DIR)c/
arm-none-eabi-gcc -O0 -march=armv8-a $(wildcard */$(@F:.o=.c)) -nostartfiles -c -o [email protected]
$(OBJECTS_ASS): $(OBJECT_DIR) $(OBJECT_DIR)ass/
arm-none-eabi-as -march=armv8-a $(wildcard */$(@F:.o=.s)) -c -o [email protected]
.PHONY: clean
clean:
rm -rf $(OBJECT_DIR)
使用'--trace'开关(假设为GNU make)让'make'显示其逻辑以决定是否重建 –
如果您遇到问题,请尝试生成一个实际显示问题的最小生成文件 –
根据跟踪,第一次成功编译后再次编译的原因是由于目录对象? – Makogan