使用静态模式规则的多个目标的一个配方?

时间:2016-10-19 15:02:53

标签: makefile gnu-make

使用make实现以下目标的最佳方法是什么:

输入文件

$PRJ/lib/foo.c
$PRJ/app/bar.c
$PRJ/app/baz.c

输出文件应为(使用GCC):

$PRJ/obj/foo.o
$PRJ/obj/bar.o
$PRJ/obj/baz.o

请注意输入的c文件不在同一个文件夹中,我想自动收集输入文件。

此处的示例(使用静态模式规则)仅在c文件全部位于同一文件夹中时才有效,但这对于上述情况有何用处?

SOURCES  = $(shell find $(PRJ)/app -type f -name *.c)
OBJECTS  = $(patsubst $(PRJ)/app/%, $(PRJ)/obj/%, $(SOURCES:.c=.o))

.PHONY: build
build: $(OBJECTS)

$(OBJECTS): $(PRJ)/obj/%.o: $(PRJ)/app/%.c)
    $(CC) $(CFLAGS) -c -o $@ $<

1 个答案:

答案 0 :(得分:3)

使用the vpath directive

SOURCES := $(shell find $(PRJ) -type f -name "*.c")
# $(PRJ)/lib/foo.c $(PRJ)/app/bar.c $(PRJ)/app/baz.c

SOURCE_DIRS := $(sort $(dir $(SOURCES)))
# $(PRJ)/app/ $(PRJ)/lib/

OBJECTS := $(patsubst %.c,$(PRJ)/obj/%.o, $(notdir $(SOURCES)))
# $(PRJ)/obj/foo.o $(PRJ)/obj/bar.o $(PRJ)/obj/baz.o

.PHONY: build
build: $(OBJECTS)

vpath %.c $(SOURCE_DIRS)

$(OBJECTS): $(PRJ)/obj/%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<