LLVM/Packaging

Материал из ALT Linux Wiki

Мы упаковываем несколько мажорных версий LLVM, пользуясь опытом дистрибутива Debian и нашей же упаковки разных мажорных gcc.

  • Пакеты с мажорной версией в имени содержат упакованные компоненты LLVM.
  • Пакеты без мажорной версии в имени вытягивают пакет из предыдущего пункта c некоторой версией по умолчанию, а также устанавливают симлинки без номера. Например, пакет clang в некотором репозитории может устанавливать симлинк %_bindir/clang на %_prefix/lib/llvm-14.0/bin/clang и вытягивать пакет с clang-14. (На самом деле мы ставим симлинки на свою маленькую программу, которая уже вызывает настоящую утилиту; подробнее ниже)

Подобно переменной окружения GCC_VERSION, мы вводим переменную окружения ALTWRAP_LLVM_VERSION, на которую реагирует программа llvm-alt-tool-wrapper. Она либо исполняет утилиту с именем симлинка, по которому её вызвали, либо, если таковой нет, выдаёт диагностическое сообщение и совет, что администратору нужно сделать. У этой envvar такое страшное название, потому что она предназначена в первую очередь для сборочных скриптов в RPM-пакетах — у пользователей CMake и Meson (да и остальных) есть более удобные инструменты по выбору правильной утилиты. В RPM-спеках не стоит завязываться на эту переменную; лучше применять макросы из rpm-macros-llvm-common.

Изменения упаковки, отражающиеся на спеках других пакетов

LLVM 13

  • В этой мажорной ветке апстрим окончательно сломал раздельную упаковку .a и .so, поэтому мы больше не уносим .a в -devel-static. Дело облегчается тем, что динамическая библиотека во всех подпроектах одна, общая (libLLVM-X.so, libclang-cpp.so.X, liblldb.so.X), а статические .a разделены (libclangBasic.a, libclangLex.a, libclangAST.a, ...; libLLVMX86CodeGen.a, libLLVMX86Disassembler.a, libLLVMRISCVDisassembler.a...).
    • При переводе спека на другую версию LLVM (или, если вы не прибиваете её гвоздями — при смене дефолта в репозитории) обратите внимание на BuildRequires: (llvm|clang)-devel-static. Начиная с LLVM 13, такого пакета нет, и достаточно просто -devel.
    • Также мы произвели это слияние devel-пакетов для LLVM 12, но оставили там для совместимости provide на -devel-static.