From e3460127b3a12b1d31593dbb0ad086f5e2dd4045 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 --- .../ra}/racket/force-cs-variant.patch | 0 .../force-remove-codesign-then-add.patch | 0 pkgs/by-name/ra/racket/manifest.json | 11 + pkgs/by-name/ra/racket/package.nix | 222 ++++++++++++++++++ .../interpreters/racket/default.nix | 209 ----------------- .../interpreters/racket/minimal.nix | 25 -- pkgs/top-level/all-packages.nix | 5 +- 7 files changed, 234 insertions(+), 238 deletions(-) rename pkgs/{development/interpreters => by-name/ra}/racket/force-cs-variant.patch (100%) rename pkgs/{development/interpreters => by-name/ra}/racket/force-remove-codesign-then-add.patch (100%) create mode 100644 pkgs/by-name/ra/racket/manifest.json create mode 100644 pkgs/by-name/ra/racket/package.nix delete mode 100644 pkgs/development/interpreters/racket/default.nix delete mode 100644 pkgs/development/interpreters/racket/minimal.nix diff --git a/pkgs/development/interpreters/racket/force-cs-variant.patch b/pkgs/by-name/ra/racket/force-cs-variant.patch similarity index 100% rename from pkgs/development/interpreters/racket/force-cs-variant.patch rename to pkgs/by-name/ra/racket/force-cs-variant.patch diff --git a/pkgs/development/interpreters/racket/force-remove-codesign-then-add.patch b/pkgs/by-name/ra/racket/force-remove-codesign-then-add.patch similarity index 100% rename from pkgs/development/interpreters/racket/force-remove-codesign-then-add.patch rename to pkgs/by-name/ra/racket/force-remove-codesign-then-add.patch diff --git a/pkgs/by-name/ra/racket/manifest.json b/pkgs/by-name/ra/racket/manifest.json new file mode 100644 index 00000000000000..1694a564f6c893 --- /dev/null +++ b/pkgs/by-name/ra/racket/manifest.json @@ -0,0 +1,11 @@ +{ + "version": "8.14", + "minimal": { + "filename": "racket-minimal-8.14-src.tgz", + "sha256": "fc1867c88c38410d9a30a5bc143265b1a9525b7a532ea3fbe025c9d79b5de6ca" + }, + "full": { + "filename": "racket-8.14-src.tgz", + "sha256": "aab8cc0db336ed2d382803c708ad55a95fc52a4436c912f616f7c49d4845ae2c" + } +} diff --git a/pkgs/by-name/ra/racket/package.nix b/pkgs/by-name/ra/racket/package.nix new file mode 100644 index 00000000000000..ae6d33b68fd53b --- /dev/null +++ b/pkgs/by-name/ra/racket/package.nix @@ -0,0 +1,222 @@ +{ + lib, + stdenv, + fetchurl, + coreutils, + libffi, + libiconvReal, + libz, + lz4, + ncurses, + libtool, + + minimal ? false, + + makeFontsConf, + freefont_ttf, + cairo, + fontconfig, + glib, + gmp, + gtk3, + gsettings-desktop-schemas, + libedit, + libjpeg, + libpng, + mpfr, + openssl, + pango, + poppler, + readline, + sqlite, + libGL, + libGLU, + cacert, + wrapGAppsHook3, + darwin, + glibcLocales, + + disableDocs ? false, +}: + +let + manifest = lib.importJSON ./manifest.json; +in + +stdenv.mkDerivation (finalAttrs: { + pname = "racket" + lib.optionalString minimal "-minimal"; + inherit (manifest) version; + + src = + let + inherit (manifest.${if minimal then "minimal" else "full"}) filename sha256; + in + fetchurl { + url = "https://mirror.racket-lang.org/installers/${finalAttrs.version}/${filename}"; + inherit sha256; + }; + + FONTCONFIG_FILE = if minimal then null else makeFontsConf { fontDirectories = [ freefont_ttf ]; }; + + LD_LIBRARY_PATH = lib.makeLibraryPath ( + [ ncurses ] + ++ lib.optionals (!minimal) ( + [ + cairo + fontconfig + glib + gmp + gtk3 + gsettings-desktop-schemas + libedit + libjpeg + libpng + mpfr + openssl + pango + poppler + readline + sqlite + ] + ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [ + libGL + libGLU + ] + ) + ); + + NIX_LDFLAGS = lib.concatStringsSep " " [ + (lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isDarwin) "-lgcc_s") + ]; + + nativeBuildInputs = + [ libtool ] + ++ lib.optionals (!minimal) [ + cacert + wrapGAppsHook3 + ]; + + buildInputs = + [ + libffi + ncurses + libiconvReal + libz + lz4 + ] + ++ lib.optionals (!minimal) ( + [ + fontconfig + sqlite + gsettings-desktop-schemas + gtk3 + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + darwin.apple_sdk.frameworks.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; do + substituteInPlace "$f" \ + --replace-fail /usr/bin/uname ${coreutils}/bin/uname + 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-fail 'ARFLAGS="-o"' 'AR=ar; ARFLAGS="rc"' + + mkdir src/build + cd src/build + '' + + lib.optionalString (!minimal) ( + 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}) + '' + ); + + 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" + ] + ++ lib.optional disableDocs "--disable-docs"; + + 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}" + ''; + + dontStrip = stdenv.hostPlatform.isDarwin; + + meta = { + description = + "Programmable programming language" + lib.optionalString minimal " (minimal distribution)"; + 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. + '' + + lib.optionalString minimal '' + + This minimal distribution 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 = if minimal then lib.platforms.all else lib.platforms.unix; + }; +}) diff --git a/pkgs/development/interpreters/racket/default.nix b/pkgs/development/interpreters/racket/default.nix deleted file mode 100644 index 4a16416374ff14..00000000000000 --- a/pkgs/development/interpreters/racket/default.nix +++ /dev/null @@ -1,209 +0,0 @@ -{ - lib, - stdenv, - fetchurl, - makeFontsConf, - cacert, - cairo, - coreutils, - fontconfig, - freefont_ttf, - glib, - gmp, - gtk3, - glibcLocales, - libedit, - libffi, - libiconv, - libGL, - libGLU, - libjpeg, - ncurses, - libpng, - libtool, - mpfr, - openssl, - pango, - poppler, - readline, - sqlite, - disableDocs ? false, - CoreFoundation, - gsettings-desktop-schemas, - 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 - - # 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}" - ''; - - 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" - ]; - - 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" - ]; - }; -} diff --git a/pkgs/development/interpreters/racket/minimal.nix b/pkgs/development/interpreters/racket/minimal.nix deleted file mode 100644 index 3314f6d02a64bc..00000000000000 --- a/pkgs/development/interpreters/racket/minimal.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ racket }: - -racket.overrideAttrs (oldAttrs: rec { - pname = "racket-minimal"; - version = oldAttrs.version; - src = oldAttrs.src.override { - name = "${pname}-${version}"; - hash = "sha256-/BhnyIw4QQ2aMKW8FDJlsalSW3pTLqP74CXJ15td5so="; - }; - - meta = oldAttrs.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. - ''; - platforms = [ - "x86_64-linux" - "aarch64-linux" - "x86_64-darwin" - "aarch64-darwin" - ]; - }; -}) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index e2ba978dc202a1..13f8f85e2268d5 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -7512,10 +7512,7 @@ with pkgs; wireplumber = callPackage ../development/libraries/pipewire/wireplumber.nix { }; - racket = callPackage ../development/interpreters/racket { - inherit (darwin.apple_sdk.frameworks) CoreFoundation; - }; - racket-minimal = callPackage ../development/interpreters/racket/minimal.nix { }; + racket-minimal = racket.override { minimal = true; }; rakudo = callPackage ../development/interpreters/rakudo { }; moarvm = darwin.apple_sdk_11_0.callPackage ../development/interpreters/rakudo/moarvm.nix {