Простой make-файл с выпусками и отладочными сборками - Лучшие практики - PullRequest
23 голосов
/ 27 апреля 2009

Я новичок в makefiles. Я научился создавать make-файлы и другие связанные с ними концепции из книги «Управление проектами с помощью GNU make». Makefile готов, и мне нужно убедиться, что созданный мной файл в порядке. Вот make-файл

#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 $@

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

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

Вопросы

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

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

Ответы [ 3 ]

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

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

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 голосов
/ 30 апреля 2009

Я бы взял совет Артема по поводу флагов и использовал бы -O.

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

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

...