我试图创建一个Makefile,根据源文件在目录中创建对象文件。例如,我有 DirA/file.c
和 DirB/file.c
我想创建一个配方,以建立 DirA/file.o
和 DirB/file.o
.
rootdir/
|-- Makefile
|-- DirA
| |-- source.c
| +-- source.o
+-- DirB
|-- file.c
+-- file.o
我想配方应该和下面的类似。
MAKEFLAGS += --no-builtin-rules
DirA_Files=$(wildcard DirA/*.c)
DirB_Files=$(wildcard DirB/*.c)
.PHONY: all a_files b_files
all: a_files b_files
@echo Done with all!
@echo built $(patsubst %.c,%.o,$(DirA_Files)) $(patsubst %.c,%.o,$(DirB_Files))
a_files: $(patsubst %.c,%.o,$(DirA_Files))
b_files: $(patsubst %.c,%.o,$(DirB_Files))
DirA/%.o DirB/%.o : DirA/%.c DirB/%.c
# Complex recipe that I'd rather not state twice in the Makefile
@echo "Building $@ because $? changed"
@touch $@
但我不想把对象文件放在 DirA
的源文件为依托。DirB
这就是上述配方的含义。
我也试过
DirA/%.o : DirA/%.c
DirB/%.o : DirB/%.c
DirA/%.o DirB/%.o :
# Complex recipe that I'd rather not state twice in the Makefile
@echo "Building $@ because $? changed"
@touch $@
但后来 $?
变量总是空白。
我如何才能创建一个单一的配方,使我也能建立 a_files
和 b_files
独立
你不能很容易地组合模式规则。但这种情况是 定义的食谱 是为。
define complex-rule
# Complex recipe that I'd rather not state twice in the Makefile
@echo "Building $@ because $? changed"
@touch $@
endef
DirA/%.o : DirA/%.c
$(complex-rule)
DirB/%.o : DirB/%.c
$(complex-rule)
相关信息:
DirA_Files := $(wildcard DirA/*.c)
DirB_Files := $(wildcard DirB/*.c)
$(info DirA_Files: $(DirA_Files))
$(info DirB_Files: $(DirB_Files))
aobj := $(patsubst %.c,%.o,$(DirA_Files))
bobj := $(patsubst %.c,%.o,$(DirB_Files))
$(info aobj: $(aobj))
$(info bobj: $(bobj))
all: $(aobj) $(bobj)
@echo Done with all!