Автоматична робота - як зберегти вихідне дерево в чистоті?


10

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


6
Просто зробіть дерев’яну збірку: stackoverflow.com/questions/1311231/… вона, на жаль, залишає деякі залишки. Спробуйте Смак десь спробувати.
Vitor Py

3
Цей день настав, мені знадобилося менше години, щоб перейти з того потворного autconf на cmake, який здається набагато чистішим.
vorad

1
CMake набагато чистіший, ніж autoconf: насправді побудова з дерева - це найпоширеніший спосіб побудови CMake. Хороший вибір :)
Vitor Py

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

Нечасто. CMake повинен генерувати файли, а не навпаки! Шукайте книгу під назвою Mastering CMake або в процесах побудови VTK або KDE для справжнього прикладу слів. Велика перевага CMake - це передумова: він також може створювати програмне забезпечення за допомогою Visual Studio vcproj, nmake Makefiles, XCode тощо. KDE використовує скрипт оболонки ('kdebuild') для запуску процесів збирання - можливо, ви хочете взяти погляд на це.
Vitor Py

Відповіді:


2

У пакеті autotools є безліч важко закодованих відносних шляхів і назв у ньому з поважної причини. Ваш найкращий варіант , щоб підвести підсумок виведення і позначати їх як ігноруються в вашому контролю версій, наприклад , в .cvsignore, .hgignoreабо як svn:ignoreатрибут оголошення . Деякі RCS дозволяють вам навіть рекурсивно вказувати символи.


4
Не існує жодної вагомої причини для цього важко закодованих відносних шляхів інших, ніж це стиль програмування Unix 1970-х.
Лотар

2

Рішення: створити збірку з джерела

  • Як запропоновано в коментарях, ви можете зробити збірку з джерела.
  • Принцип полягає в тому, що: створити інший каталог, "дерево побудови", запустіть сценарій налаштування з цього каталогу (з відносним або абсолютним шляхом).

Приклад з автоматизованою перевіркою

Наприклад, це вибере і створить привіт GNU і перевірить, чи не змінилось джерело дерево.

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

Ця частина отримує та готує каталоги.

{
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
}

Загальна частина: повторно використовувати це у своєму проекті

Ця частина може бути використана з іншими проектами, заснованими на автоконтролі. Просто запустіть проект у свій проект перед запуском. Обережно: це працює 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.

Бонус: некоренева установка

--prefix="${MYPREFIX?}"Частина вище , є необов'язковим. Це дозволяє зробити "make install", який є локальним для вашого облікового запису. Якщо ви хочете, щоб традиційне "sudo make install" у загальносистемному місці, ви можете видалити --prefix="${MYPREFIX?}".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.