我有一个在我的 Makefile 中构建目标的方法。我想要做的是根据用户选择
debug
构建还是 release
构建来更改编译器标志。为此,我尝试使用一个名为 FLAGS
的特定于目标的变量,当用户构建 debug
或 release
目标时,它会被适当地分配。但是,主目标配方无法查看 FLAGS
变量的值。
我的 Makefile 看起来像:
CXX = g++
CXX_FLAGS = -pedantic -Wall -Wextra
TARGET_FLAGS = $(CXX_FLAGS) -shared -fPIC
OPT_FLAGS = -Ofast -march=native
DBG_FLAGS = -g3 -Og -ggdb
SRC = $(wildcard ./src/*/impl.cpp)
INCLPATH = ./headers
OBJECTS = $(patsubst ./src/%/impl.cpp,./build/%.o,$(SRC))
TARGET = lfds.so
.PHONY: release
release: FLAGS = $(OPT_FLAGS) $(TARGET)
.PHONY: debug
debug: FLAGS = $(DBG_FLAGS) $(TARGET)
$(TARGET): $(OBJECTS)
echo "Hi $(FLAGS)"
$(CXX) -I$(INCLPATH) $(TARGET_FLAGS) $(FLAGS) $^ -o $@
./build/%.o: ./src/%/impl.cpp
echo "Hi $(FLAGS)"
$(CXX) -I$(INCLPATH) $(CXX_FLAGS) $(FLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -rf $(OBJECTS)
rm $(TARGET)
当我运行
make debug
和 make release
时,echo
命令打印出 Hi
,这告诉我变量 FLAGS
从未被赋值。有谁知道为什么会这样?请注意,我不想构建两个不同的targets
,一个用于debug
,一个用于release
,而是我想要一个目标,它根据用户的需求使用不同的标志构建。
我的 Makefile 有一个语法错误。根据 syntax,特定于目标的变量应设置在不同的行中,依赖项应在不同的行中指定。更新后的 Makefile 可以正常工作。这是更新版本:
CXX = g++
CXX_FLAGS = -pedantic -Wall -Wextra
TARGET_FLAGS = $(CXX_FLAGS) -shared -fPIC
OPT_FLAGS = -Ofast -march=native
DBG_FLAGS = -g3 -Og -ggdb
SRC = $(wildcard ./src/*/impl.cpp)
INCLPATH = ./headers
OBJECTS = $(patsubst ./src/%/impl.cpp,./build/%.o,$(SRC))
TARGET = lfds.so
.PHONY: release
release: FLAGS = $(OPT_FLAGS)
release: $(TARGET)
.PHONY: debug
debug: FLAGS=$(DBG_FLAGS)
debug: $(TARGET)
$(TARGET): $(OBJECTS)
@echo "Hi $(FLAGS)"
$(CXX) -I$(INCLPATH) $(TARGET_FLAGS) $(FLAGS) $^ -o $@
./build/%.o: ./src/%/impl.cpp
@echo "Hi $(FLAGS)"
$(CXX) -I$(INCLPATH) $(CXX_FLAGS) $(FLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -rf $(OBJECTS)
rm $(TARGET)