如果需要,如何创建目录?

rad*_*adl 7 makefile

我正在尝试使用makefile,我的问题是我有一个目录,一个src目录和一个Makefile.我还使用了一个tmp我也必须创建的目录.它有目标文件.为了性能,我尝试在调试时不删除它们.如果我为tmp创建一个规则来创建它,它总是会重建所有C文件.那怎么做?

Mad*_*ist 11

有很多方法.这取决于make您使用的是什么版本以及您正在使用的操作系统.

你必须做的一件事是使用一个目录作为一个简单的先决条件.文件系统用于更新目录上的修改时间的规则不能很好地使用make.

对于makePOSIX系统上的简单,您可以在规则中预先创建目录以执行编译:

obj/foo.o: foo.c
        @ mdkir -p obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)

如果你有GNU make,你有两个选择.最简单的方法就是在通过添加如下所示的行之前,在读取makefile之前强制创建目录.

_dummy := $(shell mkdir -p obj)
Run Code Online (Sandbox Code Playgroud)

简单,快速,可靠.它唯一的缺点是,即使不需要,也会始终创建目录.然而,这是我通常这样做的方式.

如果你有一个足够新的GNU make,那么最奇特的方法是使用仅限订单的先决条件:

obj/foo.o: foo.c | obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

obj:
        mkdir -p $@
Run Code Online (Sandbox Code Playgroud)

这会强制在obj目标之前构建obj/foo.o目标,obj在确定是否obj/foo.o过期时会忽略时间戳.