Системы сборки на основе Make/GNU Hello

Начнем изучение таких систем на примере сборки пакета-примера GNU Hello.

Подготовка директории с исходным кодом

править
  1. Распакуем исходный код пакета, получив директорию с исходным кодом (~/src/hello-2.7; предполагаем, что файл-архив с исходным кодом расположен в текущей директории):

    $ mkdir -p -- ~/src 
    $ tar -C ~/src -zx < hello-2.9.tar.gz 
    $ 
    
  2. (Необязательно.) Содержимое директории исходного кода защитим от записи:

    $ chmod a=rX ~/src/hello-2.9/ -R 
    $ 
    

Сборка

править
  1. Создадим директорию сборки и сделаем ее текущей:

    $ mkdir -p -- ~/builds/hello-2.7-build 
    $ cd ~/builds/hello-2.7-build 
    $ 
    
  2. Выполним настройку пакета, указав в качестве префикса установки домашнюю директорию:

    $ ~/src/hello-2.7/configure \
          --prefix="$HOME" 
    

    Отметим, что на данном этапе не требуется явно указывать сохранение протокола настройки, поскольку configure уже формирует подробный протокол в файле config.log директории сборки.

  3. Инициируем теперь сборку пакета в фоновом режиме с сохранением протокола сборки в 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 многопоточную (до двух потоков) сборку.

Установка

править
  1. Установку пакета выполним в два этапа. Во-первых, подготовим директорию собранного пакета dist, указав последнюю в качестве целевой директории установки и выполнив цель install:

    $ LC_ALL=C \
          ionice -c 3 nice -n+19 \
          nohup /usr/bin/time make \
          DESTDIR="$PWD"/dist install &
    

    Отметим, что цель install редко требует существенного времени для выполнения, поэтому нет смысла разрешать Make использовать несколько потоков. Кроме того, «перемешанный» в протоколе вывод различных потоков усложняет диагностику сбоев, если таковые возникают.

  2. Наконец, скопируем содержимое dist в фактические целевые директории, подобно:

    $ rsync -uvb -rOtH --suffix=.~$(date +%s)~ \
          --backup-dir=.rsync-backup \
          --exclude=\*~ \
          dist"$HOME"/ "$HOME"/
    
  3. Теперь директорию dist, вместе с протоколами сборки и установки (nohup.out) и настройки (config.log) можно перенести в архив; оставшуюся директорию сборки — удалить.