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