Написание make-файла для использования -D_GLIBCXX_DEBUG в отладочной сборке - PullRequest
1 голос
/ 10 декабря 2011

У меня есть make-файл, который можно уменьшить до этого:

OBJS = obj1.o obj2.o

FLAGS = -Wall -Wextra -Werror -pedantic-errors -fno-rtti -std=c++0x
DEBUG_FLAGS = -ggdb -O0 -fstack-protector-all -D_GLIBCXX_DEBUG
RELEASE_FLAGS = -O3

release: $(OBJS)
    g++ $(FLAGS) $(RELEASE_FLAGS) $(OBJS)

debug: $(OBJS)
    g++ $(FLAGS) $(DEBUG_FLAGS) $(OBJS)

obj1.o: obj1.cpp
    g++ -c $(FLAGS) obj1.cpp

obj2.o: obj2.cpp
    g++ -c $(FLAGS) obj2.cpp

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

obj1_release.o: obj1.cpp
    g++ -c $(FLAGS) $(RELEASE_FLAGS) obj1.cpp

obj1_debug.o: obj1.cpp
    g++ -c $(FLAGS) $(DEBUG_FLAGS) obj1.cpp

Как сделать так, чтобы флаг -D_GLIBCXX_DEBUG (и другие флаги отладки) вступали в силу для всех модулей компиляции, только когда пользователь вводит make debug без записи двух записей для каждого CU? (И наоборот; флаги выпуска должны вступать в силу на всех CU, когда пользователь вводит make release.)

Я прошу прощения, если это основы написания Make-файлов, я не знаю много о них.

Ответы [ 3 ]

4 голосов
/ 10 декабря 2011

Вы ищете шаблон правил : что-то вроде этого должно делать то, что вы хотите. Обратите внимание, что нельзя заставить работать правильно, если отладочная и выпускная версии программы не имеют разных имен.

OBJS   := obj1 obj2 obj3
R_OBJS := $(OBJS:=_r.o)
D_OBJS := $(OBJS:=_d.o)

all: prog_r prog_d
release: prog_r
debug: prog_d

prog_r: $(R_OBJS)
    $(CXX) $(CXXFLAGS) $(RELEASE_FLAGS) $(LDFLAGS) $^ $(LIBS) -o $@

prog_d: $(D_OBJS)
    $(CXX) $(CXXFLAGS) $(DEBUG_FLAGS) $(LDFLAGS) $^ $(LIBS) -o $@

%_r.o: %.cc
    $(CXX) $(CXXFLAGS) $(RELEASE_FLAGS) -c $< -o $@

%_d.o: %.cc
    $(CXX) $(CXXFLAGS) $(DEBUG_FLAGS) -c $< -o $@

# header files
obj1_d.o obj1_r.o: foo.h bar.h
obj2_d.o obj2_r.o: quux.h
# ... etc ...
1 голос
/ 10 декабря 2011

Существует довольно простой способ для выбора флагов компиляции в зависимости от типа сборки в Makefiles.

Кроме того, вы можете убедиться, что отладочная сборка связывает только объектные файлы отладки и то же самое для выпуска (т. Е. Не смешивать объектные файлы отладки и выпуска). Для достижения этого объекта компиляции в разные каталоги в зависимости от типа сборки.

0 голосов
/ 10 декабря 2011

Это может помочь: http://sunsite.ualberta.ca/Documentation/Gnu/make-3.79/html_chapter/make_7.html

Вы можете проверить первый аргумент (отладка / выпуск) и соответственно установить CFLAGS.

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...