forked from FG42/FG42
1
0
Fork 0
FG42/nix/fg42/derivation.nix

200 lines
5.3 KiB
Nix
Raw Normal View History

# Fg42 - Emacs Editor for advance users
#
2024-02-18 16:08:02 +00:00
# Copyright (c) 2010-2024 Sameer Rahmani <lxsameer@gnu.org>
#
# This program 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, version 2.
#
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
{ lib
, config
, stdenv
, git
, texinfo
, gcc
, bash
, utils
, emacsPackagesFor
, makeFontsConf
, xorg
, maintainers
, writeTextFile
, writeShellApplication
, ...
}:
with builtins;
2024-02-22 14:19:57 +00:00
let
cfg = config.fg42;
emacs = cfg.emacs;
version = cfg.version;
emacsBundle = (emacsPackagesFor emacs).withPackages (_: cfg.elispPackages);
paths = map (x: "${x}/bin/") cfg.paths;
pathsStr = lib.strings.concatStrings (lib.strings.intersperse ":" paths);
mimeTypes = builtins.concatStringsSep ";" cfg.mimeTypes;
fontsConf = makeFontsConf { fontDirectories = cfg.fonts; };
# Whatever that needs to be in the PATH is considered a runtime
# dependency.
# Fonts are obviously runtime dependency as well
runtimeDependencies = cfg.paths ++ cfg.fonts ++ cfg.elispPackages;
configFile = writeTextFile {
name = "config.json";
2024-04-16 22:01:42 +01:00
text = (toJSON {
fg42 = {
inherit (cfg) vars consts requires;
};
});
executable = false;
};
in
stdenv.mkDerivation rec {
2024-03-27 23:50:44 +00:00
inherit version;
2024-04-16 22:01:42 +01:00
pname = builtins.trace ">>> ${configFile}" "FG42";
src = ../../.;
2024-02-22 14:19:57 +00:00
2024-03-27 23:50:44 +00:00
buildPhase = ''
runHook preBuild
2024-02-22 14:19:57 +00:00
LISPDIR=$out/share/fg42/
STARTUP_FILE=$LISPDIR/lisp/fg42_init.el
2024-02-22 14:19:57 +00:00
mkdir -p $out/bin
2024-04-05 22:32:40 +01:00
mkdir -p $out/share/applications/
2024-02-22 14:19:57 +00:00
install -d $LISPDIR
mkdir -p $LISPDIR/lisp
cp -rv ${src}/lisp/build.el $LISPDIR/lisp
2024-02-22 14:19:57 +00:00
cp -rv ${src}/share $out/
cp -rv ${src}/snippets $LISPDIR/snippets
cp "${fontsConf}" $LISPDIR/fonts.conf
cp "${configFile}" $LISPDIR/config.json
export FONTCONFIG_FILE="$LISPDIR/fonts.conf"
chmod 755 $LISPDIR -R
emacs --batch -l $LISPDIR/lisp/build.el $LISPDIR/config.json $STARTUP_FILE
#emacs -Q --batch -l package --eval "(package-generate-autoloads \"fg42_init" \"$LISPDIR\")"
emacs --batch -l loaddefs-gen -f loaddefs-generate-batch $LISPDIR/lisp/ $LISPDIR/lisp/ ${emacsBundle}
2024-02-22 14:19:57 +00:00
2024-04-05 22:32:40 +01:00
cat >> $out/share/applications/FG42.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=FG42
GenericName=FG42
Comment=The nix base Emacs bundle for advance users
MimeType=${mimeTypes}
2024-04-05 22:32:40 +01:00
Type=Application
Terminal=false
Categories=Development;TextEditor;
StartupWMClass=FG42
Exec=${placeholder "out"}/bin/fg42
Icon=fg42
Version=${version}
EOF
cat >> $out/share/runtime_deps << EOF
${lib.strings.concatLines runtimeDependencies}
${emacsBundle}
EOF
2024-02-22 14:19:57 +00:00
cd $LISPDIR
#compile stuff
2024-02-22 14:19:57 +00:00
cd -
cat >> $out/bin/fg42 << EOF
#!${stdenv.shell}
export PATH=${pathsStr}:$PATH
export FONTCONFIG_FILE="$LISPDIR/fonts.conf"
export STARTUP_FILE=$LISPDIR/lisp/fg42_init.el
2024-02-22 14:19:57 +00:00
LIBRARY_PATH="\$(${stdenv.cc}/bin/cc -print-file-name=libgccjit.so):\$LIBRARY_PATH" \
FG42_WM=fales ${emacsBundle}/bin/emacs \
--name FG42 \
-q --no-splash --title FG42 \
-l "$STARTUP_FILE" "\$@"
2024-02-22 14:19:57 +00:00
EOF
chmod +x $out/bin/fg42
LISPDIR=$out/share/fg42/lisp/
mkdir -p $LISPDIR
#emacs --batch -l package --eval "(package-generate-autoloads \"${pname}\" \"$LISPDIR\")"
2024-02-22 14:19:57 +00:00
runHook postBuild
cat >> $out/bin/fg42-wm << EOF
#!${stdenv.shell}
2024-03-09 22:00:49 +00:00
export PATH=${pathsStr}:\$PATH
export FONTCONFIG_FILE="$LISPDIR/fonts.conf"
export STARTUP_FILE=$LISPDIR/lisp/fg42_init.el
2024-02-22 14:19:57 +00:00
# Disable access control for the current user.
2024-03-09 22:00:49 +00:00
${xorg.xhost}/bin/xhost +SI:localuser:\$USER
2024-02-22 14:19:57 +00:00
# Make Java applications aware this is a non-reparenting window manager.
export _JAVA_AWT_WM_NONREPARENTING=1
# Set default cursor.
xsetroot -cursor_name left_ptr
# Set keyboard repeat rate.
xset r rate 400 30
# Uncomment the following block to use the exwm-xim module.
# export XMODIFIERS=@im=exwm-xim
# export GTK_IM_MODULE=xim
# export QT_IM_MODULE=xim
# export CLUTTER_IM_MODULE=xim
LIBRARY_PATH="\$(${stdenv.cc}/bin/cc -print-file-name=libgccjit.so):\$LIBRARY_PATH" \
FG42_WM=true ${emacsBundle}/bin/emacs \
--name FG42 \
-q --no-splash --title FG42 \
-l $STARTUP_FILE "\$@"
2024-02-22 14:19:57 +00:00
EOF
chmod +x $out/bin/fg42-wm
runHook postBuild
'';
2024-03-27 23:50:44 +00:00
buildInputs = [ emacs emacsBundle git texinfo gcc bash ];
2024-02-22 14:19:57 +00:00
addEmacsNativeLoadPath = true;
meta = {
broken = false;
platforms = emacs.meta.platforms;
homepage = "https://fg42.org/";
maintainers = [ maintainers.lxsameer ];
description = "The mighty editor for the Emacsians";
2024-02-22 14:19:57 +00:00
longDescription = ''
2024-03-27 23:50:44 +00:00
FG42 is a framework to create and editor and window manager based on GNU/Emacs.
It has a pre-defined setup as well which can be installed out of the box. But the
goal of this project is to provide the API necessary to create an integrated editor.
2024-03-27 23:50:44 +00:00
So you need to know about Emacs in advance.
'';
2024-02-22 14:19:57 +00:00
license = lib.licenses.gpl3Plus;
};
}