使用make实现以下目标的最佳方法是什么:
$PRJ/lib/foo.c
$PRJ/app/bar.c
$PRJ/app/baz.c
$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 $@ $<
答案 0 :(得分:3)
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 $@ $<