# 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