makefile在一次调用中编译多个源文件

时间:2013-06-19 21:44:00

标签: makefile gnu-make

想象一下,我有两个源文件都包含一个头文件。 交流转换器:

#include "ab.h"

int a() {
    return RETURN_VAL;
}

b.c:

#include "ab.h"

int b() {
    return !RETURN_VAL;
}

ab.h:

#define RETURN_VAL (0)

我想要一个可以在一个调用a.c和b.c中编译的makefile。如果ab.h是new或者a.c和b.c都是新的,那么我想: gcc -c a.c b.c 触摸ab.timestamp 否则我只想重新编译过时的文件。

这是一个很小的例子,我需要一些可扩展的东西。我试图解决这个问题,但我无法弄清楚如何解决这个问题。

这是使用C的示例,但我实际用于编译大型HDL项目。由于HDL编译器的调用具有很高的开销,因此对于许多文件而不是单独为每个文件调用该工具要好得多。

我尝试的是:

a.c: ab.h ;
b.c: ab.h ;

ab.timestamp: a.c b.c
  gcc -c $?
  touch ab.timestamp

这不起作用,而是我需要这样的东西:

ab.timestamp: a.c b.c ab.h
  gcc -c a.c b.c
  touch ab.timestamp

这是我不想要的。我想要$?指示我需要重新编译的正确文件。我知道我可以使用$(if和$(过滤函数来解决这个问题,但我希望能有更多的东西。

我正在使用GNU Make。

谢谢, Nachum

2 个答案:

答案 0 :(得分:1)

这是一个技巧,但它可能有效:

all: ab.timestamp

SOURCES = a.c b.c ab.h
a.o: a.c ab.h
b.o: b.c ab.h

CHANGED :=
%.o: %.c ; $(eval CHANGED += $<)

ab.timestamp: $(SOURCES) $(patsubst %.c,%.o,$(filter %.c,$(SOURCES)))
        gcc -c $(CHANGED)
        touch $@

答案 1 :(得分:0)

这是一个kludge,但它似乎工作。触摸源文件,使其与标题保持同步:

a.c b.c: ab.h
    @touch $@

ab.timestamp: a.c b.c
    gcc -c $?
    touch ab.timestamp