diff --git a/pkgs/development/interpreters/guile/3.0.nix b/pkgs/development/interpreters/guile/3.0.nix new file mode 100644 index 000000000000..5241c03a954e --- /dev/null +++ b/pkgs/development/interpreters/guile/3.0.nix @@ -0,0 +1,141 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, boehmgc +, buildPackages +, coverageAnalysis ? null +, gawk +, gmp +, libffi +, libtool +, libunistring +, makeWrapper +, pkg-config +, pkgsBuildBuild +, readline +}: + +let + # Do either a coverage analysis build or a standard build. + builder = if coverageAnalysis != null + then coverageAnalysis + else stdenv.mkDerivation; +in +builder rec { + pname = "guile"; + version = "3.0.7"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.xz"; + sha256 = "sha256-9X2GxwYgJxv863qb4MgXRKAz8IrcfOuoMsmRerPmkbc="; + }; + + outputs = [ "out" "dev" "info" ]; + setOutputFlags = false; # $dev gets into the library otherwise + + depsBuildBuild = [ + buildPackages.stdenv.cc + ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + pkgsBuildBuild.guile; + nativeBuildInputs = [ + gawk + makeWrapper + pkg-config + ]; + buildInputs = [ + libffi + libtool + libunistring + readline + ]; + propagatedBuildInputs = [ + boehmgc + gmp + + # These ones aren't normally needed here, but `libguile*.la' has '-l' + # flags for them without corresponding '-L' flags. Adding them here will + # add the needed `-L' flags. As for why the `.la' file lacks the `-L' + # flags, see below. + libtool + libunistring + ]; + + # According to Bernhard M. Wiedemann on + # #reproducible-builds on irc.oftc.net, (2020-01-29): they had to build + # Guile without parallel builds to make it reproducible. + # + # re: https://issues.guix.gnu.org/issue/20272 + # re: https://build.opensuse.org/request/show/732638 + enableParallelBuilding = false; + + patches = [ + ./eai_system.patch + ] ++ lib.optional (coverageAnalysis != null) ./gcov-file-name.patch + ++ lib.optional stdenv.isDarwin + (fetchpatch { + url = "https://gitlab.gnome.org/GNOME/gtk-osx/raw/52898977f165777ad9ef169f7d4818f2d4c9b731/patches/guile-clocktime.patch"; + sha256 = "12wvwdna9j8795x59ldryv9d84c1j3qdk2iskw09306idfsis207"; + }); + + # Explicitly link against libgcc_s, to work around the infamous + # "libgcc_s.so.1 must be installed for pthread_cancel to work". + + # don't have "libgcc_s.so.1" on darwin + LDFLAGS = lib.optionalString + (!stdenv.isDarwin && !stdenv.hostPlatform.isStatic) "-lgcc_s"; + + configureFlags = [ + "--with-libreadline-prefix=${lib.getDev readline}" + ] ++ lib.optionals stdenv.isSunOS [ + # Make sure the right is found, and not the incompatible + # /usr/include/mp.h from OpenSolaris. See + # + # for details. + "--with-libgmp-prefix=${lib.getDev gmp}" + + # Same for these (?). + "--with-libunistring-prefix=${libunistring}" + + # See below. + "--without-threads" + ]; + + postInstall = '' + wrapProgram $out/bin/guile-snarf --prefix PATH : "${gawk}/bin" + '' + # XXX: See http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/18903 for + # why `--with-libunistring-prefix' and similar options coming from + # `AC_LIB_LINKFLAGS_BODY' don't work on NixOS/x86_64. + + '' + sed -i "$out/lib/pkgconfig/guile"-*.pc \ + -e "s|-lunistring|-L${libunistring}/lib -lunistring|g ; + s|^Cflags:\(.*\)$|Cflags: -I${libunistring}/include \1|g ; + s|-lltdl|-L${libtool.lib}/lib -lltdl|g ; + s|includedir=$out|includedir=$dev|g + " + ''; + + # make check doesn't work on darwin + # On Linuxes+Hydra the tests are flaky; feel free to investigate deeper. + doCheck = false; + doInstallCheck = doCheck; + + setupHook = ./setup-hook-3.0.sh; + + meta = with lib; { + homepage = "https://www.gnu.org/software/guile/"; + description = "Embeddable Scheme implementation"; + longDescription = '' + GNU Guile is an implementation of the Scheme programming language, with + support for many SRFIs, packaged for use in a wide variety of + environments. In addition to implementing the R5RS Scheme standard and a + large subset of R6RS, Guile includes a module system, full access to POSIX + system calls, networking support, multiple threads, dynamic linking, a + foreign function call interface, and powerful string processing. + ''; + license = licenses.lgpl3Plus; + maintainers = with maintainers; [ ludo lovek323 vrthra ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/development/interpreters/guile/setup-hook-3.0.sh b/pkgs/development/interpreters/guile/setup-hook-3.0.sh new file mode 100644 index 000000000000..e13ec2767fd4 --- /dev/null +++ b/pkgs/development/interpreters/guile/setup-hook-3.0.sh @@ -0,0 +1,19 @@ +addGuileLibPath () { + if test -d "$1/share/guile/site/3.0"; then + export GUILE_LOAD_PATH="${GUILE_LOAD_PATH-}${GUILE_LOAD_PATH:+:}$1/share/guile/site/3.0" + export GUILE_LOAD_COMPILED_PATH="${GUILE_LOAD_COMPILED_PATH-}${GUILE_LOAD_COMPILED_PATH:+:}$1/share/guile/site/3.0" + elif test -d "$1/share/guile/site"; then + export GUILE_LOAD_PATH="${GUILE_LOAD_PATH-}${GUILE_LOAD_PATH:+:}$1/share/guile/site" + export GUILE_LOAD_COMPILED_PATH="${GUILE_LOAD_COMPILED_PATH-}${GUILE_LOAD_COMPILED_PATH:+:}$1/share/guile/site" + fi + + if test -d "$1/lib/guile/3.0/ccache"; then + export GUILE_LOAD_COMPILED_PATH="${GUILE_LOAD_COMPILED_PATH-}${GUILE_LOAD_COMPILED_PATH:+:}$1/lib/guile/3.0/ccache" + fi + + if test -d "$1/lib/guile/3.0/site-ccache"; then + export GUILE_LOAD_COMPILED_PATH="${GUILE_LOAD_COMPILED_PATH-}${GUILE_LOAD_COMPILED_PATH:+:}$1/lib/guile/3.0/site-ccache" + fi +} + +addEnvHooks "$hostOffset" addGuileLibPath diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index ccb76faddde3..5c2596571944 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -13298,6 +13298,8 @@ with pkgs; guile_2_2 = callPackage ../development/interpreters/guile/2.2.nix { }; + guile_3_0 = callPackage ../development/interpreters/guile/3.0.nix { }; + guile = guile_2_2; guile-cairo = callPackage ../development/guile-modules/guile-cairo { };