LINUX.ORG.RU

Сборка Emacs в Debian 11 (bullseye)

 ,


0

1

В репозитории Debian 11 включен Emacs версии 27.1, в котором отсутствуют некоторые функции. Поэтому последнюю версию целесообразно собирать из исходников.

При сборке из исходников можно получить:

  1. поддержку синтаксического анализа кода при помощи tree-sitter;
  2. просмотр и динамическое изменение размера изображений с помощью imagemagick;
  3. встроенную поддержку JSON, что позволяет ускорить работу серверов LSP;
  4. возможность открывать xwidgets в буферах Emacs.
  5. нативную поддержку JIT- компиляции, что позволяет улучшить общую производительность Emacs.

Кроме того, при сборке можно поиграть с разными оптимизациями GCC.

Получаем исходники Emacs

Первое, что нужно сделать — это скачать исходники. Для этого клонируем git-репозиторий.

    git clone git://git.savannah.gnu.org/emacs.git

Git скачает около 800mb исходников. Если не нужна история и предыдущие версии, то:

    git clone --depth 1 git://git.savannah.gnu.org/emacs.git

Эта команда скачает только последнюю ветку master репозитория, не загружая всю историю. Зеркала на savannah.gnu.org медленные поэтому возможно имеет смысл скачать с github.

Устанавливаем необходимые для сборки зависимости

Все зависимости сразу можно установить одной командой:

    apt build-dep emacs

Но по-моему, она тащит много лишнего. Поэтому ставим все необходимое руками.

Зависимости, необходимые для базовой установки

    apt install \
        build-essential \
        libgtk-3-dev \
        libgnutls28-dev \
        libtiff5-dev \
        libgif-dev \
        libjpeg-dev \
        libpng-dev \
        libxpm-dev \
        libncurses-dev \
        libwebkit2gtk-4.0-dev \
        texinfo

Нативная поддержка JSON

    apt install \
        libjansson4 \
        libjansson-dev

Поддержка JIT-компиляции

При первом запуске Emacs начнет перекомпилировать все установленные пакеты, открывать различные буферы, и вести себя крайне агрессивно.

    apt install \
        libgccjit0 \
        libgccjit-10-dev

Динамическое изменение размера изображений

    apt install \
        libmagickcore-dev \
        libmagick++-dev

Инкрементальный анализ

Библиотека tree-sitter — это система синтаксического анализа общего назначения, поддерживающая инкрементный синтаксический анализ и восстановление после ошибок.

В стабильном Debian нет нужных пакетов, но они есть в ветке testing. Подключаем репозиторий testing. Создаем файл /etc/apt/sources.list.d/bookworm.list.

    deb http://deb.debian.org/debian/ bookworm main

Чтобы не сломать систему назначаем ветке testing минимальный приоритет. Создадим файл /etc/apt/preferences.d/20bookworm смотри man 5 apt_preferences

    Package: *
    Pin: release a=testing
    Pin-Priority: 1

Теперь можно ставить нужные зависимости

    apt install libtree-sitter-dev

Сборка и установка

Теперь переходим в каталог с исходниками.

    cd emacs

Emacs будет собираться из ветки master. Чтобы собрать Emacs другой версии, переключаем ветку. Например: чтоб собрать Emacs 29, переключаемся на ветку 29:

    git checkout emacs-29
    git pull

Теперь будет собираться Emacs 29.

Устанавливаем компилятор, которым будем собирать Emacs.

    export CC=/usr/bin/gcc-10
    export CXX=/usr/bin/gcc-10

Настраиваем сборку.

    ./autogen.sh

Возможно также стоит запустить ./configure --help, чтобы посмотреть и включить нужные опции.

    ./configure \
      --with-native-compilation \
      --with-json \
      --with-tree-sitter \
      --with-imagemagick \
      --with-xwidgets \
      --without-compress-install

--with-native-compilation - включает поддержку встроенного компилятора Emacs Lisp.

--with-tree-sitter - включить tree-sitter

--with-json - скомпилировать с собственной поддержкой JSON

--with-imagemagick - включает поддержку imagemagick

--with-xwidgets - включить использование xwidgets в буферах Emacs

--without-compress-install - не сжимать некоторые файлы (*.el, *.info и т. д.) при установке.

После этого запускаем сборку.

    make --jobs=$(nproc)

Устанавливаем Emacs

Следующая команда выполняется от пользователя root. Emacs будет установлен в каталог /usr/local/bin

    make install

Проверяем, работают ли новые функции

Чтобы проверить, что и JSON, и tree-sitter работают, нужно запустить следующий elisp код в Emacs.

Для tree-sitter:

    (if (and (fboundp 'native-comp-available-p)
           (native-comp-available-p))
      (message "Native compilation is available")
    (message "Native complation is *not* available"))

И для JSON:

    (if (functionp 'json-serialize)
      (message "Native JSON is available")
    (message "Native JSON is *not* available"))

В итоге получаем:

emacs --version

GNU Emacs 30.0.50
Development version 50b55656b9c5 on master branch; build date 2023-02-25.
Copyright (C) 2023 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.


Проверено: hobbit ()

Эта заметка пылилась у меня на диске решил выложить может кому пригодиться.

den-jc ()

Гайд огонь, но вместо проверки tree-sitter проверяется нативная компиляция.

(if (treesit-available-p)
    (message "Tree-sitter is available")
  (message "Tree-sitter is *not* available"))
Nervous ★★★★★ ()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от Extraterrestrial

Можно пробовал. Не знаю ка на сиде, а на тестинге нету дров на мою видеокарточку.

den-jc ()
Ответ на: комментарий от kirill_rrr

что вместо него? make install ещё хуже

Я просто оставлю это здесь https://github.com/giuliomoro/checkinstall/issues/4

Да, я тоже наступил на эти грабли.

Что вместо, пока не ясно. Может, в контейнере его собирать попробовать.

Nervous ★★★★★ ()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от kirill_rrr

Делать пакет смысла нет, я emacs регулярно пересобираю. А make uninstall сносит его полностью остаются только пустые каталоги.

den-jc ()
Ответ на: комментарий от den-jc

Так каталоги и конфиги тоже должны быть зарегистрированы в пакетной системе. И ещё конфликты файлов должны разруливаться, а в идеале ещё конечно зависимости чтобы система не вычислтила «ненужную» библиотеку.

kirill_rrr ★★★★★ ()
Ответ на: комментарий от kirill_rrr

Так apt тоже не все каталоги удаляет. Регулярно выдает что не может что-то удалить потому что в каталоге есть файл. В основном в etc или /var/log/.

den-jc ()
Ответ на: комментарий от kirill_rrr

Я тоже не понял. Зачем ? Мне, когда в Шапке что то нужно (и я не нашел в репах), я всегда делаю rpm, и удивлен этой статье. Млжет deb пакет так сложно сделать ?

mx__ ★★★★★ ()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от den-jc
  1. И держать в системе кучу не нужного хлама в виде gcc и подобного ?

  2. А если куда еще поставить нужно ?

P.S. По заголовку я полез читать статью, думая что увижу как делают пакет под debian 11.

mx__ ★★★★★ ()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от mx__

И держать в системе кучу не нужного хлама в виде gcc и подобного ?

По-моему gcc это такой же обязательный компонент любой полноценной unix-like системы как и шелл. Отсутствовать может разве что на очень урезанных экземплярах (какие-нить роутеры или «тонкие» сервера где оставлены строго нужные бинарники и ничего больше, ну или контейнеры).

firkax ★★★★ ()
Ответ на: комментарий от mx__

Можно и deb сделать только я emacs из ветки master постоянно пересобираю (раз в месяц или чаще). А gcc в системе уже есть его nvidia-driver тащит.

den-jc ()
Ответ на: комментарий от mx__

Нет, не дыра. Никакие бинарники (если они не suid и если в их коде не содержится каких-нить паролей или приватных ключей) не могут добавить дыр. Если у тебя уже получили шелл и единственное препятствие в виде отсутствующего gcc чтоб скомпилить эксплоит - то дыра у тебя уже случилась и поздно изображать безопасность. В целом это вообще препятствием не будет, бинарник можно и другими способами организовать. Только нубские боты отсеятся.

firkax ★★★★ ()
Ответ на: комментарий от den-jc

Я бы в таком случае --prefix=/usr/local/emacs-latest или что-то похожее в configure добавил (а в /usr/local/bin симлинк на бинарник оттуда). Даже в случае самодельного опакечивания это часто удобно а уж при непакетной установке однозначно полезно.

firkax ★★★★ ()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Gnu Stow для этого использую. Забыл сюда добавить про симлинки.

den-jc ()
Ответ на: комментарий от mx__

Вот не углублялся в тему, обычно checkinstall делал достаточный минимум.

kirill_rrr ★★★★★ ()

На правах наброса: кмк гораздо проще накатить Guix и получить помимо последнего емакса ещё и целую кучу плюх в виде емаксопакетов без добавления всяких MELPA и прочего, которые можно потом грохнуть легко.

SeTSeR ()

поддержку синтаксического анализа кода при помощи tree-sitter;

А чем оно полезно? Я не так давно настроил LSP mode, ещё не до конца освоил. Что мне даст сверх того tree-sitter?

sena ()
Ответ на: комментарий от den-jc

GNU Snow

Работает только до апреля. А потом растает.

rupert ★★★★★ ()
Ответ на: комментарий от sena

Что мне даст сверх того tree-sitter?

Улучшенная подсветка синтаксиса.

Семантические подсказки: переменные, функции и т.д.

Работа с несколькими языками в одном буфере. Например: HTML + JS.

Тут и тут подробнее.

den-jc ()
Ответ на: комментарий от den-jc

Улучшенная подсветка синтаксиса.

Это конечно здорово, но ради этого так заморачиваться по-моему не стоит. Меня текущая подсветка вполне устраивает.

Семантические подсказки: переменные, функции и т.д.

Так LSP mode же это уже умеет. Или там он как-то особенно подсказывает?

Работа с несколькими языками в одном буфере. Например: HTML + JS.

ОК, правда мне это не надо.

sena ()
Последнее исправление: sena (всего исправлений: 1)
Ответ на: комментарий от Nervous

checkinstall говнище. Которое не обновлялось десяток лет уже, наверное. Из пяти софтин собирает одну в лучшем случае.

Gonzo ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.