gpt4 book ai didi

makefile - 你如何实现一个记住最后一个构建目标的 Makefile?

转载 作者:行者123 更新时间:2023-12-04 15:37:05 28 4
gpt4 key购买 nike

假设您有一个包含两个伪目标“all”和“debug”的 Makefile。 'debug' 目标旨在构建与 'all' 相同的项目,除了一些不同的编译开关(例如 -ggdb)。由于目标使用不同的编译开关,如果在两者之间切换,显然需要重建整个项目。但是 GNUmake 不会自然地认识到这一点。

所以如果你输入 make all你会得到

Building ...
...

然后如果你输入 make debug , 你得到
make: Nothing to be done for `debug'.

所以我的问题是: 您如何在 Makefile 中实现一个干净的解决方案,以注意到上次构建使用了与您当前想要的不同的伪目标或不同的编译开关? 如果它们不同,Makefile 将重建所有内容。

最佳答案

将构建产品放入不同的目录树中(当然同时保留一份源代码)。这样一来,无论是调试还是发布(甚至其他),您始终只是最新版本的简短编译。也没有混淆的可能。

编辑

上面的草图。

src := 1.c 2.c 3.c
bare-objs := ${src:%.c=%.o}
release-objs := ${bare-objs:%=Release/%}
debug-objs := ${bare-objs:%=Debug/%}

Release/prog: ${release-objs}
Debug/prog: ${debug-objs}

${release-objs}: Release/%.o: %.c # You gotta lurve static pattern rules
gcc -c $< -o $@

${debug-objs}: Debug/%.o: %.c
gcc -c $< -o $@

Release/prog Debug/prog:
gcc $^ -o $@

.PHONY: all
all: Release/prog ; echo $@ Success

.PHONY: debug
debug: Debug/prog ; echo $@ Success

(免责声明:未经测试,甚至没有通过 make 运行。)

你去吧。甚至 -j安全,所以你可以做 make -j5 all debug .有很多明显的样板只是为了整理而大喊大叫。

关于makefile - 你如何实现一个记住最后一个构建目标的 Makefile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5221989/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com