我继承了一个使用GNU Make 3.81的makefile。它过于复杂,恕我直言,因为它不使用模式。此外,它在需要时不会自动创建目标文件目录。我查看了几个示例并阅读了GNU makefile手册,但仍未看到一些应该简单的内容。似乎有很多方法建议,但不清楚使用什么。我有大约60个c文件需要编译到名为obj的目录中。但是,我不想要6个主要的'测试程序。程序编译到该目录中。它们位于名为OTHERSRCS的列表中。如果这些文件发生任何变化,我希望将c文件减去编译成obj的OTHERSRCS。另外,如果obj目录不存在,我想创建它。 ' make clean'应删除该目录。我已经在Java中使用了ANT并且可以使依赖项工作,但是我没有成功使用这个makefile。一个简单的例子可能会有用,它会使用某种排除以及c文件的模式。
答案 0 :(得分:2)
在这个简单的例子中,当前目录中的C源文件
是foo.c
,bar.c
,atest.c
,anothertest.c
。我们有:
OTHERSRCS := atest.c anothertest.c
每个$(OTHERSRCS)
都要分开编译并链接到
当前目录中的程序。所有剩余的C源文件,无论如何
将被编译到目录obj
中,这将是
在需要时创建,并将生成的对象文件全部链接到
一个程序foobar
。
<强>生成文件强>
ALLSRCS := $(wildcard *.c)
OTHERSRCS := atest.c anothertest.c
foobar_SRCS := $(filter-out $(OTHERSRCS),$(ALLSRCS))
foobar_OBJS := $(addprefix obj/,$(foobar_SRCS:.c=.o))
PROGS := foobar atest anothertest
.PHONY: all clean
all : $(PROGS)
obj/%.o: %.c | obj
$(COMPILE.c) $< -o $@
obj:
mkdir -p $@
foobar: $(foobar_OBJS)
$(LINK.o) -o $@ $^ $(LDLIBS)
clean:
rm -fr $(PROGS) obj
默认make
的运行方式如下:
$ make
mkdir -p obj
cc -c foobar.c -o obj/foobar.o
cc -c foo.c -o obj/foo.o
cc -c bar.c -o obj/bar.o
cc -o foobar obj/foobar.o obj/foo.o obj/bar.o
cc atest.c -o atest
cc anothertest.c -o anothertest
当然make foobar
就像前5行一样。
要了解关键细节,请参阅4.3 Types of Prerequisites
和8.2 Functions for String Substitution and Analysis
在the manual。在这个例子中,不需要为程序atest
和anothertest
编写配方,因为它们是由GNU make的默认规则正确构建的。
如果要重新编写继承的makefile,请考虑合理化源树,例如:至少没有与应用程序源在同一目录中的测试源。
答案 1 :(得分:1)
这应该让你去。我试着尽可能地描述。
编辑: 要排除.c文件,您可以更改:
SRC = $(shell find $(SRC_DIR) -name '*.c')
到
SRC = $(shell find $(SRC_DIR) -name '*.c' ! -iname 'myFile.c')