2

Подскажите, как в Makefile сделать анализ входных параметров. Нужно различать Debug и Release и в зависимости от значения устанавливать в CFLAGS -g или -O2.

mikelsv
  • 3,046
  • 1
  • 20
  • 48
  • 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 Answers2

3

Пусть у нас есть готовый 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) и вставить ее в команду компиляции.

KoVadim
  • 112,121
  • 6
  • 94
  • 160
  • Да, в gnu работает.

    В остальных не будет, т.к. в них переменные устанавливаются при первом проходе по файлу, а при втором выполняются цели.

    Соответственно VARR всегда будет 222. (точнее при такой записи не gnu make просто обругается).

    – avp Dec 13 '12 at 08:42
  • 1
    а кто то против? я же написал - будет работать только в gnu make. – KoVadim Dec 13 '12 at 08:50
  • Написал 6 строчек вида debug: text и все заработало как хотелось. – mikelsv Dec 13 '12 at 08:57
  • Да сейчас это не проблема. Думаю его легко можно для любой системы найти (в крайнем случае собрать).

    Я когда-то делал 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
2

@mikelsv, если вопрос только в -g, тогда можно написать в начале Makefile что-то в таком духе

ifndef DEBFL
DEBFL         = -O2
endif
CFLAGS        = $(DEBFL) -Dlinux  -pthread -fPIC

Если хотите отлаживаться

export DEBFL=-g
make

иначе

make clean
unset DEBFL
make

Я знаю, что не рекомендуется делать сборку, зависимую от environment, но для "внутреннего употребления" обычно это нормально работает.

avp
  • 46,098
  • 6
  • 48
  • 116
  • Мне не нравится такой вариант с внешними переменными. Хотелось бы именно более стандартный с целями debug и release. – mikelsv Dec 13 '12 at 08:14
  • в таргете debug вам надо сетить переменную дебаг а потом уже вызывать таргет релиз + добавить логику которая сетит настройки билда в зависимости от того установлена переменная или нет (как на 1ом приведеном примере). в качестве "оптимизации" конфигурирование билд процеса можно сделать в одном файле а непосредственно таргеты для билда в другом. – jmu Dec 13 '12 at 08:27
  • можно попробовать как-то так :
    release:
        ...
    debug:
    DEBUG_MODE=true    
        make release
    
    – jmu Dec 13 '12 at 08:32
  • @mikelsv, а самый распространенный способ это просто каждый раз в редакторе начало Makefile править и не морочить (главное себе самому) голову.

    Еще делают несколько Makefile-ов а в основном исполняют shell-команды, которые запускают нужные Make с параметрами. Но это тоже тот еще геморрой.

    – avp Dec 13 '12 at 08:48