Board.KolibriOS.org
http://board.kolibrios.org/

Система сборки Tup
http://board.kolibrios.org/viewtopic.php?f=7&t=2869
Page 1 of 2

Author:  CleverMouse [ Fri Sep 12, 2014 6:19 pm ]
Post subject:  Система сборки Tup

В 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. Если считать, что исходные файлы находятся "внизу", а собираемые по ним бинарные файлы - "вверху", как на картинке,
Attachment:
kosgl-deps.png
kosgl-deps.png [ 82.59 KiB | Viewed 11990 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:
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:
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:
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.

Author:  Mario_r4 [ Fri Sep 12, 2014 7:58 pm ]
Post subject:  Re: Система сборки Tup

CleverMouse wrote:
В r5098 я перевела автосборку с Make на Tup, http://gittup.org/tup/index.html. Я написала подробно о новой системе в файле build.txt в корне репозитория.

Было бы удобно и практично иметь еще и русский вариант build.txt - все же большинство программистов проекта русскоязычные и этот файл не является исходником ядра или какой либо программы. Я конечно могу и сам перевести, но будет это не раньше чем через пару месяцев.

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

Author:  SoUrcerer [ Sun Sep 14, 2014 11:00 am ]
Post subject:  Re: Система сборки Tup

Уии, lua! Теперь по крайней мере в теории можно запускать сборку из самой Колибри (tup вроде достаточно портабелен)?

Author:  CleverMouse [ Mon Sep 15, 2014 12:50 pm ]
Post subject:  Re: Система сборки Tup

Нужно только портировать nasm, gcc, wine для запуска msvc и c--, fuse и командный процессор с обработкой перенаправления ввода-вывода, и запускай на здоровье. Делов-то.

Author:  Mario_r4 [ Fri Oct 24, 2014 9:07 am ]
Post subject:  Re: Система сборки Tup

Не уверен, что пишу в правильную тему, но кажется что связано именно с этим.

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

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

Author:  yogev_ezra [ Fri Oct 24, 2014 12:56 pm ]
Post subject:  Re: Система сборки Tup

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' этот перенос сломался.

Author:  CleverMouse [ Fri Oct 24, 2014 3:59 pm ]
Post subject:  Re: Система сборки Tup

Тема правильная, это ненормально, немного поломались скрипты пост-обработки при переходе на tup. У меня мало времени, и эту проблему я считаю некритичной.

Author:  CleverMouse [ Fri Nov 07, 2014 7:07 pm ]
Post subject:  Re: Система сборки Tup

Я починила перенос. Файлы, оставшиеся сейчас, должны быть перенесены при следующей пересборке.

Author:  ALPINE [ Mon Dec 01, 2014 5:15 pm ]
Post subject:  Re: Система сборки Tup

Маленькая ошибочка в Readme:
Quote:
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:
/home/autobuild/tools/win32/bin

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

Author:  Mario_r4 [ Mon Dec 15, 2014 10:35 am ]
Post subject:  Re: Система сборки Tup

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

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

Author:  CleverMouse [ Mon Dec 15, 2014 3:20 pm ]
Post subject:  Re: Система сборки Tup

Скрипты немного поломались, я их поправила.

Author:  Mario_r4 [ Mon Dec 15, 2014 3:37 pm ]
Post subject:  Re: Система сборки Tup

CleverMouse
Спасибо.

Author:  yogev_ezra [ Thu Feb 26, 2015 5:22 pm ]
Post subject:  Re: Система сборки Tup

С некоторых пор, содержимое дискеты не генерируется: http://builds.kolibrios.org/rus/svn5475-info.txt
Code:
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:

Author:  yogev_ezra [ Thu Feb 26, 2015 6:12 pm ]
Post subject:  Re: Система сборки Tup

Quote:
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: Спасибо. Извини, что заметил только сейчас.
Подтверждаю, что исправлено.

Author:  dunkaist [ Mon Nov 20, 2017 9:30 pm ]
Post subject:  Re: Система сборки Tup

Hi,

does anyone build kolibrios with tup? I have to prepend all '# CONFIG_...' comments with a second '#' to workaround the error:
Code:
$ 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

Page 1 of 2 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/