diff options
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/nim/default.nix')
-rw-r--r-- | nixpkgs/pkgs/development/compilers/nim/default.nix | 288 |
1 files changed, 229 insertions, 59 deletions
diff --git a/nixpkgs/pkgs/development/compilers/nim/default.nix b/nixpkgs/pkgs/development/compilers/nim/default.nix index 53854d4fa35..0ec259b6608 100644 --- a/nixpkgs/pkgs/development/compilers/nim/default.nix +++ b/nixpkgs/pkgs/development/compilers/nim/default.nix @@ -1,69 +1,239 @@ -# based on https://github.com/nim-lang/Nim/blob/v0.18.0/.travis.yml +# https://nim-lang.github.io/Nim/packaging.html -{ stdenv, lib, fetchurl, makeWrapper, openssl, pcre, readline, - boehmgc, sfml, sqlite }: - -stdenv.mkDerivation rec { - pname = "nim"; - version = "1.2.0"; +{ stdenv, lib, fetchgit, fetchurl, makeWrapper, gdb, openssl, pcre, readline +, boehmgc, sqlite, nim-unwrapped, nim }: +let + version = "1.2.6"; src = fetchurl { - url = "https://nim-lang.org/download/${pname}-${version}.tar.xz"; - sha256 = "TpRYOjc5ZYIYBeZl4KBfUvthCRZnbtsJFIlBQVY3xXU="; + url = "https://nim-lang.org/download/nim-${version}.tar.xz"; + sha256 = "0zk5qzxayqjw7kq6p92j4008g9bbyilyymhdc5xq9sln5rqym26z"; }; - enableParallelBuilding = true; - - NIX_LDFLAGS = "-lcrypto -lpcre -lreadline -lgc -lsqlite3"; - - # we could create a separate derivation for the "written in c" version of nim - # used for bootstrapping, but koch insists on moving the nim compiler around - # as part of building it, so it cannot be read-only - - nativeBuildInputs = [ - makeWrapper - ]; - - buildInputs = [ - openssl pcre readline boehmgc sfml sqlite - ]; - - buildPhase = '' - runHook preBuild - - # build.sh wants to write to $HOME/.cache - HOME=$TMPDIR - sh build.sh - ./bin/nim c koch - ./koch boot -d:release \ - -d:useGnuReadline \ - ${lib.optionals (stdenv.isDarwin || stdenv.isLinux) "-d:nativeStacktrace"} - ./koch tools -d:release - - runHook postBuild - ''; - - installPhase = '' - runHook preInstall - - install -Dt $out/bin bin/* koch - ./koch install $out - mv $out/nim/bin/* $out/bin/ && rmdir $out/nim/bin - mv $out/nim/* $out/ && rmdir $out/nim - - # Fortify hardening appends -O2 to gcc flags which is unwanted for unoptimized nim builds. - wrapProgram $out/bin/nim \ - --run 'NIX_HARDENING_ENABLE=''${NIX_HARDENING_ENABLE/fortify/}' \ - --suffix PATH : ${lib.makeBinPath [ stdenv.cc ]} - - runHook postInstall - ''; - - meta = with stdenv.lib; { + meta = with lib; { description = "Statically typed, imperative programming language"; homepage = "https://nim-lang.org/"; license = licenses.mit; maintainers = with maintainers; [ ehmry ]; - platforms = with platforms; linux ++ darwin; # arbitrary }; -} + + parseCpu = platform: + with platform; + # Derive a Nim CPU identifier + if isAarch32 then + "arm" + else if isAarch64 then + "arm64" + else if isAlpha then + "alpha" + else if isAvr then + "avr" + else if isMips && is32bit then + "mips" + else if isMips && is64bit then + "mips64" + else if isMsp430 then + "msp430" + else if isPowerPC && is32bit then + "powerpc" + else if isPowerPC && is64bit then + "powerpc64" + else if isRiscV && is64bit then + "riscv64" + else if isSparc then + "sparc" + else if isx86_32 then + "i386" + else if isx86_64 then + "amd64" + else + abort "no Nim CPU support known for ${config}"; + + parseOs = platform: + with platform; + # Derive a Nim OS identifier + if isAndroid then + "Android" + else if isDarwin then + "MacOSX" + else if isFreeBSD then + "FreeBSD" + else if isGenode then + "Genode" + else if isLinux then + "Linux" + else if isNetBSD then + "NetBSD" + else if isNone then + "Standalone" + else if isOpenBSD then + "OpenBSD" + else if isWindows then + "Windows" + else if isiOS then + "iOS" + else + abort "no Nim OS support known for ${config}"; + + parsePlatform = p: { + cpu = parseCpu p; + os = parseOs p; + }; + + nimHost = parsePlatform stdenv.hostPlatform; + nimTarget = parsePlatform stdenv.targetPlatform; + + wrapperInputs = rec { + + bootstrap = stdenv.mkDerivation rec { + pname = "nim-bootstrap"; + version = "0.20.0"; + + src = fetchgit { + # A Git checkout is much smaller than a GitHub tarball. + url = "https://github.com/nim-lang/csources.git"; + rev = "v" + version; + sha256 = "0i6vsfy1sgapx43n226q8m0pvn159sw2mhp50zm3hhb9zfijanis"; + }; + + enableParallelBuilding = true; + + installPhase = '' + runHook preInstall + install -Dt $out/bin bin/nim + runHook postInstall + ''; + }; + + unwrapped = stdenv.mkDerivation { + pname = "nim-unwrapped"; + inherit version src; + + buildInputs = [ boehmgc openssl pcre readline sqlite ]; + + patches = [ + ./NIM_CONFIG_DIR.patch + # Override compiler configuration via an environmental variable + + ./nixbuild.patch + # Load libraries at runtime by absolute path + ]; + + configurePhase = '' + runHook preConfigure + cp ${bootstrap}/bin/nim bin/ + echo 'define:nixbuild' >> config/nim.cfg + runHook postConfigure + ''; + + kochArgs = [ + "--cpu:${nimHost.cpu}" + "--os:${nimHost.os}" + "-d:release" + "-d:useGnuReadline" + ] ++ lib.optional (stdenv.isDarwin || stdenv.isLinux) + "-d:nativeStacktrace"; + + buildPhase = '' + runHook preBuild + local HOME=$TMPDIR + ./bin/nim c koch + ./koch boot $kochArgs --parallelBuild:$NIX_BUILD_CORES + ./koch tools $kochArgs --parallelBuild:$NIX_BUILD_CORES + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + install -Dt $out/bin bin/* + ln -sf $out/nim/bin/nim $out/bin/nim + ./install.sh $out + runHook postInstall + ''; + + inherit meta; + }; + }; + + wrapped = let + nim = nim-unwrapped; + inherit (stdenv) targetPlatform; + in stdenv.mkDerivation { + name = "${targetPlatform.config}-nim-wrapper-${nim.version}"; + inherit (nim) version; + preferLocalBuild = true; + + nativeBuildInputs = [ makeWrapper ]; + + unpackPhase = '' + runHook preUnpack + tar xf ${nim.src} nim-$version/config/nim.cfg + cd nim-$version + runHook postUnpack + ''; + + dontConfigure = true; + + wrapperArgs = [ + "--prefix PATH : ${lib.makeBinPath [ stdenv.cc gdb ]}:${ + placeholder "out" + }/bin" + "--prefix LD_LIBRARY_PATH : ${ + lib.makeLibraryPath [ stdenv.cc.libc openssl ] + }" + "--set NIM_CONFIG_PATH ${placeholder "out"}/etc/nim" + ''--set NIX_HARDENING_ENABLE "''${NIX_HARDENING_ENABLE/fortify}"'' + # Fortify hardening appends -O2 to gcc flags which is unwanted for unoptimized nim builds. + ]; + + buildPhase = with stdenv; + let + ccType = if cc.isGNU then + "gcc" + else if cc.isClang then + "clang" + else + abort "no Nim configuration available for ${cc.name}"; + in '' + runHook preBuild + cat >> config/nim.cfg << EOF + + define:nixbuild + os = ${nimTarget.os} + cpu = ${nimTarget.cpu} + cc = ${ccType} + EOF + + mkdir -p $out/bin $out/etc/nim + export cc=$CC + export cxx=$CXX + substituteAll config/nim.cfg $out/etc/nim/nim.cfg \ + --replace "cc = gcc" "" + + for binpath in ${nim}/bin/nim?*; do + local binname=`basename $binpath` + makeWrapper \ + $binpath $out/bin/${targetPlatform.config}-$binname \ + $wrapperArgs + ln -s $out/bin/${targetPlatform.config}-$binname $out/bin/$binname + done + + makeWrapper \ + ${nim}/nim/bin/nim $out/bin/${targetPlatform.config}-nim \ + $wrapperArgs + ln -s $out/bin/${targetPlatform.config}-nim $out/bin/nim + + runHook postBuild + ''; + + dontInstall = true; + + meta = meta // { + description = nim.meta.description + + " (${targetPlatform.config} wrapper)"; + platforms = lib.platforms.unix; + }; + + }; + +in wrapped // wrapperInputs |