是否可以从目标部分更新 makefile 变量?

Is it possible to update a makefile variable from within a target section?

我有一个简单的 Makefile,它是这样的

CXX = g++
CXXFLAGS = -std=c++17 ...
...
all : $(TARGETS)

% : src/%.cpp $(SRCFILES)
    $(CXX) $(CXXFLAGS) $(MACROS) $(INCLUDES) $^ $(LDLIBS) -o $@

我想添加一个 profile 目标,在调用时将 -pg 选项添加到 CXXFLAGS 变量,然后调用所有目标。

我试过了

profile:
    CXXFLAGS += -pg
    all

但这不起作用并给出错误:

$ make profile
CXXFLAGS += -pg
make: CXXFLAGS: Command not found

如您所见,语法无法正常工作。食谱不是 makefile 命令,它们是 shell 脚本并且在 shell.

中是 运行

为此您应该使用 target-specific variables

profile: CXXFLAGS += -pg
profile: all

我应该指出,虽然这看起来很有用,但并不总是那么方便。如果你想用不同的标志构建相同的目标(例如,.o 文件),你必须小心总是在构建之间手动 运行 clean 否则你会得到一个大杂烩以不同方式构建的对象数。

通常在与此人相处一段时间后,他们决定他们真正想做的是将不同类型的目标构建到不同的目录中,这样他们就不会混淆。一旦你这样做了,你就需要不同的规则,然后你还不如把额外的标志放在那里。但是,特定于目标的变量在某些情况下仍然很方便。