Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Nov 19, 2019 12:04 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 18 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Fri Sep 12, 2014 6:19 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
В 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 12051 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.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Sep 12, 2014 7:58 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
CleverMouse wrote:
В r5098 я перевела автосборку с Make на Tup, http://gittup.org/tup/index.html. Я написала подробно о новой системе в файле build.txt в корне репозитория.

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

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

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Sep 14, 2014 11:00 am 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Уии, lua! Теперь по крайней мере в теории можно запускать сборку из самой Колибри (tup вроде достаточно портабелен)?


Top
   
PostPosted: Mon Sep 15, 2014 12:50 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Нужно только портировать nasm, gcc, wine для запуска msvc и c--, fuse и командный процессор с обработкой перенаправления ввода-вывода, и запускай на здоровье. Делов-то.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Oct 24, 2014 9:07 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Не уверен, что пишу в правильную тему, но кажется что связано именно с этим.

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

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

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Fri Oct 24, 2014 12:56 pm 
Offline
Public Relations
User avatar

Joined: Mon Jun 07, 2010 12:01 pm
Posts: 1879
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' этот перенос сломался.


Top
   
PostPosted: Fri Oct 24, 2014 3:59 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Тема правильная, это ненормально, немного поломались скрипты пост-обработки при переходе на tup. У меня мало времени, и эту проблему я считаю некритичной.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Nov 07, 2014 7:07 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Я починила перенос. Файлы, оставшиеся сейчас, должны быть перенесены при следующей пересборке.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Dec 01, 2014 5:15 pm 
Offline
User avatar

Joined: Tue Nov 25, 2014 5:08 pm
Posts: 109
Маленькая ошибочка в 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".

_________________
Roman Shuvalov


Top
   
PostPosted: Mon Dec 15, 2014 10:35 am 
Offline
Kernel Developer

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

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

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Mon Dec 15, 2014 3:20 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Скрипты немного поломались, я их поправила.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Dec 15, 2014 3:37 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
CleverMouse
Спасибо.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Thu Feb 26, 2015 5:22 pm 
Offline
Public Relations
User avatar

Joined: Mon Jun 07, 2010 12:01 pm
Posts: 1879
С некоторых пор, содержимое дискеты не генерируется: 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:


Top
   
PostPosted: Thu Feb 26, 2015 6:12 pm 
Offline
Public Relations
User avatar

Joined: Mon Jun 07, 2010 12:01 pm
Posts: 1879
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: Спасибо. Извини, что заметил только сейчас.
Подтверждаю, что исправлено.


Top
   
PostPosted: Mon Nov 20, 2017 9:30 pm 
Offline
Mentor
User avatar

Joined: Mon Oct 19, 2009 10:58 am
Posts: 435
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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 18 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited