Automake - как сохранить исходное дерево чистым?


10

У меня есть проект, который использует автоинструменты GNU для сборки себя. Я пытаюсь изменить так, чтобы autotools генерировал все не версионные управляющие файлы в отдельном каталоге, чтобы я мог сохранить дерево исходных файлов в чистоте от временных файлов. У кого-нибудь есть идеи, как это сделать?


6
Просто сделайте сборку из дерева: stackoverflow.com/questions/1311231/… она, к сожалению, все еще оставляет некоторые остатки. Дайте CMake попробовать однажды.
Vitor Py

3
Настал тот день, мне потребовалось меньше часа, чтобы переключиться с этого уродливого autconf на cmake, который кажется намного чище.
Ворал

1
CMake намного чище, чем autoconf: фактически сборка из дерева является наиболее распространенным способом сборки CMake. Хороший выбор :)
Vitor Py

Как обычно иметь Makefile в верхней части дерева исходного кода, который управляет процессом сборки с помощью cmake? Скажем, make запустит mkdir -p build && cd build && cmake .. && make и т. Д. (Разные цели, например, make test и т. Д.).
Ворад

Нечасто. CMake должен генерировать make-файлы, а не наоборот! Ищите книгу под названием Mastering CMake или в процессах построения VTK или KDE для примеров реальных слов. Огромным преимуществом CMake является превосходство над make: он также может создавать ваше программное обеспечение с использованием Visual Studio vcproj, nmake Makefiles, XCode и т. Д. KDE использует сценарий оболочки ('kdebuild') для запуска процессов сборки - возможно, вы захотите взять Посмотрите на это.
Vitor Py

Ответы:


2

Пакет autotools содержит много жестко заданных относительных путей и имен по уважительной причине. Ваш лучший вариант , чтобы подвести итог вывода и помечать их как игнорируются в вашем контроля версий, например , в .cvsignore, .hgignoreили как svn:ignoreатрибут объявления . Некоторые RCS позволяют даже рекурсивно указывать подстановочные знаки.


4
Нет ни одной веской причины иметь эти жестко запрограммированные относительные пути, кроме стиля Unix 1970-х годов.
Лотар

2

Решение: сделать сборку из исходного кода

  • Как предлагается в комментариях, вы можете сделать сборку вне исходного кода.
  • Принцип таков: создайте другой каталог, «дерево сборки», запустите скрипт настройки из этого каталога (с относительным или абсолютным путем).

Пример с автоматической проверкой

Например, это извлечет и соберет GNU hello и проверит, что исходное дерево не изменилось чуть-чуть.

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

Эта часть выбирает и готовит каталоги.

{
wget -S http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
tar zxvf hello-2.10.tar.gz
mv hello-2.10 hello-2.10-pristine
tar zxvf hello-2.10.tar.gz
diff -urq hello-2.10 hello-2.10-pristine && echo "Before build, directories are identical."
cd hello-2.10
}

Общая часть: повторно используйте это в своем проекте

Эта часть может использоваться с другими проектами на основе autoconf. Просто войдите в свой проект перед запуском. Осторожно: это работает rm, если вы играете с вариантами, будьте осторожны, вы несете ответственность в любом случае.

export MYPREFIX="${PWD}.installtree"
(
set -eu # abort on error
ls configure # make sure it aborts if not in correct directory
export SRCTREE="${PWD}"
export BUILDTREE="${PWD}.buildtree"
rm -rf "$BUILDTREE" "$MYPREFIX"
mkdir "$BUILDTREE" "$MYPREFIX"
cd "$BUILDTREE"
"${SRCTREE}"/configure --prefix="${MYPREFIX?}"
time make -k || time make
time make install
)

Проверить часть

Это проверяет, является ли сборка совершенно исходной.

{
ls "$MYPREFIX"/bin/hello && echo "Okay, build generated the target."
cd "$MYPREFIX"/..
diff -urq hello-2.10 hello-2.10-pristine && echo "No change at all. Perfect out-of-source build success."
}

Вот это выводит это:

/tmp/hello-2.10.installtree/bin/hello
Okay, build generated the target.
No change at all. Perfect out-of-source build success.

Бонус: установка без полномочий root

--prefix="${MYPREFIX?}"Часть выше , является необязательным. Это позволяет выполнить «make install», которая является локальной для вашей учетной записи. Если вы хотите традиционную «sudo make install» для всей системы, вы можете удалить ее --prefix="${MYPREFIX?}".

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.