0

想象一下,我有 2 个源文件,它们都包含一个头文件。交流:

#include "ab.h"

int a() {
    return RETURN_VAL;
}

公元前:

#include "ab.h"

int b() {
    return !RETURN_VAL;
}

ab.h:

#define RETURN_VAL (0)

我想要一个可以在一次调用 ac 和 bc 中编译的 makefile文件。

这是一个小例子,我需要一些可以扩展的东西。我试图解决这个问题,但我不知道如何解决。

这是一个使用 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。

谢谢, 纳楚姆

4

2 回答 2

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 $@
于 2013-06-20T01:51:02.273 回答
0

这是一个kludge,但它似乎工作。触摸源文件以使它们与标题一起更新:

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

ab.timestamp: a.c b.c
    gcc -c $?
    touch ab.timestamp
于 2013-06-20T04:42:01.240 回答