Подскажите, как в Makefile сделать анализ входных параметров. Нужно различать Debug и Release и в зависимости от значения устанавливать в CFLAGS -g или -O2.
-
2а что мешает сделать цель debug? и в ней выставлять. Тогда обычная сборка будет make, а отладочная - make debug. – KoVadim Dec 12 '12 at 17:30
-
Я так и пробую, но не получается установить флаг и запустить обычную сборку. Не подскажете, как это делается? – mikelsv Dec 12 '12 at 18:03
-
"Огласите весь список". Опубликуйте свой Makefile. – alexlz Dec 13 '12 at 01:53
-
@alexlz, не вижу смысла публиковать свой. Его без файлов проекта не особо то потестируешь. Мне нужен самый простой пример, как реагировать на параметры и менять значения переменных. – mikelsv Dec 13 '12 at 08:12
2 Answers
Пусть у нас есть готовый makefile, и нам нужно прикрутить к нему возможность собирать спецбилды.
В любом, нормальном Makefile есть цель all, которая исторически принята целью по умолчанию. (По факту, цель по умолчанию - самая первая).
Теперь пример
# это переменная, которая будет менять значение
# в зависимости от цели. 111 - это ее значение по умолчанию
VARR = 111
это наша цель по умолчанию. Она просто выводит значение
all:
echo "Test"${VARR}
это ещё не цель. это такой способ задать переменную для цели
debug : VARR = 222
а вот это уже настоящая цель debug. еее задача проста - просто выполнить цель debug
и вывести текст
debug: all
echo "Make debug version".
теперь можно это испытать. Единственное, что бы я сделал - так это при вызове цели debug вызвал цель clean, а то может так произойти, что файлы то не нужно перекомпилировать:) либо не забывал вызывать make clean.
Примененный прием будет работать только в gnu make.
Итого, нужно заменить мою переменную на что то более осмысленное (например -g) и вставить ее в команду компиляции.
- 112,121
- 6
- 94
- 160
-
Да, в gnu работает.
В остальных не будет, т.к. в них переменные устанавливаются при первом проходе по файлу, а при втором выполняются цели.
Соответственно VARR всегда будет 222. (точнее при такой записи не gnu make просто обругается).
– avp Dec 13 '12 at 08:42 -
1
-
-
Да сейчас это не проблема. Думаю его легко можно для любой системы найти (в крайнем случае собрать).
Я когда-то делал make для винды (кстати, с нестандартным поведением по присваиванию переменных и на первом и на втором проходах), но потом как-то набрел на gnu для винды и свой забросил.
На самом деле основная проблема со всеми такими языками, что когда постоянно на них не пишешь, то тонкости забываются (даже в своей программе).
– avp Dec 13 '12 at 08:58 -
1ммм, насчет make. я подумываю, а не написать ли свою версию. Если придумаю более понятную систему сборки и найдется время, то думаю напишу. – mikelsv Dec 13 '12 at 09:32
-
этих систем уже хватает. cmake, qmake, imake, nmake, msbuild, ant, maven, SCons. И самое смешное, что все были разработаны, то бы заменить make:) – KoVadim Dec 13 '12 at 09:58
-
@mikelsv мина работодателю на случай увольнения? Мало проблем с чтением Вашего кода, так ещё make необычный... – alexlz Dec 13 '12 at 11:14
@mikelsv, если вопрос только в -g, тогда можно написать в начале Makefile что-то в таком духе
ifndef DEBFL
DEBFL = -O2
endif
CFLAGS = $(DEBFL) -Dlinux -pthread -fPIC
Если хотите отлаживаться
export DEBFL=-g
make
иначе
make clean
unset DEBFL
make
Я знаю, что не рекомендуется делать сборку, зависимую от environment, но для "внутреннего употребления" обычно это нормально работает.
- 46,098
- 6
- 48
- 116
-
Мне не нравится такой вариант с внешними переменными. Хотелось бы именно более стандартный с целями debug и release. – mikelsv Dec 13 '12 at 08:14
-
в таргете debug вам надо сетить переменную дебаг а потом уже вызывать таргет релиз + добавить логику которая сетит настройки билда в зависимости от того установлена переменная или нет (как на 1ом приведеном примере). в качестве "оптимизации" конфигурирование билд процеса можно сделать в одном файле а непосредственно таргеты для билда в другом. – jmu Dec 13 '12 at 08:27
-
можно попробовать как-то так :
– jmu Dec 13 '12 at 08:32release: ... debug: DEBUG_MODE=true make release -
@mikelsv, а самый распространенный способ это просто каждый раз в редакторе начало Makefile править и не морочить (главное себе самому) голову.
Еще делают несколько Makefile-ов а в основном исполняют shell-команды, которые запускают нужные Make с параметрами. Но это тоже тот еще геморрой.
– avp Dec 13 '12 at 08:48