如果删除目标文件,如何告诉make不重新编译?

时间:2012-01-17 13:04:34

标签: compiler-construction makefile

作为一个爱好,我写了一个简单的编译器,我写了一些测试文件来检查它是否正常工作。我还在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

2 个答案:

答案 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}

虽然编译器足够小,但不会让人感到痛苦,但它会起作用。但是,它确实完全消除了编译器本身的目标文件的好处;它意味着一切都会被重新编译。但是你可以随时删除目标文件,因为没有记录编译器依赖它们。

我有点确信这是错误的做法,尽管它会“奏效”。您应该使用单独的目录来构建编译器并在编译器上运行测试。