nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at devShellTools-shell 148 lines 3.8 kB view raw
1{ 2 lib, 3 stdenv, 4 fetchurl, 5 fetchgit, 6 linkFarm, 7 dub, 8 ldc, 9 removeReferencesTo, 10}: 11 12# See https://nixos.org/manual/nixpkgs/unstable#dlang for more detailed usage information 13 14{ 15 # A lockfile generated by `dub-to-nix` from the source of the package. 16 # Can be either a path to the file, or an attrset already parsed with `lib.importJSON`. 17 dubLock, 18 # The build type to pass to `dub build` as a value for the `--build=` flag. 19 dubBuildType ? "release", 20 # The flags to pass to `dub build` and `dub test`. 21 dubFlags ? [ ], 22 # The flags to pass to `dub build`. 23 dubBuildFlags ? [ ], 24 # The flags to pass to `dub test`. 25 dubTestFlags ? [ ], 26 # The D compiler to be used by `dub`. 27 compiler ? ldc, 28 ... 29}@args: 30 31let 32 makeDubDep = 33 { 34 pname, 35 version, 36 sha256, 37 }: 38 { 39 inherit pname version; 40 src = fetchurl { 41 name = "dub-${pname}-${version}.zip"; 42 url = "mirror://dub/${pname}/${version}.zip"; 43 inherit sha256; 44 }; 45 }; 46 47 makeGitDep = 48 { 49 pname, 50 version, 51 repository, 52 sha256, 53 }: 54 { 55 inherit pname version; 56 src = fetchgit { 57 url = repository; 58 rev = version; 59 inherit sha256; 60 }; 61 }; 62 63 lockJson = if lib.isPath dubLock then lib.importJSON dubLock else dubLock; 64 depsRaw = lib.mapAttrsToList (pname: args: { inherit pname; } // args) lockJson.dependencies; 65 66 dubDeps = map makeDubDep (lib.filter (args: !(args ? repository)) depsRaw); 67 gitDeps = map makeGitDep (lib.filter (args: args ? repository) depsRaw); 68 69 # a directory with multiple single element registries 70 # one big directory with all .zip files leads to version parsing errors 71 # when the name of a package is a prefix of the name of another package 72 dubRegistryBase = linkFarm "dub-registry-base" ( 73 map (dep: { 74 name = "${dep.pname}/${dep.pname}-${dep.version}.zip"; 75 path = dep.src; 76 }) dubDeps 77 ); 78 79 combinedFlags = "--skip-registry=all --compiler=${lib.getExe compiler} ${toString dubFlags}"; 80 combinedBuildFlags = "${combinedFlags} --build=${dubBuildType} ${toString dubBuildFlags}"; 81 combinedTestFlags = "${combinedFlags} ${toString dubTestFlags}"; 82in 83stdenv.mkDerivation ( 84 builtins.removeAttrs args [ "dubLock" ] 85 // { 86 strictDeps = args.strictDeps or true; 87 88 nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [ 89 dub 90 compiler 91 removeReferencesTo 92 ]; 93 94 configurePhase = 95 args.configurePhase or '' 96 runHook preConfigure 97 98 export DUB_HOME="$NIX_BUILD_TOP/.dub" 99 mkdir -p "$DUB_HOME" 100 101 # register dub dependencies 102 ${lib.concatMapStringsSep "\n" (dep: '' 103 dub fetch ${dep.pname}@${dep.version} --cache=user --skip-registry=standard --registry=file://${dubRegistryBase}/${dep.pname} 104 '') dubDeps} 105 106 # register git dependencies 107 ${lib.concatMapStringsSep "\n" (dep: '' 108 mkdir -p "$DUB_HOME/packages/${dep.pname}/${dep.version}" 109 cp -r --no-preserve=all ${dep.src} "$DUB_HOME/packages/${dep.pname}/${dep.version}/${dep.pname}" 110 '') gitDeps} 111 112 runHook postConfigure 113 ''; 114 115 buildPhase = 116 args.buildPhase or '' 117 runHook preBuild 118 119 dub build ${combinedBuildFlags} 120 121 runHook postBuild 122 ''; 123 124 doCheck = args.doCheck or false; 125 126 checkPhase = 127 args.checkPhase or '' 128 runHook preCheck 129 130 dub test ${combinedTestFlags} 131 132 runHook postCheck 133 ''; 134 135 preFixup = '' 136 ${args.preFixup or ""} 137 138 find "$out" -type f -exec remove-references-to -t ${compiler} '{}' + 139 ''; 140 141 disallowedReferences = [ compiler ]; 142 143 meta = { 144 platforms = dub.meta.platforms; 145 } 146 // args.meta or { }; 147 } 148)