idris2Packages.buildIdris: better packaging ergonomics, better executable support

+51 -38
+51 -38
pkgs/development/compilers/idris2/build-idris.nix
··· 1 - { stdenv, lib, idris2 1 + { stdenv, lib, idris2, makeWrapper 2 2 }: 3 3 # Usage: let 4 4 # pkg = idris2Packages.buildIdris { 5 5 # src = ...; 6 - # projectName = "my-pkg"; 6 + # ipkgName = "my-pkg"; 7 7 # idrisLibraries = [ ]; 8 8 # }; 9 9 # in { ··· 12 12 # } 13 13 # 14 14 { src 15 - , projectName 15 + , ipkgName 16 + , version ? "unversioned" 16 17 , idrisLibraries # Other libraries built with buildIdris 17 18 , ... }@attrs: 18 19 19 20 let 20 - ipkgName = projectName + ".ipkg"; 21 + ipkgFileName = ipkgName + ".ipkg"; 21 22 idrName = "idris2-${idris2.version}"; 22 23 libSuffix = "lib/${idrName}"; 23 24 libDirs = 24 - lib.makeSearchPath libSuffix idrisLibraries; 25 - drvAttrs = builtins.removeAttrs attrs [ "idrisLibraries" ]; 25 + (lib.makeSearchPath libSuffix idrisLibraries) + 26 + ":${idris2}/${idrName}"; 27 + supportDir = "${idris2}/${idrName}/lib"; 28 + drvAttrs = builtins.removeAttrs attrs [ 29 + "ipkgName" 30 + "idrisLibraries" 31 + ]; 26 32 27 - sharedAttrs = { 28 - name = projectName; 33 + sharedAttrs = drvAttrs // { 34 + pname = ipkgName; 35 + inherit version; 29 36 src = src; 30 - nativeBuildInputs = [ idris2 ]; 37 + nativeBuildInputs = [ idris2 makeWrapper ] ++ attrs.nativeBuildInputs or []; 38 + buildInputs = idrisLibraries ++ attrs.buildInputs or []; 31 39 32 40 IDRIS2_PACKAGE_PATH = libDirs; 33 41 34 - configurePhase = '' 35 - runHook preConfigure 36 - runHook postConfigure 37 - ''; 38 - 39 42 buildPhase = '' 40 43 runHook preBuild 41 - idris2 --build ${ipkgName} 44 + idris2 --build ${ipkgFileName} 42 45 runHook postBuild 43 46 ''; 44 47 }; 45 48 46 49 in { 47 - executable = stdenv.mkDerivation (lib.attrsets.mergeAttrsList [ 48 - sharedAttrs 49 - { installPhase = '' 50 + executable = stdenv.mkDerivation (sharedAttrs // { 51 + installPhase = '' 52 + runHook preInstall 53 + mkdir -p $out/bin 54 + scheme_app="$(find ./build/exec -name '*_app')" 55 + if [ "$scheme_app" = ''' ]; then 56 + mv -- build/exec/* $out/bin/ 57 + chmod +x $out/bin/* 58 + # ^ remove after Idris2 0.8.0 is released. will be superfluous: 59 + # https://github.com/idris-lang/Idris2/pull/3189 60 + else 61 + cd build/exec/*_app 62 + rm -f ./libidris2_support.so 63 + for file in *.so; do 64 + bin_name="''${file%.so}" 65 + mv -- "$file" "$out/bin/$bin_name" 66 + wrapProgram "$out/bin/$bin_name" \ 67 + --prefix LD_LIBRARY_PATH : ${supportDir} \ 68 + --prefix DYLD_LIBRARY_PATH : ${supportDir} 69 + done 70 + fi 71 + runHook postInstall 72 + ''; 73 + }); 74 + 75 + library = { withSource ? false }: 76 + let installCmd = if withSource then "--install-with-src" else "--install"; 77 + in stdenv.mkDerivation (sharedAttrs // { 78 + installPhase = '' 50 79 runHook preInstall 51 - mkdir -p $out/bin 52 - mv build/exec/* $out/bin 80 + mkdir -p $out/${libSuffix} 81 + export IDRIS2_PREFIX=$out/lib 82 + idris2 ${installCmd} ${ipkgFileName} 53 83 runHook postInstall 54 84 ''; 55 - } 56 - drvAttrs 57 - ]); 58 - library = { withSource ? false }: 59 - let installCmd = if withSource then "--install-with-src" else "--install"; 60 - in stdenv.mkDerivation (lib.attrsets.mergeAttrsList [ 61 - sharedAttrs 62 - { 63 - installPhase = '' 64 - runHook preInstall 65 - mkdir -p $out/${libSuffix} 66 - export IDRIS2_PREFIX=$out/lib 67 - idris2 ${installCmd} ${ipkgName} 68 - runHook postInstall 69 - ''; 70 - } 71 - drvAttrs 72 - ]); 85 + }); 73 86 }