Makefile——多个配方调用一个,带有变量——只有第一个运行



我已经像下面这样设置了我的makefile,以最大限度地减少代码重复

配方是一组设置变量的块,然后运行sleeper_agent配方。例如,当单独称为make xlsx_sleeper时,它们工作得很好。

但是当我调用all_sleepers时,只有第一个(xlsx_sleer(被编译。

我试着把它们声明为假的(.PHONY: all_sleepers xlsx_sleeper docx_sleeper pptx_sleeper pdf_sleeper png_sleeper(,这对没有任何改变

并将.FORCE规则添加到sleeper_agent规则中,这将导致没有这样的文件或目录:

.FORCE:
sleeper_agent: .FORCE [...]

这是我的makefile:

all_sleepers: xlsx_sleeper docx_sleeper pptx_sleeper png_sleeper pdf_sleeper
sleeper_agent: $(OBJ)/sleeper_agent.o $(OBJ)/identities.o
windres icons/$(ext)/resource.rc -O coff -o obj/$(ext).res
$(CC) -o $(BIN)/sleeper_$(ext).exe $^ $(OBJ)/$(ext).res $(CFLAGS) $(LIBS)
xlsx_sleeper: ext=xlsx
xlsx_sleeper: sleeper_agent
docx_sleeper: ext=docx
docx_sleeper: sleeper_agent
pptx_sleeper: ext=pptx
pptx_sleeper: sleeper_agent
png_sleeper: ext=png
png_sleeper: sleeper_agent
pdf_sleeper: ext=pdf
pdf_sleeper: sleeper_agent

您的问题是make看不出有任何理由多次重建sleeper_agent目标。你可能应该坚持制造理念:

  1. 尝试将真实文件作为目标($(BIN)/sleeper_xlsx.exe(
  2. 仅使用虚假(非文件(目标:
    • 为其他目标或目标组(all_sleepersxlsx_sleeper…(提供符号名称
    • 对于不生成文件的规则(cleanhelp…(
  3. 如此声明虚假目标(.PHONY: ...(

使用静态模式规则、自动变量和patsubstmake函数的示例:

SLEEPER  := xlsx docx pptx png pdf
EXE      := $(patsubst %,$(BIN)/sleeper_%.exe,$(SLEEPER))
SHORT    := $(patsubst %,%_sleeper,$(SLEEPER))
.PHONY: all_sleepers $(SHORT) clean_sleepers
all_sleepers: $(EXE)
$(SHORT): %_sleeper: $(BIN)/sleeper_%.exe
$(EXE): $(BIN)/sleeper_%.exe: $(OBJ)/sleeper_agent.o $(OBJ)/identities.o
windres icons/$*/resource.rc -O coff -o obj/$*.res
$(CC) -o $@ $^ $(OBJ)/$*.res $(CFLAGS) $(LIBS)
clean_sleepers:
rm -f $(EXE)

然后你应该能够运行:

make all_sleepers

构建全部或:

make xlsx_sleeper

只建造其中一个。EXE是真实可执行文件的列表,静态模式规则解释了如何构建它们。在其配方中,$*自动变量扩展为与%通配符匹配的字符串。SHORTxxxx_sleeper快捷方式的列表,另一个静态模式规则为每个快捷方式解释它对应的实际可执行文件。CCD_ 17和CCD_ 18快捷方式(加上我作为示例添加的CCD_。

相关内容

最新更新