12.06.2009 20:01
chemikadze — Все самое необходимое, что нужно знать о make
Любой, начавший программировать для linux в лучших традициях TrueUnixWay рано или поздно приходит к выводу что компилировать программы отдельными коммандами для обработки каждого файла - не самая лучшая трата времени. Вот тут-то как раз приходит время автоматизированных средств сборки - make, cmake, или даже qmake.Мы остановимся на первом варианте, как на самом распространенном. Все, что нужно для работы make - файл с описанием правил сборки, находящийся в каталоге с исходным кодом - Makefile. Что же входит в состав Makefile?
Переменные
В них можно хранить все что угодно: имена комманд, исходных файлов и прочий мусор. Объявляются они так:
Обратите внимание на разницу в интерпритации. Если вы сделаете так:
1 |
|
make войдет в цикл, вычисляя значение переменной. Все дело в том, что при сипользовании = make хранит значение в виде, который присваивался, тоесть "$(OBJ3) stuff.o". Переменная замыкается сама на себя и вуаля: у нас есть нерабочий Makefile. Если же писать через := или =, значение после выполнения аналогичного кода будет "main.o stuff.o".
Правила
С помощью них вы, собственно, и выставляете зависимости исходных файлов при сборке. Выглядят они примерно так:
1 |
|
Сначала задается имя целевого файла, двоеточие, список зависимостей, потом в следующей строке после символа табуляции (не забудьте, иначе получите ошибку) комманда для получения целевого файла из зависимостей.
Более красиво это можно сделать, если у вас определены переменные со списком файлов:
1 |
|
Кроме файлов, целью может служить операция:
1 |
|
Так как у нас нет целевого файла install, мы вынуждены использовать директиву .PHONY, сообщающую make о том, что install - не имя файла.
Суффиксы
Применяются для автоматического составления зависимостей. Такие распространенные расширения как .c, .cpp make обрабатывает автоматически, создавая из них объектные файлы с тем же именем, а для нестандартных нам потребуется создание суффиксов. Вот вам стандартный пример:
1 |
|
Здесь каждому файлу .o ставится в зависимость файл .c, который нужно обработать компилятором с соответствующими параметрами коммандной строки, причем $@ - подстановка имени выходного файла, а $< - шаблон подстановки первой зависимости (также есть $^ означающий все зависимости).
Кроме того, есть еще так называемые шаблонные правила, имеющие синтаксис сходный с обычными правилами:
1 |
|
Еще стоит упомянуть об одной особенности обработки комманд make: каждая строка выполняется в собственном коммандном интерпритаторе, то есть после выполнения комманды cd в следующей строке текущий каталог не изменится. Для этого нужно использовать многострочные комманды:
1 |
|
Вот в принципе и все, что нужно знать для создания небольших Makefile'ов, так что вот вам реальный примерчик:
PS: источник - "Разработка приложений в среде Linux" Майкл К. Джонсон, Эрик В. Троан, полезное чтиво.

+ -1 -
опс, забыл cut добавить
С позиции новичка, ничего не смыслящего в make, заявляю: отличное введение! Правда, про переменные как-то не очень хорошо объяснено - я так и непонял, чем ":=" отличается от "=".
И ещё одно: стоило бы указать источник с более подробными сведениями по теме. Почти уверен, что им будет "Разработка приложений в Linux" Джонсона и Троана, но всё же... :)
За статью плюс однозначно.
И ещё одно: стоило бы указать источник с более подробными сведениями по теме. Почти уверен, что им будет "Разработка приложений в Linux" Джонсона и Троана, но всё же... :)
За статью плюс однозначно.
угадал, спасибо за +
меня уже про make спрашивали, помню как сам искал, вот и написал =)
меня уже про make спрашивали, помню как сам искал, вот и написал =)
спасибо что помог, не знал что почитать о программировании в линуксе
Все спасибы chemikadze - я сам про эту книгу услышал всего два дня назад именно от него :)
если честно, лучше б описал как правильно пользоваться make'ом, про наиболее частые встречаемые фичи типа флагов j, и префиксов а-ля
make -j3 --prefix=/usr
Потому как вряд ли новичек будет писать Makefile для собственной проги, а знать, что внутри чужого - интересно, но не обязательно.
ЗЫ Кстати весьма низкий процент людей знает о make clean например.
make -j3 --prefix=/usr
Потому как вряд ли новичек будет писать Makefile для собственной проги, а знать, что внутри чужого - интересно, но не обязательно.
ЗЫ Кстати весьма низкий процент людей знает о make clean например.
Хм, хотел написать пост именно о создании Makefile, показалось что будет полезным для тех, кто начинает писать что-то в linux. По моей личной статистике это было более востребовано, не думал что все настолько плохо... %)
новичкам бы скомпилить что-то, а не самим писать :)
но начинающим программистам это конечно подмога
но начинающим программистам это конечно подмога
их читать сначала научить, этих новичков, разрешит примерно 60-70% всех проблем)
Большей части нынешних новичков лучше бы научиться нормально пользоваться манами, гуглом и хелпом к пакетному менеджеру используемого ими дистра.
А уж потом пытаться что-то компилить...хотя если не научатся вниматкльно читать консольный вывод при ошибках компиляции -- то уж лучше и не пытаться.
А статья хорошая -- как раз для начинающих программировать в Linux (типа меня).
А уж потом пытаться что-то компилить...хотя если не научатся вниматкльно читать консольный вывод при ошибках компиляции -- то уж лучше и не пытаться.
А статья хорошая -- как раз для начинающих программировать в Linux (типа меня).
Я что-то не понимаю - чего налетели-то? Неплохая статья для начинающих программистов. Мы же не говорим даже о том, что они обязательно должны быть линуксоидами - не так ли? Все это неплохо подошло бы и мне, человеку с Windows, если бы я пользовался makefile'ами напрямую. Однако я пользуюсь cmake, и все реже qmake (работа с последним все чаще сводится к qmake -poject && qmake). Поэтому надеюсь что автор еще напишет статью по CMake - система гибкая, кроссплатформенная, но довольно запутанная, так что есть о чем писать. Особенно, если писать о том, как обычный Makefile подстроить под другую систему сборки (qmake или cmake), или как файлы .pro (от qmake) правильно переделывать в CMakeLists.txt (для CMake). Вот такую бы статью я почитал с удовольствием и забукмаркил бы тут же.
Сейчас только пробежал глазами, плюсанул, ибо понял что статья неплохая, подход верный, правда, для начинающих.
Сейчас только пробежал глазами, плюсанул, ибо понял что статья неплохая, подход верный, правда, для начинающих.
Если честно, то cmake для меня самого тайна за семью печатями, qmake покахватало за глаза. Вот сдам сессию - буду пробовать cmake, а пока повременю.
я еще в личку тебе отпишусь, если сам надумаю что-то о cmake писать, ок? чтобы не делать нам вдвоем одну работу. Ну и у меня тоже диплом счас - мало на что времени хватает. Но ежели что - скоординируемся, так что время от времени поглядывай, не мигает ли у тебя конвертик ЛС =)
Отличная статья. Спасибо. Сам только начал прогать в линуксе. И makefile для меня оставались немного загадочной штукой.