Системы сборки на основе Make/GNU Hello
Начнем изучение таких систем на примере сборки пакета-примера GNU Hello.
Подготовка директории с исходным кодом
[править]Распакуем исходный код пакета, получив директорию с исходным кодом (
~/src/hello-2.7
; предполагаем, что файл-архив с исходным кодом расположен в текущей директории):$ mkdir -p -- ~/src $ tar -C ~/src -zx < hello-2.9.tar.gz $
(Необязательно.) Содержимое директории исходного кода защитим от записи:
$ chmod a=rX ~/src/hello-2.9/ -R $
Сборка
[править]Создадим директорию сборки и сделаем ее текущей:
$ mkdir -p -- ~/builds/hello-2.7-build $ cd ~/builds/hello-2.7-build $
Выполним настройку пакета, указав в качестве префикса установки домашнюю директорию:
$ ~/src/hello-2.7/configure \ --prefix="$HOME"
Отметим, что на данном этапе не требуется явно указывать сохранение протокола настройки, поскольку
configure
уже формирует подробный протокол в файлеconfig.log
директории сборки.Инициируем теперь сборку пакета в фоновом режиме с сохранением протокола сборки в
nohup.out
:$ LC_ALL=C \ ionice -c 3 nice -n+19 \ nohup /usr/bin/time make -j 2 &
Где:
LC_ALL=C
подавляет локализацию для процесса сборки;ionice
иnice
снижают приоритет задачи;nohup
делает процесс устойчивым к SIGHUP и перенаправляет вывод в файлnohup.out
;/usr/bin/time
добавляет к протоколу полное и процессорное время выполнения сборки;- опция
-j 2
разрешает Make многопоточную (до двух потоков) сборку.
Установка
[править]Установку пакета выполним в два этапа. Во-первых, подготовим директорию собранного пакета
dist
, указав последнюю в качестве целевой директории установки и выполнив цельinstall
:$ LC_ALL=C \ ionice -c 3 nice -n+19 \ nohup /usr/bin/time make \ DESTDIR="$PWD"/dist install &
Отметим, что цель
install
редко требует существенного времени для выполнения, поэтому нет смысла разрешать Make использовать несколько потоков. Кроме того, «перемешанный» в протоколе вывод различных потоков усложняет диагностику сбоев, если таковые возникают.Наконец, скопируем содержимое
dist
в фактические целевые директории, подобно:$ rsync -uvb -rOtH --suffix=.~$(date +%s)~ \ --backup-dir=.rsync-backup \ --exclude=\*~ \ dist"$HOME"/ "$HOME"/
Теперь директорию
dist
, вместе с протоколами сборки и установки (nohup.out
) и настройки (config.log
) можно перенести в архив; оставшуюся директорию сборки — удалить.