Page 1 of 2

Система сборки Tup

Posted: Fri Sep 12, 2014 6:19 pm
by CleverMouse
В r5098 я перевела автосборку с Make на Tup, http://gittup.org/tup/index.html. Я написала подробно о новой системе в файле build.txt в корне репозитория.

Главные отличия Tup от Make:
1. Tup автоматически отслеживает зависимости. Если изменился .inc или .h файл, Tup поймёт, что программу надо пересобрать, даже если в файлах системы сборки изменённый файл вообще не упоминается. Для этого Tup под Linux использует fuse, запуская создаваемые процессы на виртуальной файловой системе, Tup под Windows перехватывает функции работы с файлами в создаваемых процессах. Если в файле системы сборки изменились опции вызова компилятора, Tup поймёт, что программу надо пересобрать. Если в файле системы сборки что-то изменилось, но на опции компиляции изменение не влияет, Tup поймёт, что программу пересобирать не надо.
2. Если считать, что исходные файлы находятся "внизу", а собираемые по ним бинарные файлы - "вверху", как на картинке,
kosgl-deps.png
kosgl-deps.png (82.59 KiB)
Viewed 40602 times
то Make идёт сверху вниз, а Tup - снизу вверх.
2а. Знание о том, как компилировать программу, теперь находится в папке программы в виде файла Tupfile.lua, а не где-то в data/, посыпанное магической пылью макросов make. В data/Tupfile.lua остаётся знание о том, как собирать kolibri.img и kolibri.iso. Разделение по языкам остаётся, но только для того, чтобы можно было работать, не коллекционируя все компиляторы и для понимания масштабов проблемы ЯВУ.
2б. Make пересобирает только файлы, от которых зависит kolibri.img или kolibri.iso. Tup пересобирает всё, для чего есть Tupfile.lua и что изменилось либо зависит от того, что изменилось. Если вам всё-таки хочется залить в репозиторий некомпилирующийся код, то, во-первых, подумайте, так ли вам это надо, во-вторых, ещё раз подумайте, точно ли вам это надо, если не передумали, то, в-третьих, удалите Tupfile.lua или закомментируйте создание правила для компиляции.
2в. Для того, чтобы собрать одну программу с помощью Tup, подходят ровно те же файлы Tupfile.lua, что и для сборки всего репозитория. Чтобы начать работать с tup, нужно выбрать папку, которую tup будет считать корнем, и скомандовать в ней tup init; после этого tup без аргументов где угодно внутри поддерева будет собирать всё, что изменилось в рамках поддерева. Поддеревом может быть как весь репозиторий, так и папка программы.
3. Tup понимает указания сборки на языке Lua, где граблей намного меньше, чем в Makefile'ах, а возможностей намного больше. В частности, нет проблемы с табуляцией, которую ни в коем случае нельзя заменять пробелами, и длинные массивы можно записывать таблицами, а не строками со слешами на конце, после которых ни в коем случае нельзя ставить ничего, даже пробела, и в которых нельзя закомментировать одну строчку в середине - и это только грабли, на которые в data/*/Makefile не раз наступали и которые я сходу помню.

Собирать весь репозиторий с помощью Tup, если вы не пытаетесь сделать ещё и kolibri.img, не так страшно, как звучит. Отсутствующие компиляторы можно выключить в конфиге, kpack и kerpack настраивать необязательно. Tup будет при запуске пересканировать всё поддерево, но это довольно быстро: у меня под Windows с "прогретым" дисковым кешем это занимает примерно две секунды - я на всякий случай уточню, что это включая contrib, с "холодным" - порядка минуты. На Linux вообще можно включить inotify-монитор, исключающий сканирование.

Возможные переменные для конфига с комментариями собраны в tup.config.template в корне репозитория. Его можно скопировать как tup.config в ту папку, где вы сделали tup init. Файлы сборки написаны так, что при отсутствии конфига рассчитывают на наличие компилятора и пытаются сделать что-нибудь разумное. В частности, язык, если он нужен для компиляции, будет английским, и вызов kpack отключён.

Типичный Tupfile.lua для программы на fasm:

Code: Select all

if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en" or tup.getconfig("LANG")) .. " > lang.inc", {"lang.inc"})
tup.rule({"test.asm", extra_inputs = {"lang.inc"}}, "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "test")
Оператор "==" в Lua - проверка равенства, "~=" - проверка неравенства, ".." - конкатенация строк. Однострочные комментарии начинаются с "--".
Первая строчка: если в конфиге выставлена переменная CONFIG_NO_FASM, то скрипт немедленно завершает работу. Аналогичная строчка есть во всех Tupfile.lua, чтобы можно было собирать всё, не обладая какими-нибудь компиляторами.
Вторая и третья строчки создают по одному правилу сборки. У правила сборки может быть ноль или больше входов, команда сборки и ноль или больше выходов. Входы и выходы - почти всегда файлы, желающие могут почитать мануал Tup для уточнений. У функции tup.rule может быть два или три аргумента: обязательно указать команду и можно указать список входов, список выходов или и то, и другое. В форме с тремя аргументами список из одного элемента можно указывать просто строкой, как в третьей строке: {"test"} = "test". В форме с двумя аргументами это порождает неоднозначность input+command vs command+output, так что список нужно указывать списком. Возвращаясь к правилам, вторая строка создаёт lang.inc командой "echo lang fix LL > lang.inc", по умолчанию LL = en, его можно определить в конфиге. Третья строка компилирует test.asm. tup старается запускать параллельно всё, что можно, для этого ему нужно обязательно указывать зависимости между командами; tup проверяет все обращения к файлам, и попытка не указать сгенерированный "lang.inc" во входах при условии, что он действительно используется, приведёт к ошибке компиляции. Даже если lang.inc уже создан. Зависимости от не-генерируемых файлов указывать необязательно, tup вычислит их сам. Отличие входов из подсписка extra_inputs от входов из основного списка - в том, что первые не подпадают под %f в команде. Tup поддерживает некоторые %-спецификаторы внутри команды и выходных файлов. Полный список есть в мануале по tup, основные: %f - имена всех входных файлов, кроме extra_inputs, через пробел, %o - имена всех выходных файлов, кроме extra_outputs, %B - имена всех входных файлов без путей и расширений. В принципе, при отсутствии kpack третья строка могла бы не использовать %-спецификаторов и не указывать test.asm явно - он не-генерируемый, примерно так:

Code: Select all

tup.rule("lang.inc", "fasm test.asm test", "test")
и это бы прекрасно работало, но в форме со спецификаторами появляются возможности переиспользовать команды в разных файлах: например, CONFIG_KPACK_CMD, если она задана, использует "%o".

Если в одной папке нужно компилировать два разнородных проекта - библиотеку и программу, например, - придётся явно создать два правила. Если в одной папке несколько программ, как в programs/develop/libraries/buf2d/trunk/examples, можно использовать tup.foreach_rule вместо tup.rule; foreach_rule создаст по одному правилу для каждого входа, кроме extra_inputs. В качестве выхода придётся указать что-нибудь с %-спецификатором, например, "%B" или "%B.exe", чтобы в каждом правиле выход раскрылся в что-то уникальное.

Пример Tupfile.lua для programs/demos/cubeline/trunk, зависящей от menuetlibc и TinyGL:

Code: Select all

if tup.getconfig("NO_GCC") ~= "" then return end
HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../../.." or tup.getconfig("HELPERDIR")
tup.include(HELPERDIR .. "/use_gcc.lua")
tup.include(HELPERDIR .. "/use_menuetlibc.lua")
tup.include(HELPERDIR .. "/use_tinygl.lua")
compile_gcc{"main.cpp", "fps.cpp"}
link_gcc("cubeline")
Первая строчка аналогична предыдущему примеру. Дальше есть некоторые сложности из-за того, что, в отличие от примера с fasm, этот Tupfile.lua несамодостаточен и подключает programs/use_gcc.lua, programs/use_menuetlibc.lua, programs/use_tinygl.lua. В режиме компиляции всего репозитория дополнительных настроек делать не надо, HELPERDIR станет "../../..", относительным путём к programs/, три следующих строки установят параметры компиляции с использованием gcc, menuetlibc, tinygl. В режиме компиляции одной программы tup откажется подключать файлы сборки извне поддерева, так что придётся скопировать use_gcc.lua, use_menuetlibc.lua, use_tinygl.lua в папку с программой и указать в tup.config CONFIG_HELPER_DIR=.; в двух последних файлах нужно будет ещё заменить первую строку на актуальный путь к библиотеке. Предпоследняя строка создаст правила для компиляции main.cpp -> main.o и fps.cpp -> fps.o, а также запомнит созданные файлы .o в переменной OBJS; обратите внимание на фигурные скобки, compile_gcc получает один параметр-список. Последняя строка создаст правило для линковки всего, что накопилось в OBJS, в бинарник с именем cubeline.

Re: Система сборки Tup

Posted: Fri Sep 12, 2014 7:58 pm
by Mario_r4
CleverMouse wrote:В r5098 я перевела автосборку с Make на Tup, http://gittup.org/tup/index.html. Я написала подробно о новой системе в файле build.txt в корне репозитория.
Было бы удобно и практично иметь еще и русский вариант build.txt - все же большинство программистов проекта русскоязычные и этот файл не является исходником ядра или какой либо программы. Я конечно могу и сам перевести, но будет это не раньше чем через пару месяцев.

А вообще спасибо - проделана большая работа.

Re: Система сборки Tup

Posted: Sun Sep 14, 2014 11:00 am
by SoUrcerer
Уии, lua! Теперь по крайней мере в теории можно запускать сборку из самой Колибри (tup вроде достаточно портабелен)?

Re: Система сборки Tup

Posted: Mon Sep 15, 2014 12:50 pm
by CleverMouse
Нужно только портировать nasm, gcc, wine для запуска msvc и c--, fuse и командный процессор с обработкой перенаправления ввода-вывода, и запускай на здоровье. Делов-то.

Re: Система сборки Tup

Posted: Fri Oct 24, 2014 9:07 am
by Mario_r4
Не уверен, что пишу в правильную тему, но кажется что связано именно с этим.

Открываю http://builds.kolibrios.org/rus/ и вижу кучу разных svn5xxx-info.txt от старых сборок. Они разве не должны удаляться со следующей пересборкой?
Также присутствуют неактуальные svn5xxx-distr.7z и svn5xxx-iso.7z.

Это нормально, так и задумано?

Re: Система сборки Tup

Posted: Fri Oct 24, 2014 12:56 pm
by yogev_ezra
Mario_r4 wrote:Открываю http://builds.kolibrios.org/rus/ и вижу кучу разных svn5xxx-info.txt от старых сборок. Они разве не должны удаляться со следующей пересборкой?
Также присутствуют неактуальные svn5xxx-distr.7z и svn5xxx-iso.7z.

Это нормально, так и задумано?
Если я правильно помню, то при сборках 'make' в главной папке находились файлы от трёх последних ревизий - более старые переносились в папки 'history' (svn5xxx-img.7z , svn5xxx-distr.7z и svn5xxx-iso.7z) и 'logs' (svn5xxx-info.txt). Видимо, при переходе на 'tup' этот перенос сломался.

Re: Система сборки Tup

Posted: Fri Oct 24, 2014 3:59 pm
by CleverMouse
Тема правильная, это ненормально, немного поломались скрипты пост-обработки при переходе на tup. У меня мало времени, и эту проблему я считаю некритичной.

Re: Система сборки Tup

Posted: Fri Nov 07, 2014 7:07 pm
by CleverMouse
Я починила перенос. Файлы, оставшиеся сейчас, должны быть перенесены при следующей пересборке.

Re: Система сборки Tup

Posted: Mon Dec 01, 2014 5:15 pm
by ALPINE
Маленькая ошибочка в Readme:
Under Linux, you need the package with "linux" in name
and ... Unpack the package to
/home/autobuild/tools/win32, the package assumes exactly this path.
Помимо этого, надо добавить в PATH путь

Code: Select all

/home/autobuild/tools/win32/bin
Иначе получим гору ошибок "/bin/sh: 1: kos32-gcc: not found".

Re: Система сборки Tup

Posted: Mon Dec 15, 2014 10:35 am
by Mario_r4
CleverMouse
Наблюдаю изменение в составе сборки файлов http://builds.kolibrios.org/rus/
Раньше кроме latest-*.7z присутствовали еще и svn*.7z файлы. Можно было сразу понять какая ревизия собрана. Это было удобно.

Можно восстановить эти симлинки?

Re: Система сборки Tup

Posted: Mon Dec 15, 2014 3:20 pm
by CleverMouse
Скрипты немного поломались, я их поправила.

Re: Система сборки Tup

Posted: Mon Dec 15, 2014 3:37 pm
by Mario_r4
CleverMouse
Спасибо.

Re: Система сборки Tup

Posted: Thu Feb 26, 2015 5:22 pm
by yogev_ezra
С некоторых пор, содержимое дискеты не генерируется: http://builds.kolibrios.org/rus/svn5475-info.txt

Code: Select all

Floppy image layout:
	        0 bytes in  files,  bytes used
	        0 bytes in the root folder
	        0 bytes in 0 non-root folders
	        0 bytes in the system area
	          bytes free

All files and folders in the floppy image:

Re: Система сборки Tup

Posted: Thu Feb 26, 2015 6:12 pm
by yogev_ezra
CleverMouse « Thu Feb 26, 2015 4:37 pm » http://builds.kolibrios.org/rus/logs/.o ... 4-info.txt от 2014-Dec-03 нормальный, http://builds.kolibrios.org/rus/logs/.o ... 1-info.txt от 2014-Dec-14 битый. Сейчас конец февраля
CleverMouse « Thu Feb 26, 2015 4:43 pm » поправится при следующей пересборке
CleverMouse « Thu Feb 26, 2015 4:43 pm » наверное
yogev_ezra « Thu Feb 26, 2015 5:11 pm » CleverMouse: Спасибо. Извини, что заметил только сейчас.
Подтверждаю, что исправлено.

Re: Система сборки Tup

Posted: Mon Nov 20, 2017 9:30 pm
by dunkaist
Hi,

does anyone build kolibrios with tup? I have to prepend all '# CONFIG_...' comments with a second '#' to workaround the error:

Code: Select all

$ tup
[ tup ] [0.000s] Scanning filesystem...
[ tup ] [0.387s] Reading in new configuration/environment variables...
 1) updated variant: tup.config
tup error: No space found in tup config.
Line was: '# CONFIG_NO_GCC=full'
I.e. it works this way: '## CONFIG_...'.

I suspect that on the build server all the compilers are enabled and thus nobody faced the issue. It is trivial to fix, I only want to know if it depends on versions/environment.

tup 0.7.5