From 45398d7b54d5910d026fa67c62be16d2444d6f4a Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 2 Sep 2021 19:03:01 +0200 Subject: Initial nimPackages utilities Add a nimPackages attrset with "buildNimPackage" and "fetchNimble". --- pkgs/development/compilers/nim/default.nix | 252 +++++++++++++++-------------- 1 file changed, 128 insertions(+), 124 deletions(-) (limited to 'pkgs/development/compilers/nim') diff --git a/pkgs/development/compilers/nim/default.nix b/pkgs/development/compilers/nim/default.nix index 25b1c48735725..ed46b988d2c64 100644 --- a/pkgs/development/compilers/nim/default.nix +++ b/pkgs/development/compilers/nim/default.nix @@ -1,8 +1,9 @@ # https://nim-lang.github.io/Nim/packaging.html # https://nim-lang.org/docs/nimc.html -{ lib, buildPackages, stdenv, fetchurl, fetchgit, fetchFromGitHub, makeWrapper -, openssl, pcre, readline, boehmgc, sqlite, nim-unwrapped }: +{ lib, callPackage, buildPackages, stdenv, fetchurl, fetchgit, fetchFromGitHub +, makeWrapper, openssl, pcre, readline, boehmgc, sqlite, nim-unwrapped +, nimble-unwrapped }: let parseCpu = platform: @@ -186,138 +187,141 @@ in { 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 - 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 + self = 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 + cd nim-$version + runHook postUnpack ''; - wrapperArgs = [ - "--prefix PATH : ${lib.makeBinPath [ buildPackages.gdb ]}:${ - placeholder "out" - }/bin" - # 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. - ]; - - installPhase = '' - runHook preInstall - - mkdir -p $out/bin $out/etc + 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 [ buildPackages.gdb ]}:${ + placeholder "out" + }/bin" + # 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. + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin $out/etc + + cp -r config $out/etc/nim + + 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 - cp -r config $out/etc/nim + makeWrapper \ + ${nim'}/nim/bin/nim $out/bin/${targetPlatform.config}-nim \ + --set-default CC $(command -v $CC) \ + --set-default CXX $(command -v $CXX) \ + $wrapperArgs + ln -s $out/bin/${targetPlatform.config}-nim $out/bin/nim - for binpath in ${nim'}/bin/nim?*; do - local binname=`basename $binpath` makeWrapper \ - $binpath $out/bin/${targetPlatform.config}-$binname \ + ${nim'}/bin/testament $out/bin/${targetPlatform.config}-testament \ $wrapperArgs - ln -s $out/bin/${targetPlatform.config}-$binname $out/bin/$binname - done - - makeWrapper \ - ${nim'}/nim/bin/nim $out/bin/${targetPlatform.config}-nim \ - --set-default CC $(command -v $CC) \ - --set-default CXX $(command -v $CXX) \ - $wrapperArgs - ln -s $out/bin/${targetPlatform.config}-nim $out/bin/nim - - 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 + ln -s $out/bin/${targetPlatform.config}-testament $out/bin/testament - runHook postInstall - ''; + makeWrapper \ + ${nimble'}/bin/nimble $out/bin/${targetPlatform.config}-nimble \ + --suffix PATH : $out/bin + ln -s $out/bin/${targetPlatform.config}-nimble $out/bin/nimble - passthru = { - nim = nim'; - nimble = nimble'; - }; + runHook postInstall + ''; + + passthru = { + nim = nim'; + nimble = nimble'; + }; - meta = nim'.meta // { - description = nim'.meta.description - + " (${targetPlatform.config} wrapper)"; - platforms = with lib.platforms; unix ++ genode; + meta = nim'.meta // { + description = nim'.meta.description + + " (${targetPlatform.config} wrapper)"; + platforms = with lib.platforms; unix ++ genode; + }; }; + in self // { + pkgs = callPackage ../../../top-level/nim-packages.nix { nim = self; }; }; } -- cgit 1.4.1