想象一下,我有两个源文件都包含一个头文件。 交流转换器:
#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
答案 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