# Copyright (C) 2021-2026 Free Software Foundation, Inc.
#
# This file is part of GNU Emacs.
#
# GNU Emacs is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GNU Emacs is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Emacs. If not, see .
# GNU Emacs support for the GitLab-specific build of Docker images.
# The presence of this file does not imply any FSF/GNU endorsement of
# Docker or any other particular tool.
# Author: Ted Zlatanov
# Maintainer: Michael Albinus
# URL: https://emba.gnu.org/emacs/emacs
FROM debian:bookworm AS emacs-base
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
libc-dev gcc g++ make autoconf automake libncurses-dev gnutls-dev \
libxml2-dev libdbus-1-dev libacl1-dev acl git man-db texinfo gdb python3 \
&& rm -rf /var/lib/apt/lists/*
FROM emacs-base AS emacs-inotify
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
inotify-tools \
&& rm -rf /var/lib/apt/lists/*
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure
# 'make -j4 bootstrap' does not work reliably.
RUN make -j `nproc` bootstrap
FROM emacs-base AS emacs-filenotify-gio
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
libglib2.0-dev libglib2.0-bin libglib2.0-0 \
&& rm -rf /var/lib/apt/lists/*
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure --with-file-notification=gfile
RUN make -j `nproc` bootstrap
FROM debian:trixie AS emacs-eglot
# This mimics emacs-base.
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
libc-dev gcc g++ make autoconf automake libncurses-dev gnutls-dev \
libxml2-dev libdbus-1-dev libacl1-dev acl git man-db texinfo gdb \
&& rm -rf /var/lib/apt/lists/*
# Install clangd, tsserver, rust-analyzer.
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
clangd npm node-typescript rust-analyzer cargo \
&& rm -rf /var/lib/apt/lists/*
RUN npm install -g typescript-language-server typescript
RUN npm install -g vscode-json-languageserver
# eclipse-jdt-ls is planned as Java language server.
# See .
# The following LSP servers exist as snap packages. However, snap
# cannot be used inside containers. We keep this here for reference.
# # Install snapd.
# RUN apt-get update && \
# apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
# snapd \
# && rm -rf /var/lib/apt/lists/*
# RUN snap install core
# # Install typescript-language-server.
# RUN snap install typescript-language-server
# # Install vscode-json-languageserver.
# RUN snap install vscode-json-languageserver
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure
RUN make -j `nproc` bootstrap
# # Install company and yasnippet.
# RUN mkdir /root/.emacs.d
# RUN src/emacs --batch \
# --eval '(setq url-debug 0 debug-on-error t)' \
# --eval '(package-install (quote company))' \
# --eval '(package-install (quote yasnippet))'
FROM emacs-base AS emacs-tree-sitter
# Install tree-sitter library.
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
libtree-sitter0 libtree-sitter-dev \
&& rm -rf /var/lib/apt/lists/*
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure --with-tree-sitter
RUN make -j `nproc` bootstrap
# Install language grammars. The ABI versions of libtree-sitter0 and
# the respective grammars must match. The grammar ABI version is determined by
# grep LANGUAGE_VERSION /path/to/grammar-repo/src/parser.c
RUN mkdir -p /root/.emacs.d/tree-sitter
RUN git config --global http.sslverify "false"
# See https://github.com/emacs-tree-sitter/tree-sitter-langs/tree/master/repos
# The recommended versions are generated by
# 'treesit-admin-verify-major-mode-queries' at the beginning of every
# ts-mode file. Loading a ts-mode file adds its grammar source to
# 'treesit-language-source-alist'.
RUN src/emacs -Q --batch \
--eval '(message "library ABI min version %d max version %d" \
(treesit-library-abi-version t) (treesit-library-abi-version))' \
--eval '(message "\nInstalling grammars\n===================")' \
--eval '(setq treesit-extra-load-path (list "/root/.emacs.d/tree-sitter"))' \
-l admin/tree-sitter/treesit-admin.el \
--eval '(dolist (lang (mapcar (quote car) \
(treesit-admin--populated-treesit-language-source-alist))) \
(treesit-install-language-grammar lang "/root/.emacs.d/tree-sitter"))' \
--eval '(message "\ntreesit-language-source-alist")' \
--eval '(message "=============================")' \
--eval '(message "%s" (pp-to-string treesit-language-source-alist))' \
--eval '(message "ABI versions\n============")' \
--eval '(dolist (lang (sort (mapcar (quote car) treesit-language-source-alist))) \
(message "%s ABI version %d" lang (treesit-language-abi-version lang)))' \
--eval '(message "\ntreesit-admin-check-manual-coverage")' \
--eval '(message "===================================")' \
-f treesit-admin-check-manual-coverage \
--eval '(message "\ntreesit-admin--generate-compatibility-report")' \
--eval '(message "============================================")' \
--eval '(treesit-admin--generate-compatibility-report \
(list (expand-file-name "src/emacs")) treesit-admin--builtin-modes \
(expand-file-name "compatibility-report.html"))'
FROM emacs-base AS emacs-gnustep
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
gnustep-devel zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure --with-ns
RUN make -j `nproc` bootstrap
FROM emacs-base AS emacs-native-comp
# The libgccjit version must correspond to the gcc version.
RUN apt-get update && \
apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 \
libgccjit-12-dev zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
FROM emacs-native-comp AS emacs-native-comp-speed0
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure --with-native-compilation
RUN make -j `nproc` bootstrap \
NATIVE_FULL_AOT=1 BYTE_COMPILE_EXTRA_FLAGS='--eval "(setq comp-speed 0)"'
FROM emacs-native-comp AS emacs-native-comp-speed1
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure --with-native-compilation
RUN make -j `nproc` bootstrap \
BYTE_COMPILE_EXTRA_FLAGS='--eval "(setq comp-speed 1)"'
FROM emacs-native-comp AS emacs-native-comp-speed2
COPY . /checkout
WORKDIR /checkout
RUN ./autogen.sh autoconf
RUN ./configure --with-native-compilation
RUN make -j `nproc` bootstrap