Makefile。规则取决于目标目录

问题描述 投票:0回答:1

我试图创建一个Makefile,根据源文件在目录中创建对象文件。例如,我有 DirA/file.cDirB/file.c 我想创建一个配方,以建立 DirA/file.oDirB/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_filesb_files 独立

c makefile
1个回答
1
投票

你不能很容易地组合模式规则。但这种情况是 定义的食谱 是为。

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)

0
投票

相关信息:

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!
© www.soinside.com 2019 - 2024. All rights reserved.