Makefile 制作具有动态依赖关系的通用Make目标

Makefile 制作具有动态依赖关系的通用Make目标,makefile,build,gnu-make,Makefile,Build,Gnu Make,我需要生成几个具有不同加载地址的对象文件。我还有一个make目标,用于调用objdump,以显示相应的反汇编 code0: gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE0_RELOC) $@.S -o $@.o objcopy -O binary $@.o --only-section=.text $@.bin code1: gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE1

我需要生成几个具有不同加载地址的对象文件。我还有一个make目标,用于调用
objdump
,以显示相应的反汇编

code0:
    gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE0_RELOC) $@.S -o $@.o
    objcopy -O binary $@.o --only-section=.text $@.bin

code1:
    gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE1_RELOC) $@.S -o $@.o
    objcopy -O binary $@.o --only-section=.text $@.bin

dump: dump_code0 dump_code1
dump_code0: code0.bin
    objdump $< -D > $<.decomp

dump_code1: code1.bin
    objdump $< -D > $<.decomp
其逻辑是,依赖项(如
code0.bin
)将导致此目标以单个有效依赖项
code0
执行,以首先构建对象文件

我可能误解了
%
字符如何用于通配符生成目标。
basename
的第一次使用评估为空(第二次有效),因此目标没有依赖关系。在调用时对依赖关系树进行一次评估是有意义的,但我希望有一个更动态的功能


这可以做成吗

您正在寻找的可能是您可以重新尝试的:

code0:
    gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE0_RELOC) $@.S -o $@.o
    objcopy -O binary $@.o --only-section=.text $@.bin
作为:

第一个makefile的最后一部分还可以使用静态模式规则,以及虚假目标。比如:

.PHONY: dump dump_code0 dump_code1

dump: dump_code0 dump_code1

dump_code0 dump_code1: dump_%: %.bin.decomp

code0.bin.decomp code1.bin.decomp: %.bin.decomp: %.bin
    objdump $< -D > $@
(假设您的计算机上有大约8个内核),您可以期望8的加速系数。如果您只有两个源文件,则不会有太多,但如果您有数百个源文件,则会非常有趣

code0.o code1.o: code%.o: code%.S
    gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE$*_RELOC) $< -o $@

code0.bin code1.bin: %.bin: %.o
    objcopy -O binary $< --only-section=.text $@
# Default code reloc option
CODE_RELOC := default_code_reloc_option

# code1-specific code reloc option, if different from default
code1.o: CODE_RELOC := code1_code_reloc_option

code0.o code1.o: %.o: %.S
    gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE_RELOC) $< -o $@
.PHONY: dump dump_code0 dump_code1

dump: dump_code0 dump_code1

dump_code0 dump_code1: dump_%: %.bin.decomp

code0.bin.decomp code1.bin.decomp: %.bin.decomp: %.bin
    objdump $< -D > $@
CODES   := $(wildcard *.S)
OBJS    := $(patsubst %.S,%.o,$(CODES))
BINS    := $(patsubst %.S,%.bin,$(CODES))
DECS    := $(patsubst %.S,%.bin.decomp,$(CODES))
DUMPS   := $(patsubst %.S,dump_%,$(CODES))

# Default code reloc option
CODE_RELOC := default_code_reloc_option

# code1-specific code reloc option, if different from default
code1.o: CODE_RELOC := code1_code_reloc_option

.PHONY: dump $(DUMPS)

dump: $(DUMPS)

$(DUMPS): dump_%: %.bin.decomp

$(DECS): %.bin.decomp: %.bin
    objdump $< -D > $@

$(BINS): %.bin: %.o
    objcopy -O binary $< --only-section=.text $@

$(OBJS): %.o: %.S
    gcc -m32 $(CFLAGS) -Wl,$(LDFLAGS),-Ttext=$(CODE_RELOC) $< -o $@

.PHONY: clean

clean:
    rm -f $(OBJS) $(BINS) $(DECS)
make -j 8