Lua Policy

Материал из ALT Linux Wiki
Stub.png
Черновик политики Sisyphus
Автор(ы) — ildar@
Обсуждение в devel@
Обсуждается с 06.10.2017


Правила упаковки модулей и программ на языке Lua.

Список интерпретаторов Lua в ALT Linux

  1. Lua 5.1
  2. Lua 5.3
  3. LuaJIT 2.1 (совместим с Lua 5.1)

Для ясности стоит также упомянуть, что:

  • фактически транслятор языка находится в библиотеке и предоставляется пакетами liblua5.x и libluajit
  • программа /usr/bin/lua из пакета lua5.x является только средством для запуска скриптов Lua и чистых-Lua-программ (как тот же LuaRocks).

Общие соображения

Программы Lua могут исполняться в двух режимах:

  1. Какая-то программа, которая содержит в себе интерпретатор Lua (например, в виде библиотеки liblua.so.*), запускает Lua-подпрограмму посредством этого интерпретатора
  2. Скрипт Lua запускается с помощью программы-интерпретатора, /usr/bin/lua

Следовательно, всё-таки стоит отойти от практики явной линковки модулей Lua с liblua.so и воспринимать эту библиотеку не как библиотеку, а как интерпретатор.

Модули Lua (как чистые-Lua, так и *.so) следует паковать через LuaRocks. Это позволяет полуавтоматически отслеживать зависимости между модулями и, в крайнем случае, доустанавливать модули пользователям в локальном режиме.

О версиях Lua и их модулях

Давным-давно в ALT Linux была одна только Lua 5.0 . С тех пор у нас стандартными путями для модулей были %_datadir/lua5 и %_libdir/lua5 . Потом вышла Lua 5.1 и версию 5.0 выкинули. Сейчас у нас 3 интерпретатора, реализующих две версии языка: 5.3 и 5.1 . Одним из критичных вопросов примем вопрос востребованности (интерпретаторов, модулей, ...).

  1. Понятно, что каждый из интерпретаторов востребован теми пакетами, которые от них зависят, как какой-нибудь love работает на libluajit.so, поэтому в его зависимостях это прописано явно
  2. Для модулей у нас есть зависимости их друг от друга и от версии Lua (пример?). Вопрос востребованности (т.е. вопрос: для какой версии Lua нужны модули?) открывается очень простым. На самом деле в 95% случаев подходит Lua >= 5.1. Это позволяет принять версию 5.3 главной в вопросе поддержки модулей и их упаковки.
  3. Необходимо сохранить возможность упаковки модулей для определённых версий Lua, а также обеспечить максимальное облегчение сборки таких модулей

Главная версия

Главной версии интерпретатора у нас не будет, версии работают независимо

Правила упаковки модулей Lua

Модули и Lua-библиотеки следует паковать через LuaRocks. Это позволяет полуавтоматически отслеживать зависимости между модулями и в крайнем случае доустанавливать модули пользователям в локальном режиме.

Правила упаковки модулей для Главной версии:

  1. Вся инфраструктура luarocks и модули собираются для Главной версии Lua (на данный момент 5.3)
  2. Именование модулей: lua-module-имямод
  3. Модули устанавливаются в пути %_datadir/lua/5.3 (noarch) и %_libdir/lua/5.3 (arch)
  4. Модули собираются в RPM из rockspec при помощи утилиты lrimport.
  5. Зависимости между модулями выглядят так: luarocks%{версия_Lua}(имямод) <>= вермод
  6. Каждый пакет с модулем должен предоставлять: Provides: luarocks%{версия_Lua}(имямод) = %EVR
  7. Также пакет с модулем для Главной версии должен содержать Provides: luarocks(имямод) = %EVR, эта зависимость должна использоваться только пакетами этого же модуля для старых версий языка

Пояснения:

  1. Двоичные (arch) модули собираются стандартно для последней версии. При возникновении необходимости в модуле для более старой версии интерпретатора, отдельный пакет порождается и собирается вручную, см. ниже
  2. Если модуль/Lua-библиотека хорошо совместима со старой версией Lua и является полностью noarch, то при помощи spec-макроса %{lua_modules_make_available_for_older_versions} модуль становится мульти-луа-пригодным, т.е. как для 5.3, так и для 5.1. Необходимо также добавить Provides: luarocks5.1(имямод).

Правила упаковки модулей для старых версий языка

Вследствие того, что в сборочную среду невозможно установить одновременно liblua5.3-devel и liblua5.1-devel, сборка двоичных модулей под два интерпретатора пока принципиально невозможна.

Поэтому при сборке этих модулей отдельно, необходимо соблюдать следующие правила:

  1. модули должны подчиняться всем правилам модулей Lua, описанным выше, учитывая корректировки, перечисленные ниже
  2. Именование модулей: lua%{версия_Lua}-module-имямод, например lua5.1-module-luasocket.
  3. в верхней части спека добавить версию Lua: %define lua lua5.1.
  4. Пакет должен предоставлять зависимость вида luarocks%{версия_Lua}(имямод), например luarocks5.1(luasocket)
  5. Пакет должен иметь зависимость вида luarocks(luasocket) = %EVR, т.е. зависеть от пакета для Главной версии и устанавливать его.
  6. BuildPreReq: rpm-macros-lua >= 1.3 lib%lua-devel %lua
  7. в %files %exclude %luarocks_dbdir/%oname
  8. зависимости от других модулей должны быть исправлены на модули для требуемой версии Lua

Если внести все эти правки в спек для основной версии модуля, должен получиться собираемый модуль для старой версии интерпретатора. Планируется написание скрипта, делающего это автоматически, который появится в репозитарии lrimport.

Правила упаковки программ, которые работают на /usr/bin/lua

Программы, имеющие в shebang #!/usr/bin/lua или #!/usr/bin/env lua, будут запускаться интерпретатором Главной версии, т.е. на текущий момент 5.3

Поэтому предлагаем следующие рекомендации:

  • если у программы есть привязка к версии интерпретатора, то это надо указать в shebang, например, #!/usr/bin/lua5.1 или #!/usr/bin/lua5.3
  • если у программы есть зависимость на модули lua, то необходимо их добавить в зависимости, учитывая версию интерпретатора (например, luarocks(luasocket) или luarocks5.1(luasocket))
  • если у программы есть зависимость на модули lua не-Главной версии, например, luarocks5.1(luasocket), то надо указать привязку к версии в shebang, например, #!/usr/bin/lua5.1

Нерешенные проблемы

  1. lrimport не является полностью автоматизированным средством. Патчи приветствуются.
  2. Вследствие того, что в сборочную среду невозможно установить одновременно liblua5.3-devel и liblua5.1-devel, сборка двоичных модулей под два интерпретатора пока невозможна

Ссылки