Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт май 25, 2017 5:10 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 14 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Система сборки Tup
СообщениеДобавлено: Пт сен 12, 2014 6:19 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1592
В 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 КБ | 8778 просмотров ]

то 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:
Код:
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 явно - он не-генерируемый, примерно так:
Код:
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:
Код:
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
СообщениеДобавлено: Пт сен 12, 2014 7:58 pm 
Не в сети
Kernel Developer

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

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

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

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Вс сен 14, 2014 11:00 am 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Уии, lua! Теперь по крайней мере в теории можно запускать сборку из самой Колибри (tup вроде достаточно портабелен)?


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пн сен 15, 2014 12:50 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1592
Нужно только портировать nasm, gcc, wine для запуска msvc и c--, fuse и командный процессор с обработкой перенаправления ввода-вывода, и запускай на здоровье. Делов-то.

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пт окт 24, 2014 9:07 am 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Не уверен, что пишу в правильную тему, но кажется что связано именно с этим.

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

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

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пт окт 24, 2014 12:56 pm 
Не в сети
Public Relations
Аватара пользователя

Зарегистрирован: Пн июн 07, 2010 12:01 pm
Сообщения: 1879
Mario_r4 писал(а):
Открываю 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
СообщениеДобавлено: Пт окт 24, 2014 3:59 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1592
Тема правильная, это ненормально, немного поломались скрипты пост-обработки при переходе на tup. У меня мало времени, и эту проблему я считаю некритичной.

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пт ноя 07, 2014 7:07 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1592
Я починила перенос. Файлы, оставшиеся сейчас, должны быть перенесены при следующей пересборке.

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пн дек 01, 2014 5:15 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 25, 2014 5:08 pm
Сообщения: 109
Маленькая ошибочка в 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 путь
Код:
/home/autobuild/tools/win32/bin

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

_________________
Roman Shuvalov


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пн дек 15, 2014 10:35 am 
Не в сети
Kernel Developer

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

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

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пн дек 15, 2014 3:20 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1592
Скрипты немного поломались, я их поправила.

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Пн дек 15, 2014 3:37 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
CleverMouse
Спасибо.

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


Вернуться к началу
 Заголовок сообщения: Re: Система сборки Tup
СообщениеДобавлено: Чт фев 26, 2015 5:22 pm 
Не в сети
Public Relations
Аватара пользователя

Зарегистрирован: Пн июн 07, 2010 12:01 pm
Сообщения: 1879
С некоторых пор, содержимое дискеты не генерируется: http://builds.kolibrios.org/rus/svn5475-info.txt
Код:
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
СообщениеДобавлено: Чт фев 26, 2015 6:12 pm 
Не в сети
Public Relations
Аватара пользователя

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 14 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB