我正在尝试使用 makefile,我的问题是我有一个目录,有一个src
目录和一个Makefile
. 我还使用tmp
我也必须创建的目录。它里面有目标文件。为了性能,我在调试时尽量不要删除这些。如果我为 tmp 创建一个规则来创建它,它总是会重建所有 C 文件。那么如何做到这一点呢?
问问题
6857 次
1 回答
17
有很多方法。这取决于您使用的版本以及make
您使用的操作系统。
您绝对不能做的一件事是使用目录作为简单的先决条件。文件系统用于更新目录上修改时间的规则不适用于make
.
为了make
在 POSIX 系统上简单,您可以在规则中预先创建目录来执行编译:
obj/foo.o: foo.c
@ mdkir -p obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
如果你有 GNU make 你有两个选择。最简单的方法是在其他任何事情发生之前在读入 makefile 时强制创建目录,方法是添加如下一行:
_dummy := $(shell mkdir -p obj)
简单、快速、可靠。它唯一的缺点是该目录将始终被创建,即使它不是必需的。尽管如此,这是我通常这样做的方式。
如果你有一个足够新的 GNU make,最奇特的方法是使用 order-only 先决条件:
obj/foo.o: foo.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
obj:
mkdir -p $@
这会强制obj
目标在目标之前构建obj/foo.o
,但obj
在确定是否过期时忽略obj/foo.o
时间戳。
于 2013-05-02T19:37:01.687 回答