Сборка программы с разными параметрами компиляции
Часто возникает необходимость в получении нескольких вариантов программы, которые были скомпилированы по-разному. Типичный пример - отладочная и рабочая версии программы. В таких случаях я использую простую методику:
- Все варианты программы собираются с помощью одного и того же make-файла.
- Необходимые настройки компилятора "попадают" в make-файл через параметры, передаваемые программе make в командной строке.
Для каждой конфигурации программы я делаю маленький командный файл, который вызывает
make с нужными параметрами:
- example_5-multiconfig /
- main.cpp
- main.h
- Editor /
- TextLine /
- Makefile
- make_debug
- make_release
Файлы make_debug и make_release - это командные файлы, используемые для сборки соответственно отладочной и рабочей версий программы. Вот, например, как выглядит командный файл make_release:
make compile_flags="-O3 -funroll-loops -fomit-frame-pointer"
Обратите внимание, что строка со значением переменной compile_flags заключена в кавычки, так как она содержит пробелы. Командный файл make_debug выглядит аналогично:
make compile_flags="-O0 -g"
Вот как выглядит Makefile для этого примера:
# # example_5-multiconfig/Makefile # # Пример получения нескольких версий программы с помощью одного make-файла #
source_dirs := . Editor TextLine
search_wildcards := $(addsuffix /*.cpp,$(source_dirs)) override compile_flags += -pipe
iEdit: $(notdir $(patsubst %.cpp,%.o,$(wildcard $(search_wildcards)))) gcc $^ -o $@
VPATH := $(source_dirs)
%.o: %.cpp gcc -c -MD $(addprefix -I,$(source_dirs)) $(compile_flags) $<
include $(wildcard *.d)
Переменная compile_flags получает свое значение из командной строки и, далее, используется при компиляции исходных текстов. Для ускорения работы компилятора, к параметрам компиляции добавляется флажок -pipe. Обратите внимание на необходимость использования директивы override для изменения переменной compile_flags внутри make-файла.