是否可以从目标部分更新 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
否则你会得到一个大杂烩以不同方式构建的对象数。
通常在与此人相处一段时间后,他们决定他们真正想做的是将不同类型的目标构建到不同的目录中,这样他们就不会混淆。一旦你这样做了,你就需要不同的规则,然后你还不如把额外的标志放在那里。但是,特定于目标的变量在某些情况下仍然很方便。
我有一个简单的 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
否则你会得到一个大杂烩以不同方式构建的对象数。
通常在与此人相处一段时间后,他们决定他们真正想做的是将不同类型的目标构建到不同的目录中,这样他们就不会混淆。一旦你这样做了,你就需要不同的规则,然后你还不如把额外的标志放在那里。但是,特定于目标的变量在某些情况下仍然很方便。