【问题标题】:GNU Make | Can target and prerequisites of rule be changed at execution time?GNU 制作 |可以在执行时更改规则的目标和先决条件吗?
【发布时间】:2021-02-17 05:59:23
【问题描述】:

我在 make 中使用特定于目标的变量值,它们没问题,但它没有应用于目标和先决条件,只是在配方中。这是 Makefile:

CXX := g++
TARGET := exec

BIN.PATH =

SOURCES := $(wildcard *.cpp)
OBJECTS.NAME := $(patsubst %.cpp, %.o, $(SOURCES))
OBJECTS.PATH = $(addprefix $(BIN.PATH)/, $(OBJECTS.NAME))

debug: BIN.PATH = debug
debug: $(TARGET)

$(TARGET): $(OBJECTS.PATH)
    @echo $(BIN.PATH) # debug
    @echo $(OBJECTS.PATH) # debug/main.o
    @echo $^ # /main.o
    # ...

$(BIN.PATH)/%.o: %.cpp
    @echo $@ # /main.o
    # ...

任何想法如何解决它?还是不可能?

【问题讨论】:

  • 不清楚你在问什么。您希望 ${OBJECTS.PATH) 的值因目标而异?
  • @tripleee 是的,这就是我想要的
  • edit您的问题更详细地解释您希望在那里发生的事情。无论如何,这是一个相当常见的常见问题解答;你问之前有没有寻找解决方案?没有简单的方法可以使变量不具有您在 Makefile 顶部定义的值,但是有各种 hack 可能会或可能不会解决您的特定问题。

标签: makefile gnu-make


【解决方案1】:

不要通过将特定于目标的变量添加到依赖项来重用目标。只会构建给定目标$(TARGET) 的一个变体。这使其具有不确定性。通常,特定于目标的变量是considered harmful

The manual:

请注意,给定的先决条件最多只能在每次调用 make 时构建一次。如果同一个文件是多个目标的先决条件,并且每个目标对于同一个目标特定变量具有不同的值,那么要构建的第一个目标将导致构建该先决条件,并且先决条件将继承目标-来自第一个目标的特定值。它将忽略来自任何其他目标的特定于目标的值。

回答标题问题,我知道的一种方法是通过宏的可读性。这里我们更改目标、依赖项和输出目录:

define build_rule
$1: $2
     $(CC) $< -o $3/$@
endef

$(eval $(call build_rule z.o,z.c,objs.debug))

这样的宏几乎无法支持,并且会变成非常糟糕的代码。

使用模式规则可以更好地解决这个问题,但您不能在那里设置任意依赖项。如果您提供您需要实现的目标的示例,您可以获得示例解决方案。

【讨论】:

    【解决方案2】:

    您可能正在寻找secondary expansion

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 2014-09-22
      • 1970-01-01
      • 2014-02-02
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多