Подтвердить что ты не робот

Простой make файл с версиями выпуска и отладки - лучшие практики

Я новичок в make файлах. Я узнал о создании файла makefile и других связанных с ним концепциях из книги "Управление проектами с помощью GNU make". Теперь make файл готов, и мне нужно убедиться, что тот, который я создал, в порядке. Вот makefile

#Main makefile which does the build

#makedepend flags
DFLAGS = 

#Compiler flags
#if mode variable is empty, setting debug build mode
ifeq ($(mode),release)
   CFLAGS = -Wall
else
   mode = debug
   CFLAGS = -g -Wall
endif

CC = g++
PROG = fooexe

#each module will append the source files to here
SRC := main.cpp

#including the description
include bar/module.mk
include foo/module.mk

OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))

.PHONY:all
all: information fooexe

information:
ifneq ($(mode),release)
ifneq ($(mode),debug)
    @echo "Invalid build mode." 
    @echo "Please use 'make mode=release' or 'make mode=debug'"
    @exit 1
endif
endif
    @echo "Building on "$(mode)" mode"
    @echo ".........................."

#linking the program
fooexe: $(OBJ)
    $(CC) -o $(PROG) $(OBJ)

%.o:%.cpp
    $(CC) $(CFLAGS) -c $< -o [email protected]

depend:
    makedepend -- $(DFLAGS) -- $(SRC)

.PHONY:clean
clean:
    find . -name "*.o" | xargs rm -vf
    rm -vf fooexe

Вопросы

  • Вышеупомянутый makefile хорошо работает с выпусками и отладочными сборками. Но это в правильном формате? Или вы видите недостатки в этом?
  • Над makefile выполняет отладочную сборку по умолчанию при вызове с использованием make. Для создания релизов требуется make mode = release. Это правильный подход?
  • Правильны ли флаги компилятора debug и release для g++? Для отладки я использую -g -Wall и для выпуска, просто -Wall. Правильно ли это?

Любая помощь будет большой.

4b9b3361

Ответ 1

  • Это один разумный формат. Он привязан специально к GNU Make, но это относительно небольшая проблема, если вы решили использовать GNU Make на каждой платформе.
    • Если есть недостаток, вы можете связать объектные файлы, созданные в режиме отладки, для создания окончательной сборки.
    • Некоторые могут утверждать, что опция "mode = release" является нестандартной; они были бы правы, но нет стандартной альтернативы, о которой я знаю. Вам просто нужно знать, что ваша конвенция может не устраивать всех (но это не обязательно - она ​​просто подходит вам и вашим пользователям).
  • Построение сборки отладки по умолчанию, вероятно, разумно - и более разумно, чем создание сборки выпуска по умолчанию.
  • Отбрасывание флага -g для сборки выпуска не является плохим, но если ваш код когда-либо создает дамп ядра, проще сделать головку или хвост дампа ядра, если файл программы содержит информацию об отладке. Основная стоимость отладочной информации - это дополнительные разделы в файле программы, которые не нужно загружать в системную память - затраты времени исполнения малы.
    • Вам следует подумать, следует ли включать туда флаги оптимизации. С помощью набора инструментов GCC вы можете использовать как -g, так и -O. Сложнее отлаживать оптимизированный код, но он дает вам (часто значительные) преимущества производительности.

Ответ 2

Я бы предложил следующие режимы:

for debugger: -O0 -g -Wall
for development and internal release: -O2 -g -Wall
for release outside the company: -O2 -Wall

Обоснование:

  • Очень важно разработать и протестировать код в "режиме производства". Ты можешь найти что в некоторых случаях код, который работает без оптимизации, падает в оптимизированном режиме, потому что ошибки в вашем коде. (Поверьте мне, это случается очень часто). Так что используйте -O2
  • В большинстве случаев вы все еще можете хорошо отлаживать даже с оптимизированным кодом, поэтому добавьте -g. Однако, если это слишком сложно найти ошибку в таком режиме, вы можете скомпилировать для отладчика с помощью -O0
  • Только если у вас есть проблемы, включая отладочную информацию в коде, вы должны удалить -g. Это хорошая идея иметь -g для кода в рабочей среде, потому что если что-то сбой, вы можете получить гораздо больше информации.

Ответ 3

Я бы посоветовал Артему о флажках и использовал -O.

Мой главный совет - сделать режим выпуска "по умолчанию". Ни один пользователь вне вашей компании не узнает о вашем соглашении make mode=release, и 99,99% из них захотят, чтобы он был создан для выпуска.

Мне нравится, что у вас есть -Wall во всех режимах. Если вы хотите стать действительно педантичным... -Wall -std=c++98 -pedantic -Wextra -Wconversion - хорошее начало. -std = С++ 98 может не понадобиться, если вы привязаны к g++, но если у вас есть иллюзии о переносимости, вы этого захотите.