作为一个爱好,我写了一个简单的编译器,我写了一些测试文件来检查它是否正常工作。我还在makefile中添加了一些行,所以我可以通过一个命令编译我的编译器,编译(使用它)测试文件,组装它们并链接它们。问题是,如果我删除了目标文件(编译器从中链接)并告诉make运行测试,它会重新编译我的编译器,尽管二进制文件仍然存在。我怎么能告诉make不这样做? (但我仍然希望选择告诉make重新编译已更改的源文件,并重新链接我的编译器。)
我的makefile中的一些行:
OBJS=asm.o main.o type.o var.o ...
SAMPLES=arr.out sample.out ...
SAMPASM=arr.asm sample.asm ...
all: myc
myc: ${OBJS}
${CC} ${LDFLAGS} -o myc ${OBJS}
%.o: src/%.c src/myc.h
$(CC) $(CFLAGS) $< -o $@
test: ${SAMPLES} ${SAMPASM}
%.out: %.aso asm/com.aso
ld $< asm/com.aso -o $@
%.aso: %.asm
nasm -f elf64 $< -o $@
%.asm: samples/%.myc myc
./myc $< -o $@
clean:
rm -f *.o *.out *.asm myc
答案 0 :(得分:4)
您可以使用.SECONDARY或.INTERMEDIATE
来自http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_36.html
.INTERMEDIATE处理.INTERMEDIATE所依赖的目标 作为中间文件。见Chains of Implicit Rules部分。 没有依赖项的.INTERMEDIATE标记了中提到的所有文件目标 makefile作为中间文件。
.SECONDARY .SECONDARY所依赖的目标被视为 中间文件,但它们永远不会被自动删除。 请参阅隐式规则链接部分。 .SECONDARY没有依赖关系 将makefile中提到的所有文件目标标记为辅助目标。
通常,如果您想自动删除.o文件,请使用
.INTERMEDIATE: $(OBJS)
如果你想让make不关心o文件是否存在,请使用
.SECONDARY: $(OBJS)
答案 1 :(得分:0)
建议:
(也就是说,你应该在一个单独的目录中进行测试,这样就不会遇到问题。)
我没有修改GNU Make和.INTERMEDIATE
或.SECONDARY
文件;我不知道那是否能为你完成这项工作。
我看到的替代选项是每次任何源文件或标头更改时重建整个编译器:
FILES.c = src/main.c src/type.c src/var.c ...
FILES.s = src/asm.s
FILES.h = src/myc.h ...
PROGRAM = myC
all: ${PROGRAM} test
${PROGRAM}: ${FILES.c} ${FILES.s} ${FILES.h}
${CC} ${CFLAGS} -o $@ ${FILES.c} ${FILES.s} ${LDFLAGS} ${LDLIBS}
虽然编译器足够小,但不会让人感到痛苦,但它会起作用。但是,它确实完全消除了编译器本身的目标文件的好处;它意味着一切都会被重新编译。但是你可以随时删除目标文件,因为没有记录编译器依赖它们。
我有点确信这是错误的做法,尽管它会“奏效”。您应该使用单独的目录来构建编译器并在编译器上运行测试。