diff options
Diffstat (limited to 'pkgs/development/compilers/nim/default.nix')
-rw-r--r-- | pkgs/development/compilers/nim/default.nix | 342 |
1 files changed, 192 insertions, 150 deletions
diff --git a/pkgs/development/compilers/nim/default.nix b/pkgs/development/compilers/nim/default.nix index 75b1a0f0020..676e35b06bb 100644 --- a/pkgs/development/compilers/nim/default.nix +++ b/pkgs/development/compilers/nim/default.nix @@ -1,22 +1,10 @@ # https://nim-lang.github.io/Nim/packaging.html +# https://nim-lang.org/docs/nimc.html -{ stdenv, lib, fetchurl, fetchgit, fetchFromGitHub, makeWrapper, gdb, openssl -, pcre, readline, boehmgc, sqlite, nim-unwrapped, nimble-unwrapped }: +{ lib, buildPackages, stdenv, fetchurl, fetchgit, fetchFromGitHub, makeWrapper +, openssl, pcre, readline, boehmgc, sqlite, nim-unwrapped }: let - version = "1.4.4"; - src = fetchurl { - url = "https://nim-lang.org/download/nim-${version}.tar.xz"; - sha256 = "03k642nnjca0s6jlbn1v4jld51mbkix97jli4ky74gqlxyfp4wvd"; - }; - - meta = with lib; { - description = "Statically typed, imperative programming language"; - homepage = "https://nim-lang.org/"; - license = licenses.mit; - maintainers = with maintainers; [ ehmry ]; - }; - parseCpu = platform: with platform; # Derive a Nim CPU identifier @@ -83,197 +71,251 @@ let nimHost = parsePlatform stdenv.hostPlatform; nimTarget = parsePlatform stdenv.targetPlatform; - wrapperInputs = rec { + bootstrapCompiler = stdenv.mkDerivation rec { + pname = "nim-bootstrap"; + version = "0.20.0"; - 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"; + }; - 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; - enableParallelBuilding = true; + installPhase = '' + runHook preInstall + install -Dt $out/bin bin/nim + runHook postInstall + ''; + }; - installPhase = '' - runHook preInstall - install -Dt $out/bin bin/nim - runHook postInstall - ''; - }; +in { - unwrapped = stdenv.mkDerivation { - pname = "nim-unwrapped"; - inherit version src; + nim-unwrapped = stdenv.mkDerivation rec { + pname = "nim-unwrapped"; + version = "1.4.4"; + strictDeps = true; - buildInputs = [ boehmgc openssl pcre readline sqlite ]; + src = fetchurl { + url = "https://nim-lang.org/download/nim-${version}.tar.xz"; + sha256 = "03k642nnjca0s6jlbn1v4jld51mbkix97jli4ky74gqlxyfp4wvd"; + }; - patches = [ - ./NIM_CONFIG_DIR.patch - # Override compiler configuration via an environmental variable + buildInputs = [ boehmgc openssl pcre readline sqlite ]; - ./nixbuild.patch - # Load libraries at runtime by absolute path - ]; + patches = [ + ./NIM_CONFIG_DIR.patch + # Override compiler configuration via an environmental variable - configurePhase = '' - runHook preConfigure - cp ${bootstrap}/bin/nim bin/ - echo 'define:nixbuild' >> config/nim.cfg - runHook postConfigure - ''; + ./nixbuild.patch + # Load libraries at runtime by absolute path + ]; - kochArgs = [ - "--cpu:${nimHost.cpu}" - "--os:${nimHost.os}" - "-d:release" - "-d:useGnuReadline" - ] ++ lib.optional (stdenv.isDarwin || stdenv.isLinux) - "-d:nativeStacktrace"; + configurePhase = '' + runHook preConfigure + cp ${bootstrapCompiler}/bin/nim bin/ + echo 'define:nixbuild' >> config/nim.cfg + runHook postConfigure + ''; - buildPhase = '' - runHook preBuild - local HOME=$TMPDIR - ./bin/nim c koch - ./koch boot $kochArgs --parallelBuild:$NIX_BUILD_CORES - ./koch toolsNoExternal $kochArgs --parallelBuild:$NIX_BUILD_CORES - runHook postBuild - ''; + 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 toolsNoExternal $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 - ''; + installPhase = '' + runHook preInstall + install -Dt $out/bin bin/* + ln -sf $out/nim/bin/nim $out/bin/nim + ./install.sh $out + runHook postInstall + ''; - inherit meta; + meta = with lib; { + description = "Statically typed, imperative programming language"; + homepage = "https://nim-lang.org/"; + license = licenses.mit; + maintainers = with maintainers; [ ehmry ]; }; + }; - nimble-unwrapped = stdenv.mkDerivation rec { - pname = "nimble-unwrapped"; - version = "0.13.1"; - - src = fetchFromGitHub { - owner = "nim-lang"; - repo = "nimble"; - rev = "v" + version; - sha256 = "1idb4r0kjbqv16r6bgmxlr13w2vgq5332hmnc8pjbxiyfwm075x8"; - }; + nimble-unwrapped = stdenv.mkDerivation rec { + pname = "nimble-unwrapped"; + version = "0.13.1"; + strictDeps = true; - nativeBuildInputs = [ nim-unwrapped ]; - buildInputs = [ openssl ]; + src = fetchFromGitHub { + owner = "nim-lang"; + repo = "nimble"; + rev = "v${version}"; + sha256 = "1idb4r0kjbqv16r6bgmxlr13w2vgq5332hmnc8pjbxiyfwm075x8"; + }; - nimFlags = [ "--cpu:${nimHost.cpu}" "--os:${nimHost.os}" "-d:release" ]; + depsBuildBuild = [ nim-unwrapped ]; + buildInputs = [ openssl ]; - buildPhase = '' - runHook preBuild - HOME=$NIX_BUILD_TOP nim c $nimFlags src/nimble - runHook postBuild - ''; + nimFlags = [ "--cpu:${nimHost.cpu}" "--os:${nimHost.os}" "-d:release" ]; - installPhase = '' - runHook preBuild - install -Dt $out/bin src/nimble - runHook postBuild - ''; - }; + buildPhase = '' + runHook preBuild + HOME=$NIX_BUILD_TOP nim c $nimFlags src/nimble + runHook postBuild + ''; + installPhase = '' + runHook preBuild + install -Dt $out/bin src/nimble + runHook postBuild + ''; }; - wrapped = let - nim' = nim-unwrapped; - nimble' = nimble-unwrapped; + nim = let + nim' = buildPackages.nim-unwrapped; + nimble' = buildPackages.nimble-unwrapped; inherit (stdenv) targetPlatform; in stdenv.mkDerivation { name = "${targetPlatform.config}-nim-wrapper-${nim'.version}"; inherit (nim') version; preferLocalBuild = true; + strictDeps = true; nativeBuildInputs = [ makeWrapper ]; + patches = [ + ./nim.cfg.patch + # Remove configurations that clash with ours + ]; + unpackPhase = '' runHook preUnpack - tar xf ${nim'.src} nim-$version/config/nim.cfg + tar xf ${nim'.src} nim-$version/config cd nim-$version runHook postUnpack ''; dontConfigure = true; + buildPhase = + # Configure the Nim compiler to use $CC and $CXX as backends + # The compiler is configured by two configuration files, each with + # a different DSL. The order of evaluation matters and that order + # is not documented, so duplicate the configuration across both files. + '' + runHook preBuild + cat >> config/config.nims << WTF + + switch("os", "${nimTarget.os}") + switch("cpu", "${nimTarget.cpu}") + switch("define", "nixbuild") + + # Configure the compiler using the $CC set by Nix at build time + import strutils + let cc = getEnv"CC" + if cc.contains("gcc"): + switch("cc", "gcc") + elif cc.contains("clang"): + switch("cc", "clang") + WTF + + mv config/nim.cfg config/nim.cfg.old + cat > config/nim.cfg << WTF + os = "${nimTarget.os}" + cpu = "${nimTarget.cpu}" + define:"nixbuild" + WTF + + cat >> config/nim.cfg < config/nim.cfg.old + rm config/nim.cfg.old + + cat >> config/nim.cfg << WTF + + clang.cpp.exe %= "\$CXX" + clang.cpp.linkerexe %= "\$CXX" + clang.exe %= "\$CC" + clang.linkerexe %= "\$CC" + gcc.cpp.exe %= "\$CXX" + gcc.cpp.linkerexe %= "\$CXX" + gcc.exe %= "\$CC" + gcc.linkerexe %= "\$CC" + WTF + + runHook postBuild + ''; + wrapperArgs = [ - "--prefix PATH : ${lib.makeBinPath [ stdenv.cc gdb ]}:${ + "--prefix PATH : ${lib.makeBinPath [ buildPackages.gdb ]}:${ placeholder "out" }/bin" - "--prefix LD_LIBRARY_PATH : ${ - lib.makeLibraryPath [ stdenv.cc.libc openssl ] - }" + # Used by nim-gdb + + "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ openssl pcre ]}" + # These libraries may be referred to by the standard library. + # This is broken for cross-compilation because the package + # set will be shifted back by nativeBuildInputs. + "--set NIM_CONFIG_PATH ${placeholder "out"}/etc/nim" + # Use the custom configuration + ''--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 + installPhase = '' + runHook preInstall - makeWrapper \ - ${nim'}/nim/bin/nim $out/bin/${targetPlatform.config}-nim \ - $wrapperArgs - ln -s $out/bin/${targetPlatform.config}-nim $out/bin/nim + mkdir -p $out/bin $out/etc + + cp -r config $out/etc/nim + for binpath in ${nim'}/bin/nim?*; do + local binname=`basename $binpath` makeWrapper \ - ${nim'}/bin/testament $out/bin/${targetPlatform.config}-testament \ + $binpath $out/bin/${targetPlatform.config}-$binname \ $wrapperArgs - ln -s $out/bin/${targetPlatform.config}-testament $out/bin/testament + ln -s $out/bin/${targetPlatform.config}-$binname $out/bin/$binname + done - makeWrapper \ - ${nimble'}/bin/nimble $out/bin/${targetPlatform.config}-nimble \ - --suffix PATH : $out/bin - ln -s $out/bin/${targetPlatform.config}-nimble $out/bin/nimble + makeWrapper \ + ${nim'}/nim/bin/nim $out/bin/${targetPlatform.config}-nim \ + $wrapperArgs + ln -s $out/bin/${targetPlatform.config}-nim $out/bin/nim - runHook postBuild - ''; + makeWrapper \ + ${nim'}/bin/testament $out/bin/${targetPlatform.config}-testament \ + $wrapperArgs + ln -s $out/bin/${targetPlatform.config}-testament $out/bin/testament + + makeWrapper \ + ${nimble'}/bin/nimble $out/bin/${targetPlatform.config}-nimble \ + --suffix PATH : $out/bin + ln -s $out/bin/${targetPlatform.config}-nimble $out/bin/nimble - dontInstall = true; + runHook postInstall + ''; + + passthru = { + nim = nim'; + nimble = nimble'; + }; - meta = meta // { + meta = nim'.meta // { description = nim'.meta.description + " (${targetPlatform.config} wrapper)"; - platforms = lib.platforms.unix; + platforms = with lib.platforms; unix ++ genode; }; }; -in wrapped // wrapperInputs +} |