gpt4 book ai didi

makefile - 是否可以在 Makefile 的同一个目标中有多个先决条件模式?

转载 作者:行者123 更新时间:2023-12-02 00:59:02 25 4
gpt4 key购买 nike

我有两个这样的目标

$(OBJ1): $(BUILDDIR)/%.o: $(BUILDROOT)/proto/a/%.pb.cc

$(OBJ2): $(BUILDDIR)/%.o: $(BUILDROOT)/proto/a/b/%.pb.cc

是否有可能以某种方式将这两个组合到同一个目标中?

最佳答案

这是可能的,但您需要高级制作功能(宏):

SRC := $(shell find $(BUILDROOT)/proto -type f -name '*.cc')
OBJ := $(addprefix $(BUILDDIR)/,$(patsubst %.cc,%.o,$(notdir $(SRC))))

compile: $(OBJ)

# $(1) is the cc source file
define MY_rule
$$(BUILDDIR)/$$(patsubst %.cc,%.o,$$(notdir $(1))): $(1)
$$(CXX) -c $$(CXXFLAGS) -o $$@ $$<
endef
$(foreach f,$(SRC),$(eval $(call MY_rule,$(f))))

演示:

$ ls -R proto
proto:
dira

proto/dira:
a.cc dirb

proto/dira/dirb:
b.cc
$ make BUILDROOT=. BUILDDIR=build compile
g++ -c -o build/a.o proto/dira/a.cc
g++ -c -o build/b.o proto/dira/dirb/b.cc

请看section about the eval functionGNU make manual以获得完整的解释。

晚更新:关于您的另一个(现已删除)类似问题的评论建议使用 vpath指示。这也很棘手,并添加了一个重要的约束,即所有源文件必须具有不同的基本名称。为了完整起见,假设满足约束,这里是另一个 vpath基于解决方案:

vpath <pattern> dira dirb dirc:...

告诉 make 在搜索匹配 <pattern> 的文件时,它必须探索列出的目录。所以,让我们:

  1. 计算所有源文件和相应目标文件的基本名称:

    SRC := $(notdir $(shell find $(BUILDROOT)/proto -type f -name '*.cc'))
    OBJ := $(addprefix $(BUILDDIR)/,$(patsubst %.cc,%.o,$(SRC)))
  2. 获取$(BUILDROOT)/proto中所有目录的列表:

    DIR := $(shell find $(BUILDROOT)/proto -type d)
  3. 现在,我们准备使用 vpath指令:

    vpath %.cc $(DIR)

就是这样。总而言之,以下应该有效:

SRC   := $(notdir $(shell find $(BUILDROOT)/proto -type f -name '*.cc'))
DIR := $(shell find $(BUILDROOT)/proto -type d)
OBJ := $(addprefix $(BUILDDIR)/,$(patsubst %.cc,%.o,$(SRC)))

vpath %.cc $(DIR)

compile: $(OBJ)

$(BUILDDIR)/%.o: %.cc
$(CXX) -c $(CXXFLAGS) -o $@ $<

关于makefile - 是否可以在 Makefile 的同一个目标中有多个先决条件模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51999226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com