如何修改makefile以将已更改的源编译到对象目录中,但文件列表除外

时间:2017-09-12 15:48:32

标签: c makefile

我继承了一个使用GNU Make 3.81的makefile。它过于复杂,恕我直言,因为它不使用模式。此外,它在需要时不会自动创建目标文件目录。我查看了几个示例并阅读了GNU makefile手册,但仍未看到一些应该简单的内容。似乎有很多方法建议,但不清楚使用什么。我有大约60个c文件需要编译到名为obj的目录中。但是,我不想要6个主要的'测试程序。程序编译到该目录中。它们位于名为OTHERSRCS的列表中。如果这些文件发生任何变化,我希望将c文件减去编译成obj的OTHERSRCS。另外,如果obj目录不存在,我想创建它。 ' make clean'应删除该目录。我已经在Java中使用了ANT并且可以使依赖项工作,但是我没有成功使用这个makefile。一个简单的例子可能会有用,它会使用某种排除以及c文件的模式。

2 个答案:

答案 0 :(得分:2)

在这个简单的例子中,当前目录中的C源文件 是foo.cbar.catest.canothertest.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 Prerequisites8.2 Functions for String Substitution and Analysisthe manual。在这个例子中,不需要为程序atestanothertest编写配方,因为它们是由GNU make的默认规则正确构建的。

如果要重新编写继承的makefile,请考虑合理化源树,例如:至少没有与应用程序源在同一目录中的测试源。

答案 1 :(得分:1)

这是my Makefile

这应该让你去。我试着尽可能地描述。

编辑: 要排除.c文件,您可以更改:

SRC     =   $(shell find $(SRC_DIR) -name '*.c')

SRC     =   $(shell find $(SRC_DIR) -name '*.c' ! -iname 'myFile.c')