Добавьте дополнительные флаги сборки, когда я запускаю `make debug` - PullRequest
1 голос
/ 29 июня 2019

В моем случае я хочу сделать несколько отладочных сборок, чтобы иметь возможность запускать 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 Ответ

1 голос
/ 04 июля 2019

Как было сказано в комментариях к вопросу, Процесс сборки здесь немного негигиеничен. Я рекомендую вам изменить его.

Как говорится, можно делать то, что вы хотите, тоже очень просто. Итак, в качестве экспозиции, эскиз:

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

build:
    : $@ flags: ${flags}

debug: build
    : $@ done

Здесь у нас есть целевая переменная flags. flags обычно normal. Тем не мение, при построении debug или любой из его зависимостей становится overridden.

build использует $flags неудивительно:

$ make build
: build flags: normal

Удивительно, но значение, используемое при построении build через debug, является целевым значением для debug:

$ make debug
: build flags: overridden
: debug done

Рекомендации

НЕ ДЕЛАЙТЕ ЭТОГО с вашим оригинальным make-файлом. Если ты это сделаешь, твоя жизнь станет несчастной. Рассмотрим:

  1. make build
  2. редактировать
  3. make debug

В итоге вы получите своего рода Frankenbuild - монстра, построенного из битов Если вам не повезло, это может даже ссылка.

Ваша единственная гарантия успеха - чистая сборка каждый раз. Классический признак ужасного make-файла.

...