diff --git a/pkgs/development/interpreters/racket/default.nix b/pkgs/development/interpreters/racket/default.nix index 4a16416374ff..b5c40f363e3f 100644 --- a/pkgs/development/interpreters/racket/default.nix +++ b/pkgs/development/interpreters/racket/default.nix @@ -2,208 +2,256 @@ lib, stdenv, fetchurl, - makeFontsConf, - cacert, - cairo, - coreutils, - fontconfig, - freefont_ttf, - glib, - gmp, - gtk3, - glibcLocales, - libedit, - libffi, - libiconv, - libGL, - libGLU, - libjpeg, + + libiconvReal, + libz, + lz4, ncurses, - libpng, - libtool, - mpfr, openssl, + + isMinimal ? false, + + cairo, + fontconfig, + glib, + glibcLocales, + gtk3, + libGL, + libiodbc, + libjpeg, + libpng, + makeFontsConf, pango, - poppler, - readline, sqlite, - disableDocs ? false, - CoreFoundation, - gsettings-desktop-schemas, + unixODBC, wrapGAppsHook3, + + disableDocs ? false, + + callPackage, + writers, }: 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 + makeLibPaths = lib.concatMapStringsSep " " ( + lib.flip lib.pipe [ + lib.getLib + (x: ''"${x}/lib"'') ] ); + + manifest = lib.importJSON ./manifest.json; + inherit (stdenv.hostPlatform) isDarwin isStatic; + + runtimeDeps = [ openssl ]; + mainDistDeps = [ + (if isDarwin then libiodbc else unixODBC) + cairo + fontconfig + glib + gtk3 + libGL + libjpeg + libpng + pango + sqlite + ]; in -stdenv.mkDerivation rec { +stdenv.mkDerivation (finalAttrs: { pname = "racket"; - version = "8.14"; # always change at once with ./minimal.nix + inherit (manifest) version; 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="; - }; + let + info = manifest.${if isMinimal then "minimal" else "full"}; + in + fetchurl { + url = "https://mirror.racket-lang.org/installers/${manifest.version}/${info.filename}"; + inherit (info) sha256; + }; - FONTCONFIG_FILE = fontsConf; - LD_LIBRARY_PATH = libPath; - NIX_LDFLAGS = lib.concatStringsSep " " [ - (lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isDarwin) "-lgcc_s") - ]; - - nativeBuildInputs = [ - cacert + nativeBuildInputs = lib.optionals (!isMinimal) [ wrapGAppsHook3 ]; - buildInputs = - [ - fontconfig - libffi - libtool - sqlite - gsettings-desktop-schemas - gtk3 - ncurses - ] - ++ lib.optionals stdenv.hostPlatform.isDarwin [ - libiconv - CoreFoundation - ]; + buildInputs = [ + libiconvReal + libz + lz4 + ncurses + ]; - 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 + patches = lib.optionals isDarwin [ + /* + 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. + */ + ./patches/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. + /* + 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. + */ + lib.optionalString isDarwin '' substituteInPlace src/ChezScheme/zlib/configure \ - --replace 'ARFLAGS="-o"' 'AR=ar; ARFLAGS="rc"' - + --replace-fail '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; + configureFlags = + [ + "--enable-check" + "--enable-csonly" + "--enable-liblz4" + "--enable-libz" + ] + ++ lib.optional disableDocs "--disable-docs" + ++ lib.optionals (!isStatic) [ + # instead of `--disable-static` that `stdenv` assumes + "--disable-libs" + # "not currently supported" in `configure --help-cs` but still emphasized in README + "--enable-shared" + ] + ++ lib.optionals isDarwin [ + "--disable-strip" + # "use Unix style (e.g., use Gtk) for Mac OS", which eliminates many problems + "--enable-xonx" + ]; - dontStrip = stdenv.hostPlatform.isDarwin; + preBuild = + let + libPaths = makeLibPaths mainDistDeps; + libPathsVar = if isDarwin then "DYLD_FALLBACK_LIBRARY_PATH" else "LD_LIBRARY_PATH"; + in + lib.optionalString (!isMinimal) ( + /* + Makes FFIs available for setting up `main-distribution` and its + dependencies, which is integrated into the build process of Racket + */ + '' + for lib_path in ${libPaths}; do + addToSearchPath ${libPathsVar} $lib_path + done + '' + # Fixes Fontconfig errors + + '' + export FONTCONFIG_FILE=${makeFontsConf { fontDirectories = [ ]; }} + export XDG_CACHE_HOME=$(mktemp -d) + '' + ); - 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. + dontStrip = isDarwin; + + preFixup = lib.optionalString (!isMinimal && !isDarwin) '' + gappsWrapperArgs+=("--set" "LOCALE_ARCHIVE" "${glibcLocales}/lib/locale/locale-archive") + ''; + + postFixup = + let + libPaths = makeLibPaths (runtimeDeps ++ lib.optionals (!isMinimal) mainDistDeps); + in + '' + $out/bin/racket -f - < Racket is distributed under the MIT license and the Apache version 2.0 + > license, at your option. + + > The Racket runtime system embeds Chez Scheme, which is distributed + > under the Apache version 2.0 license. + */ + license = with lib.licenses; [ + asl20 mit ]; - maintainers = [ ]; - platforms = [ - "x86_64-darwin" - "x86_64-linux" - "aarch64-linux" - "aarch64-darwin" - ]; + maintainers = with lib.maintainers; [ rc-zb ]; + mainProgram = "racket"; + platforms = lib.platforms.${if isMinimal then "all" else "unix"}; + badPlatforms = lib.platforms.darwin; }; -} +}) diff --git a/pkgs/development/interpreters/racket/force-cs-variant.patch b/pkgs/development/interpreters/racket/force-cs-variant.patch deleted file mode 100644 index 6acbe5dc95d3..000000000000 --- a/pkgs/development/interpreters/racket/force-cs-variant.patch +++ /dev/null @@ -1,18 +0,0 @@ -Hardcode Racket variant to CS - -Hardcode variant detection because nixpkgs wraps the Racket binary making it -fail to detect its variant at runtime. -https://github.com/NixOS/nixpkgs/issues/114993#issuecomment-812951247 - ---- old/collects/setup/variant.rkt -+++ new/collects/setup/variant.rkt -@@ -7,7 +7,8 @@ - (provide variant-suffix - script-variant?) - --(define plain-variant -+(define plain-variant 'cs) -+#;(define plain-variant - (delay/sync - (cond - [(cross-installation?) diff --git a/pkgs/development/interpreters/racket/manifest.json b/pkgs/development/interpreters/racket/manifest.json new file mode 100644 index 000000000000..adb19437139a --- /dev/null +++ b/pkgs/development/interpreters/racket/manifest.json @@ -0,0 +1,11 @@ +{ + "version": "8.15", + "full": { + "filename": "racket-8.15-src.tgz", + "sha256": "602b848459daf1b2222a46a9094e85ae2d28e480067219957fa46af8400e1233" + }, + "minimal": { + "filename": "racket-minimal-8.15-src.tgz", + "sha256": "1ac132c56bc52312049fa4f0849237f66713e8e0a7ab6c4780504633ee8f1dc3" + } +} diff --git a/pkgs/development/interpreters/racket/minimal.nix b/pkgs/development/interpreters/racket/minimal.nix deleted file mode 100644 index 3314f6d02a64..000000000000 --- 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/development/interpreters/racket/force-remove-codesign-then-add.patch b/pkgs/development/interpreters/racket/patches/force-remove-codesign-then-add.patch similarity index 100% rename from pkgs/development/interpreters/racket/force-remove-codesign-then-add.patch rename to pkgs/development/interpreters/racket/patches/force-remove-codesign-then-add.patch diff --git a/pkgs/development/interpreters/racket/tests/draw-crossing.nix b/pkgs/development/interpreters/racket/tests/draw-crossing.nix new file mode 100644 index 000000000000..a4f0fabfe685 --- /dev/null +++ b/pkgs/development/interpreters/racket/tests/draw-crossing.nix @@ -0,0 +1,18 @@ +{ runCommandLocal, racket }: + +runCommandLocal "racket-test-draw-crossing" + { + nativeBuildInputs = [ racket ]; + } + '' + racket -f - <