Утилита make как средство сборки сложных проектов
Наконец открыл для себя утилиту make. Собственно, про её применение для сборки программ я знал и раньше, но в голову не приходило попробовать применить на чём-то, отличном от программирования.
Началось с того, что я написал для сборки сайта www.serann.ru набор шелловых скриптов, каждый из которых включал в начале дополнительный файл set_environment для установки переменных окружения. Система получилась громоздкой и неустойчивой в плане расширения и модификации -- слишком много отдельных скриптов с неясными зависимостями.
Сегодня утром решил таки почитать info make и в итоге к вечеру почти все свои разношёрстные скрипты сборки свёл в один makefile. Весь процесс сборки разбит на легко обозримые куски, зависимости между ними прописаны там же в явной форме -- красота. И, главное, легко добавлять "особенные" сборки, к примеру, для быстрой пересборки-закачки сайта после добавления новости.
<!--break-->
Makefile для сборки сайта:
<pre>
<font color="#af5f00"><b>export</b></font> CEPAHH_FLAG_DIR=/home/serann/flags<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_MAKESITE_SCRIPTS=/home/serann/scripts/makesite<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_BACKUP_DIR=/home/serann/backup<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_TEMP_DIR=/home/serann/temp<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_TEMPLATES_DIR=/home/serann/templates<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_IN_PROGRESS_TEXTS_DIR=/home/serann//texts/in_progress<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_PREPARED_TEXTS_DIR=/home/serann//texts/prepared<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_NEW_TEXTS_DIR=/home/serann//texts/new<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_COMMON_SITE_ROOT=/home/serann/www.serann.ru<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_HTML=html<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_CGIBIN=cgi-bin<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_UPDATES_DIR=/home/serann/update<br>
<font color="#af5f00"><b>export</b></font> CEPAHH_OK=1<br>
<br>
<font color="#af5f00"><b>export</b></font> PWD=/home/serann/scripts/makesite<br>
<br>
<font color="#008080">RM</font>=/bin/rm<br>
<font color="#008080">TOUCH</font>=/bin/touch<br>
<br>
<font color="#008080">VPATH</font>:=<font color="#008080">${CEPAHH_FLAG_DIR}</font><br>
<br>
<font color="#008080">help:</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Если вы запустили этот Makefile без параметров -- он вам, скорее всего, не нужен."</font><br>
<br>
<font color="#008080">clean_flags:</font><br>
<font color="#c00000"> </font><font color="#008080">${RM}</font><font color="#c00000"> -f </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/*</font><br>
<br>
<font color="#008080">backup:</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && ./backupDB.pl </font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Бэкап базы данных завершён"</font><br>
<br>
<font color="#008080">add_from_prepared:</font><br>
<font color="#c000c0"> @</font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000">/auto-01-add_from_prepared.sh</font><br>
<br>
<br>
<font color="#008080">build_filesbbs: </font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Создание свежего файла files.bbs"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && </font><font color="#008080">${RM}</font><font color="#c00000"> -f </font><font color="#008080">${CEPAHH_COMMON_SITE_ROOT}</font><font color="#c00000">/</font><font color="#008080">${CEPAHH_HTML}</font><font color="#c00000">/texts/files.bbs</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && ./make_current_files_bbs.pl </font><font color="#008080">${CEPAHH_COMMON_SITE_ROOT}</font><font color="#c00000">/</font><font color="#008080">${CEPAHH_HTML}</font><font color="#c00000">/texts/files.bbs</font><br>
<font color="#c000c0"> @</font><font color="#c00000">touch </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/build_filesbbs</font><br>
<br>
<font color="#008080">build_commonsite: </font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка общей части сайта"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && ./makecommon.pl</font><br>
<font color="#c000c0"> @</font><font color="#c00000">touch </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/build_commonsite</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка общей части сайта завершена"</font><br>
<br>
<font color="#008080">build_links: </font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка каталога ссылок"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && ./makelinks.pl</font><br>
<font color="#c000c0"> @</font><font color="#c00000">touch </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/build_links</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка каталога ссылок завершена"</font><br>
<br>
<font color="#008080">build_jenres: </font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка дерева жанров"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && ./makejenres.pl</font><br>
<font color="#c000c0"> @</font><font color="#c00000">touch </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/build_jenres</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка дерева жанров завершена"</font><br>
<br>
<br>
<font color="#008080">makeupdate: </font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Очистка каталога обновления"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_UPDATES_DIR}</font><font color="#c00000"> && rm -rf *</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка обновления"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && ./diffsite.pl</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Упаковка обновления"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_UPDATES_DIR}</font><font color="#c00000"> && tar czf update.tgz `ls .` && echo </font><font color="#c00000">"Размер файла обновления:"</font><font color="#c00000"> `ls -lh update.tgz | cut -d </font><font color="#c00000">' '</font><font color="#c00000"> -f 5`</font><br>
<font color="#c000c0"> @</font><font color="#c00000">touch </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/makeupdate</font><br>
<br>
<font color="#008080">upload_update: </font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Загрузка апдейта на сайт"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && </font><font color="#c000c0">\</font><br>
<font color="#c00000"> @perl -ne </font><font color="#c00000">"s@CEPAHH_UPDATES_DIR@\</font><font color="#008080">$$</font><font color="#c00000">ENV{'CEPAHH_UPDATES_DIR'}@; print"</font><font color="#c00000"> upload_update.ftp >.upload_update.ftp && </font><font color="#c000c0">\</font><br>
<font color="#c00000"> @touch </font><font color="#008080">${CEPAHH_UPDATES_DIR}</font><font color="#c00000">/need_update && </font><font color="#c000c0">\</font><br>
<font color="#c00000"> sftp -b .upload_update.ftp serann@serann.ru && </font><font color="#c000c0">\</font><br>
<font color="#c00000"> rm -f .upload_update.ftp</font><br>
<font color="#c000c0"> @</font><font color="#c00000">touch </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/upload_update</font><br>
<br>
<font color="#008080">checksums:</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Подсчёт контрольной суммы локальной копии сайта"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">cd </font><font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font><font color="#c00000"> && ./ccs.pl</font><br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Подсчёт контрольной суммы локальной копии сайта завершён"</font><br>
<font color="#c000c0"> @</font><font color="#c00000">touch </font><font color="#008080">${CEPAHH_FLAG_DIR}</font><font color="#c00000">/checksums</font><br>
<br>
<br>
<br>
<font color="#008080">new_release:</font> add_from_prepared build_filesbbs build_commonsite build_links build_jenres makeupdate upload_update checksums backup clean_flags<br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка обновления (с текстами) завершена"</font><br>
<br>
<font color="#008080">add_news_to_site:</font> build_commonsite makeupdate upload_update checksums backup clean_flags<br>
<font color="#c000c0"> @</font><font color="#c00000">echo </font><font color="#c00000">"Сборка обновления (с новостями) завершена"</font><br>
<br>
<font color="#008080">split_into_in_progress:</font><br>
<font color="#c000c0">ifeq</font> (<font color="#008080">$(all)</font>,)<br>
<font color="#c000c0"> @</font>echo <font color="#c00000">"Для обработки этой цели необходимо указать файл, примерно так:"</font><br>
<font color="#c000c0"> @</font>echo <font color="#c00000">"make split_into_in_progress all='полноеимяфайла'"</font><br>
<font color="#c000c0"> @</font>exit<br>
<font color="#c000c0">else</font><br>
<font color="#c000c0"> @</font>cd <font color="#008080">${CEPAHH_MAKESITE_SCRIPTS}</font> && ./split_all_to_texts.pl <font color="#008080">$(all)</font><br>
<br>
<font color="#c000c0">endif</font><br>
<br>
</font>
</pre>
Add new comment