Makefile 如果需要,如何创建目录?
我试图使用makefile,我的问题是我有一个目录,有一个Makefile 如果需要,如何创建目录?,makefile,Makefile,我试图使用makefile,我的问题是我有一个目录,有一个src目录和一个makefile。我还使用一个tmp目录来创建我必须创建的内容。 它包含对象文件。为了提高性能,我在调试时尽量不删除这些。 如果我为tmp创建一个规则来创建它,它总是重建所有的C文件。 那么如何做到这一点呢?有很多方法。这取决于您使用的make版本以及您使用的操作系统 您永远不能做的一件事是使用目录作为简单的先决条件。文件系统用于更新目录上修改时间的规则与make不兼容 对于POSIX系统上的simplemake,您可以在
src
目录和一个makefile
。我还使用一个tmp
目录来创建我必须创建的内容。
它包含对象文件。为了提高性能,我在调试时尽量不删除这些。
如果我为tmp创建一个规则来创建它,它总是重建所有的C文件。
那么如何做到这一点呢?有很多方法。这取决于您使用的
make
版本以及您使用的操作系统
您永远不能做的一件事是使用目录作为简单的先决条件。文件系统用于更新目录上修改时间的规则与make
不兼容
对于POSIX系统上的simplemake
,您可以在规则中预先创建目录以执行编译:
obj/foo.o: foo.c
@ mdkir -p obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
该方法简单、快速、可靠。它唯一的缺点是,即使不需要,也会始终创建目录。然而,这是我通常的做法
如果您有一个足够新的GNU make,最奇特的方法是使用仅限订单的先决条件:
obj/foo.o: foo.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
obj:
mkdir -p $@
obj/foo.o:foo.c | obj
$(CC)$(CPPFLAGS)$(CFLAGS)-c-o$@$<
obj:
mkdir-p$@
这迫使
obj
目标在obj/foo.o
目标之前构建,但在确定obj/foo.o
是否过期时,obj
上的时间戳将被忽略。是否有可能重复的方法,而无需GNU进行扩展?(问题被标记为Makefile
,而不是GNUmakefile
)。不,在编写与POSIX兼容的Makefile时,无法将目录作为先决条件(使其行为符合要求)。您唯一能做的就是重写所有规则,以便在它们尝试使用可能不存在的目录之前添加显式的mkdir-p
,而不是使用先决条件或制定规则来构建目录。
obj/foo.o: foo.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
obj:
mkdir -p $@