Lua Policy: различия между версиями
(→Правила упаковки программ, которые работают на /usr/bin/lua: добавил раздел) |
|||
Строка 59: | Строка 59: | ||
== Правила упаковки программ, которые работают на /usr/bin/lua == | == Правила упаковки программ, которые работают на /usr/bin/lua == | ||
очень просты: | |||
* имея в shebang <code>#!/usr/bin/lua</code> или <code>#!/usr/bin/env lua</code>, программа будет запускаться имеющимся интерпретатором, как то lua5.3 или lua5.1 (или luajit), а зависимость на /usr/bin/lua будет вычисляться автоматически средствами ALTLinux | |||
* если у программы есть привязка к версии интерпретатора, то это надо указать в shebang, например, <code>#!/usr/bin/lua5.1</code> или <code>#!/usr/bin/lua5.3</code> | |||
* если у программы есть зависимость на модули lua, то необходимо их добавить в зависимости, учитывая версию интерпретатора (например, <code>luarocks(luasocket)</code> или <code>luarocks5.1(luasocket)</code>) | |||
== Нерешенные проблемы == | == Нерешенные проблемы == |
Версия от 13:13, 26 сентября 2017
Правила упаковки модулей и программ на языке Lua.
Список интерпретаторов Lua в ALT Linux
- Lua 5.1
- Lua 5.3
- LuaJIT 2.1 (совместим с Lua 5.1)
Для ясности стоит также упомянуть, что:
- фактически транслятор языка находится в библиотеке и предоставляется пакетами liblua5.x и libluajit
- программа /usr/bin/lua из пакета lua5.x является только средством для запуска скриптов Lua и чистых-Lua-программ (как тот же LuaRocks). Следовательно, требование по привязке к определённой версии интерпретатора для таких программ может быть установлено менее жёстким, с известной долей осторожности
Общие соображения
Программы Lua могут исполняться в двух режимах:
- Программа, которая содержит в себе интерпретатор Lua (например, в виде библиотеки liblua.so.*), запускает Lua-подпрограмму средствами этого интерпретатора
- Скрипт Lua запускается с помощью интерпретатора, например /usr/bin/lua
Следовательно, всё-таки стоит отойти от практики явной линковки модулей с liblua.so и воспринимать эту библиотеку не как библиотеку, а как интерпретатор.
Модули и Lua-библиотеки следует паковать через LuaRocks. Это позволяет полуавтоматически отслеживать зависимости между модулями и, в крайнем случае, доустанавливать модули пользователям в локальном режиме.
О версиях Lua и их модулях
Давным-давно в ALT Linux была одна только Lua 5.0 . С тех пор у нас стандартными путями для модулей были %_datadir/lua5 и %_libdir/lua5 . Потом вышла Lua 5.1 и версию 5.0 выкинули. Сейчас у нас 3 интерпретатора (см. выше), реализующих две версии языка: 5.3 и 5.1 . Одним из критичных вопросов примем вопрос востребованности (интерпретаторов, модулей, ...).
- Понятно, что каждый из интерпретаторов востребован теми пакетами, которые от них зависят, как какой-нибудь love работает на libluajit.so, поэтому в его зависимостях это прописано явно
- Для модульных систем у нас есть зависимости модулей друг от друга и от версии Lua (пример?). Вопрос востребованности (т.е. вопрос: для какой версии Lua нужны модули?) открывается очень простым. На самом деле в 95% случаев подходит Lua >= 5.1. Это позволяет принять версию 5.3 главной в вопросе поддержки модулей и их упаковки.
- Необходимо сохранить возможность упаковки модулей для определённых версий Lua, а также обеспечить максимальное облегчение сборки таких модулей
Правила упаковки модулей Lua
Модули и Lua-библиотеки следует паковать через LuaRocks. Это позволяет полуавтоматически отслеживать зависимости между модулями и в крайнем случае доустанавливать модули пользователям в локальном режиме.
Как это выглядит:
- Вся инфраструктура luarocks и модули собираются для последней версии Lua (на данный момент 5.3)
- Именование модулей: lua-module-имямод
- Модули устанавливаются в пути %_datadir/lua/5.3 (noarch) и %_libdir/lua/5.3 (arch)
- Модули собираются в RPM из rockspec при помощи утилиты lrimport.
- Зависимости между модулями выглядят так: luarocks(имямод) <>= вермод
Пояснения:
- Двоичные (arch) модули собираются стандартно для последней версии. При возникновении необходимости в модуле для более старой версии интерпретатора, отдельный пакет порождается и собирается вручную, см. раздел ниже
- Если модуль/Lua-библиотека хорошо совместима со старой версией Lua и является полностью noarch, то при помощи spec-макроса %{lua_modules_make_available_for_older_versions} модуль становится мульти-луа-пригодным, т.е. как для 5.3, так и для 5.1
Правила упаковки модулей для старых версий языка
Вследствие того, что в сборочную среду невозможно установить одновременно liblua5.3-devel и liblua5.1-devel, сборка двоичных модулей под два интерпретатора пока принципиально невозможна. Поэтому при сборке этих модулей отдельно, необходимо соблюдать следующие правила:
Правила упаковки программ, которые работают на /usr/bin/lua
очень просты:
- имея в shebang
#!/usr/bin/lua
или#!/usr/bin/env lua
, программа будет запускаться имеющимся интерпретатором, как то lua5.3 или lua5.1 (или luajit), а зависимость на /usr/bin/lua будет вычисляться автоматически средствами ALTLinux - если у программы есть привязка к версии интерпретатора, то это надо указать в shebang, например,
#!/usr/bin/lua5.1
или#!/usr/bin/lua5.3
- если у программы есть зависимость на модули lua, то необходимо их добавить в зависимости, учитывая версию интерпретатора (например,
luarocks(luasocket)
илиluarocks5.1(luasocket)
)
Нерешенные проблемы
- lrimport не является полностью автоматизированным средством. Патчи приветствуются.
- Вследствие того, что в сборочную среду невозможно установить одновременно liblua5.3-devel и liblua5.1-devel, сборка двоичных модулей под два интерпретатора пока невозможна