From b2fc71f3e53aaa1f9a70d2f15551637bd2e8c072 Mon Sep 17 00:00:00 2001 From: rczb Date: Sat, 14 Dec 2024 21:43:36 +0800 Subject: [PATCH] racket and racket-minimal: refactor for smaller minimal distribution --- .../interpreters/racket/default.nix | 272 ++++++------------ .../interpreters/racket/minimal.nix | 138 ++++++++- 2 files changed, 211 insertions(+), 199 deletions(-) diff --git a/pkgs/development/interpreters/racket/default.nix b/pkgs/development/interpreters/racket/default.nix index 4a16416374ff14..2f88d18ce63b6f 100644 --- a/pkgs/development/interpreters/racket/default.nix +++ b/pkgs/development/interpreters/racket/default.nix @@ -1,209 +1,109 @@ { lib, stdenv, - fetchurl, + racket-minimal, makeFontsConf, - cacert, + freefont_ttf, cairo, - coreutils, fontconfig, - freefont_ttf, glib, gmp, gtk3, - glibcLocales, + gsettings-desktop-schemas, libedit, - libffi, - libiconv, - libGL, - libGLU, libjpeg, - ncurses, libpng, - libtool, mpfr, openssl, pango, poppler, readline, sqlite, - disableDocs ? false, - CoreFoundation, - gsettings-desktop-schemas, + libGL, + libGLU, + cacert, wrapGAppsHook3, -}: - -let - - fontsConf = makeFontsConf { fontDirectories = [ freefont_ttf ]; }; - - libPath = lib.makeLibraryPath ( - [ - cairo - fontconfig - glib - gmp - gtk3 - gsettings-desktop-schemas - libedit - libjpeg - libpng - mpfr - ncurses - openssl - pango - poppler - readline - sqlite - ] - ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [ - libGL - libGLU - ] - ); -in - -stdenv.mkDerivation rec { - pname = "racket"; - version = "8.14"; # always change at once with ./minimal.nix - - src = - (lib.makeOverridable ( - { name, hash }: - fetchurl { - url = "https://mirror.racket-lang.org/installers/${version}/${name}-src.tgz"; - inherit hash; - } - )) - { - name = "${pname}-${version}"; - hash = "sha256-qrjMDbM27S04KAPHCK1VqV/FKkQ2yRL2FvfEnUhFriw="; - }; - - FONTCONFIG_FILE = fontsConf; - LD_LIBRARY_PATH = libPath; - NIX_LDFLAGS = lib.concatStringsSep " " [ - (lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isDarwin) "-lgcc_s") - ]; - - nativeBuildInputs = [ - cacert - wrapGAppsHook3 - ]; - - buildInputs = - [ - fontconfig - libffi - libtool - sqlite - gsettings-desktop-schemas - gtk3 - ncurses - ] - ++ lib.optionals stdenv.hostPlatform.isDarwin [ - libiconv - CoreFoundation - ]; - - patches = [ - # Hardcode variant detection because we wrap the Racket binary making it - # fail to detect its variant at runtime. - # See: https://github.com/NixOS/nixpkgs/issues/114993#issuecomment-812951247 - ./force-cs-variant.patch - - # The entry point binary $out/bin/racket is codesigned at least once. The - # following error is triggered as a result. - # (error 'add-ad-hoc-signature "file already has a signature") - # We always remove the existing signature then call add-ad-hoc-signature to - # circumvent this error. - ./force-remove-codesign-then-add.patch - ]; - - preConfigure = - '' - unset AR - for f in src/lt/configure src/cs/c/configure src/bc/src/string.c; do - substituteInPlace "$f" \ - --replace /usr/bin/uname ${coreutils}/bin/uname \ - --replace /bin/cp ${coreutils}/bin/cp \ - --replace /bin/ln ${coreutils}/bin/ln \ - --replace /bin/rm ${coreutils}/bin/rm \ - --replace /bin/true ${coreutils}/bin/true - done - - # The configure script forces using `libtool -o` as AR on Darwin. But, the - # `-o` option is only available from Apple libtool. GNU ar works here. - substituteInPlace src/ChezScheme/zlib/configure \ - --replace 'ARFLAGS="-o"' 'AR=ar; ARFLAGS="rc"' - - mkdir src/build - cd src/build - - '' - + lib.optionalString stdenv.hostPlatform.isLinux '' - gappsWrapperArgs+=("--prefix" "LD_LIBRARY_PATH" ":" ${libPath}) - gappsWrapperArgs+=("--set" "LOCALE_ARCHIVE" "${glibcLocales}/lib/locale/locale-archive") - '' - + lib.optionalString stdenv.hostPlatform.isDarwin '' - gappsWrapperArgs+=("--prefix" "DYLD_LIBRARY_PATH" ":" ${libPath}) - ''; - - preBuild = lib.optionalString stdenv.hostPlatform.isDarwin '' - # Cannot set DYLD_LIBRARY_PATH as an attr of this drv, becasue dynamic - # linker environment variables like this are purged. - # See: https://apple.stackexchange.com/a/212954/167199 + CoreFoundation, + glibcLocales, - # Make builders feed it to dlopen(...). Do not expose all of $libPath to - # DYLD_LIBRARY_PATH as the order of looking up symbols like - # `__cg_jpeg_resync_to_restart` will be messed up. Our libJPEG.dyllib - # expects it from our libTIFF.dylib, but instead it could not be found from - # the system `libTIFF.dylib`. DYLD_FALLBACK_LIBRARY_PATH has its own problem - # , too. - export DYLD_FALLBACK_LIBRARY_PATH="${libPath}" - ''; + disableDocs ? false, +}: - shared = if stdenv.hostPlatform.isDarwin then "dylib" else "shared"; - configureFlags = - [ - "--enable-${shared}" - "--enable-lt=${libtool}/bin/libtool" - ] - ++ lib.optionals disableDocs [ "--disable-docs" ] - ++ lib.optionals stdenv.hostPlatform.isDarwin [ - "--disable-strip" - "--enable-xonx" +racket-minimal.overrideAttrs ( + finalAttrs: previousAttrs: { + pname = "racket"; + version = "8.14"; + + src = previousAttrs.src.override { + hash = "sha256-qrjMDbM27S04KAPHCK1VqV/FKkQ2yRL2FvfEnUhFriw="; + }; + + FONTCONFIG_FILE = makeFontsConf { fontDirectories = [ freefont_ttf ]; }; + + libraries = + previousAttrs.libraries + ++ [ + cairo + fontconfig + glib + gmp + gtk3 + gsettings-desktop-schemas + libedit + libjpeg + libpng + mpfr + openssl + pango + poppler + readline + sqlite + ] + ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [ + libGL + libGLU + ]; + + nativeBuildInputs = previousAttrs.nativeBuildInputs ++ [ + cacert + wrapGAppsHook3 ]; - configureScript = "../configure"; - - enableParallelBuilding = false; - - dontStrip = stdenv.hostPlatform.isDarwin; - - meta = with lib; { - description = "Programmable programming language"; - longDescription = '' - Racket is a full-spectrum programming language. It goes beyond - Lisp and Scheme with dialects that support objects, types, - laziness, and more. Racket enables programmers to link - components written in different dialects, and it empowers - programmers to create new, project-specific dialects. Racket's - libraries support applications from web servers and databases to - GUIs and charts. - ''; - homepage = "https://racket-lang.org/"; - changelog = "https://github.com/racket/racket/releases/tag/v${version}"; - license = with licenses; [ - asl20 # or - mit - ]; - maintainers = [ ]; - platforms = [ - "x86_64-darwin" - "x86_64-linux" - "aarch64-linux" - "aarch64-darwin" - ]; - }; -} + buildInputs = + previousAttrs.buildInputs + ++ [ + fontconfig + sqlite + gsettings-desktop-schemas + gtk3 + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + CoreFoundation + ]; + + preConfigure = + previousAttrs.preConfigure + + lib.optionalString stdenv.hostPlatform.isLinux '' + gappsWrapperArgs+=("--prefix" "LD_LIBRARY_PATH" ":" ${finalAttrs.LD_LIBRARY_PATH}) + gappsWrapperArgs+=("--set" "LOCALE_ARCHIVE" "${glibcLocales}/lib/locale/locale-archive") + '' + + lib.optionalString stdenv.hostPlatform.isDarwin '' + gappsWrapperArgs+=("--prefix" "DYLD_LIBRARY_PATH" ":" ${finalAttrs.LD_LIBRARY_PATH}) + ''; + + configureFlags = previousAttrs.configureFlags ++ lib.optional disableDocs "--disable-docs"; + + meta = previousAttrs.meta // { + description = "Programmable programming language"; + longDescription = '' + Racket is a full-spectrum programming language. It goes beyond + Lisp and Scheme with dialects that support objects, types, + laziness, and more. Racket enables programmers to link + components written in different dialects, and it empowers + programmers to create new, project-specific dialects. Racket's + libraries support applications from web servers and databases to + GUIs and charts. + ''; + }; + } +) diff --git a/pkgs/development/interpreters/racket/minimal.nix b/pkgs/development/interpreters/racket/minimal.nix index 3314f6d02a64bc..1ab01bb188c2bc 100644 --- a/pkgs/development/interpreters/racket/minimal.nix +++ b/pkgs/development/interpreters/racket/minimal.nix @@ -1,25 +1,137 @@ -{ racket }: +{ + lib, + stdenv, + fetchurl, + coreutils, + libffi, + libiconvReal, + libz, + lz4, + ncurses, + libtool, +}: -racket.overrideAttrs (oldAttrs: rec { +stdenv.mkDerivation (finalAttrs: { pname = "racket-minimal"; - version = oldAttrs.version; - src = oldAttrs.src.override { - name = "${pname}-${version}"; - hash = "sha256-/BhnyIw4QQ2aMKW8FDJlsalSW3pTLqP74CXJ15td5so="; - }; + version = "8.14"; + + src = lib.makeOverridable ( + { hash }: + fetchurl { + url = "https://mirror.racket-lang.org/installers/${finalAttrs.version}/${finalAttrs.pname}-${finalAttrs.version}-src.tgz"; + inherit hash; + } + ) { hash = "sha256-/BhnyIw4QQ2aMKW8FDJlsalSW3pTLqP74CXJ15td5so="; }; + + libraries = [ ncurses ]; + + LD_LIBRARY_PATH = lib.makeLibraryPath finalAttrs.libraries; + + NIX_LDFLAGS = lib.concatStringsSep " " [ + (lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isDarwin) "-lgcc_s") + ]; + + nativeBuildInputs = [ + libtool + ]; + + buildInputs = [ + libffi + ncurses + libiconvReal + libz + lz4 + ]; + + patches = [ + /* + Hardcode variant detection because we wrap the Racket binary making it + fail to detect its variant at runtime. + See: https://github.com/NixOS/nixpkgs/issues/114993#issuecomment-812951247 + */ + ./force-cs-variant.patch + + /* + The entry point binary $out/bin/racket is codesigned at least once. The + following error is triggered as a result. + (error 'add-ad-hoc-signature "file already has a signature") + We always remove the existing signature then call add-ad-hoc-signature to + circumvent this error. + */ + ./force-remove-codesign-then-add.patch + ]; + + preConfigure = '' + unset AR + for f in src/lt/configure src/cs/c/configure src/bc/src/string.c; do + substituteInPlace "$f" \ + --replace /usr/bin/uname ${coreutils}/bin/uname \ + --replace /bin/cp ${coreutils}/bin/cp \ + --replace /bin/ln ${coreutils}/bin/ln \ + --replace /bin/rm ${coreutils}/bin/rm \ + --replace /bin/true ${coreutils}/bin/true + done + + # The configure script forces using `libtool -o` as AR on Darwin. But, the + # `-o` option is only available from Apple libtool. GNU ar works here. + substituteInPlace src/ChezScheme/zlib/configure \ + --replace 'ARFLAGS="-o"' 'AR=ar; ARFLAGS="rc"' + + mkdir src/build + cd src/build + ''; - meta = oldAttrs.meta // { + shared = if stdenv.hostPlatform.isDarwin then "dylib" else "shared"; + configureFlags = + [ + "--enable-${finalAttrs.shared}" + "--enable-lt=${libtool}/bin/libtool" + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + "--disable-strip" + "--enable-xonx" + ]; + + configureScript = "../configure"; + + /* + Cannot set DYLD_LIBRARY_PATH as an attr of this drv, becasue dynamic linker + environment variables like this are purged. + See: https://apple.stackexchange.com/a/212954/167199 + + Make builders feed it to dlopen(...). Do not expose all of $LD_LIBRARY_PATH + to DYLD_LIBRARY_PATH as the order of looking up symbols like + `__cg_jpeg_resync_to_restart` will be messed up. Our libJPEG.dyllib expects + it from our libTIFF.dylib, but instead it could not be found from the system + `libTIFF.dylib`. DYLD_FALLBACK_LIBRARY_PATH has its own problem, too. + */ + preBuild = lib.optionalString stdenv.hostPlatform.isDarwin '' + export DYLD_FALLBACK_LIBRARY_PATH="${finalAttrs.LD_LIBRARY_PATH}" + ''; + + enableParallelBuilding = false; + + dontStrip = stdenv.hostPlatform.isDarwin; + + meta = { description = "Racket without bundled packages, such as Dr. Racket"; longDescription = '' - The essential package racket-libs is included, - as well as libraries that live in collections. In particular, raco - and the pkg library are still bundled. + Includes just enough of Racket that you can use raco pkg to install more. ''; + homepage = "https://racket-lang.org/"; + changelog = "https://github.com/racket/racket/releases/tag/v${finalAttrs.version}"; + license = with lib.licenses; [ + mit + asl20 + lgpl3Plus + ]; + maintainers = with lib.maintainers; [ rc-zb ]; + mainProgram = "racket"; platforms = [ - "x86_64-linux" + "aarch64-darwin" "aarch64-linux" "x86_64-darwin" - "aarch64-darwin" + "x86_64-linux" ]; }; })