如何根据构建类型更改编译标志,同时在 Makefile 中保持构建配方相同

问题描述 投票:0回答:1

我有一个在我的 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 gnu-make
1个回答
0
投票

我的 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)
© www.soinside.com 2019 - 2024. All rights reserved.