当我运行`make debug`时,将构建标志附加一个。

时间:2019-06-29 20:04:04

标签: makefile gnu-make

对于我来说,我想进行一些调试构建,以便能够在构建系统中运行gdb:

HOST ?=127.0.0.1
PORT ?=7070

CCFLAGS="-std=c++11"
CPP=g++ ${CCFLAGS}
CFLAGS_DBG=" -g -DDEBUG"
TEST_BUILD_PATH="./build/tests"
BUILD_PATH=./build/release
TESTS_SRC_PATH="./tests"
DEBUGER=gdb


# NORMAL TARGETS

build_commandParser: ./src/tools/command_parser.cpp ./src/tools/command_parser.h
    ${CPP} -Wall -g -c ./src/tools/command_parser.cpp -o ${BUILD_PATH}/command_parser.o

build_network: ./src/socket/network.cpp ./src/socket/network.h
    ${CPP} -Wall -g -c ./src/socket/network.cpp -o ${BUILD_PATH}/network.o

build_simpleCommand: ./src/socket/simple_command.cpp ./src/socket/simple_command.h
    ${CPP} -Wall -g -c ./src/socket/simple_command.cpp -o ${BUILD_PATH}/simple_command.o

build: build_simpleCommand build_commandParser build_network ./src/main.cpp
    ${CPP} -pthread -Wall -o ${BUILD_PATH}/server ${BUILD_PATH}/command_parser.o ${BUILD_PATH}/network.o ${BUILD_PATH}/simple_command.o ./src/main.cpp

run: build
    ${BUILD_PATH}/server -h ${HOST} -p ${PORT}

debug: build
    ${DEBUGER} --args ${BUILD_PATH}/server -h ${HOST} -p ${PORT}

clean:
    find ./build ! -name '.gitkeep' -type f -exec rm -f {} + && find ./tests ! -name *.h -type f -exec rm -f {} +

如您所见,我尝试统一CFLAGS_DBG变量以传递调试标志。但正如您所看到的那样,这样做是失败的:

g++ -pthread -Wall -std=c++11  -c ./src/socket/simple_command.cpp -o ./build/release/simple_command.o
g++ -pthread -Wall -std=c++11  -c ./src/tools/command_parser.cpp -o ./build/release/command_parser.o
g++ -pthread -Wall -std=c++11  -c ./src/socket/network.cpp -o ./build/release/network.o
g++ -pthread -Wall -std=c++11  -o ./build/release/server ./build/release/command_parser.o ./build/release/network.o ./build/release/simple_command.o ./src/main.cpp

我也尝试以下设置:

HOST ?=127.0.0.1
PORT ?=7070

CCFLAGS=-pthread -Wall -std=c++11
CCFLAGS_DBG=
CPP=g++
TESTGEN=cxxtestgen
TEST_BUILD_PATH="./build/tests"
BUILD_PATH=./build/release
TESTS_SRC_PATH="./tests"
DEBUGER=gdb

# NORMAL TARGETS

build_commandParser: ./src/tools/command_parser.cpp ./src/tools/command_parser.h
    ${CPP} ${CCFLAGS} ${CCFLAGS_DBG} -c ./src/tools/command_parser.cpp -o ${BUILD_PATH}/command_parser.o

build_network: ./src/socket/network.cpp ./src/socket/network.h
    ${CPP} ${CCFLAGS} ${CCFLAGS_DBG} -c ./src/socket/network.cpp -o ${BUILD_PATH}/network.o

build_simpleCommand: ./src/socket/simple_command.cpp ./src/socket/simple_command.h
    ${CPP} ${CCFLAGS} ${CCFLAGS_DBG} -c ./src/socket/simple_command.cpp -o ${BUILD_PATH}/simple_command.o

build: build_simpleCommand build_commandParser build_network ./src/main.cpp
    ${CPP} ${CCFLAGS} ${CCFLAGS_DBG} -o ${BUILD_PATH}/server ${BUILD_PATH}/command_parser.o ${BUILD_PATH}/network.o ${BUILD_PATH}/simple_command.o ./src/main.cpp

run: build
    ${BUILD_PATH}/server -h ${HOST} -p ${PORT}

.PHONY: debug-flags
debug-flags: CCFLAGS+=-g -DDEBUG

debug: debug-flags build
    ${DEBUGER} --args ${BUILD_PATH}/server -h ${HOST} -p ${PORT}

clean:
    find ./build ! -name '.gitkeep' -type f -exec rm -f {} + && find ./tests ! -name *.h -type f -exec rm -f {} +

我仍然得到上面的输出。因此,我希望在使用make debug进行构建时能够指定额外的标志并为链接器设置新标志。你有什么办法吗?

1 个答案:

答案 0 :(得分:1)

正如问题评论中所说, 这里的构建过程有点不卫生。 我建议您更改它。

话虽如此,也可以做您想做的事情,也很简单。 因此,通过阐述, 草图:

$ cat Makefile
flags := normal
debug: flags := overridden

build:
    : $@ flags: ${flags}

debug: build
    : $@ done

在这里,我们有一个目标特定的变量flagsflags通常是normal。 然而, 构建debug 或其任何依赖项时,它将变为overridden

build以一种毫不奇怪的方式使用$flags

$ make build
: build flags: normal

令人惊讶的是,通过build构建debug时使用的值是debug的目标特定值:

$ make debug
: build flags: overridden
: debug done

建议

请勿使用原始Makefile执行此操作。 如果你这样做,你的生活将变得痛苦。 考虑:

  1. make build
  2. 编辑
  3. make debug

您最终会得到某种Frankenbuild的东西-一个由碎片组成的怪物。 如果您不走运,它甚至可以链接。

您唯一成功的保证是每次进行一次干净的构建。 糟糕的Makefile的经典标志。