diff --git a/lib/fusesocLib.nix b/lib/fusesocLib.nix index aef4a89..1d409fe 100644 --- a/lib/fusesocLib.nix +++ b/lib/fusesocLib.nix @@ -1,5 +1,9 @@ { lib, + fetchFromGitHub, + fetchgit, + fetchsvn, + fetchurl, formats, fusesoc, remarshal, @@ -126,6 +130,58 @@ rec { resolveDeps = import ./resolveDeps.nix { inherit lib parseDependency; }; + fetchProvider = + core: hash: + let + inherit (core) provider; + in + { + local = throw "local providers should not be fetched! use coreRoot."; + github = fetchFromGitHub { + inherit (core) name; + owner = provider.user; + repo = provider.repo; + rev = provider.version; + inherit hash; + }; + git = fetchgit { + inherit (core) name; + url = provider.repo; + rev = provider.version; + inherit hash; + }; + svn = fetchsvn { + inherit (core) name; + inherit (provider) url; + rev = provider.revision; + inherit hash; + }; + url = + let + fetch = fetchurl { + inherit (core) name; + inherit (provider) url; + inherit hash; + }; + in + { + tar = fetch; + zip = fetch; + simple = + let + fileName = lib.last (lib.splitString "/" provider.url); + in + runCommand "${core.name}-source" { } '' + mkdir -p $out + ln -s ${fetch} $out/${fileName} + ''; + } + .${provider.filetype} + or (throw "Unknown url provider filetype ${provider.filetype} in ${core.name}"); + opencores = throw "opencores provider not yet implemented"; + } + .${provider.name} or (throw "Unknown provider name: ${provider.name}"); + mkCoreSet = coreList: let @@ -234,6 +290,7 @@ rec { importCore = import ./importCore.nix { inherit + fetchProvider formats lib mkRunners diff --git a/lib/importCore.nix b/lib/importCore.nix index e7fa6dc..ba9289f 100644 --- a/lib/importCore.nix +++ b/lib/importCore.nix @@ -1,4 +1,5 @@ { + fetchProvider, formats, lib, mkRunners, @@ -9,17 +10,14 @@ }: lib.extendMkDerivation { constructDrv = stdenvNoCC.mkDerivation; - excludeDrvArgNames = [ - "coreRoot" - "coreName" - "dependencies" - ]; + excludeDrvArgNames = [ ]; extendDrvArgs = finalAttrs: { coreRoot, coreName, core ? readYAML "${coreRoot}/${coreName}", + providerHash ? "", tools ? [ ], dependencies ? [ ], passthru ? { }, @@ -35,6 +33,11 @@ lib.extendMkDerivation { ) (v.files or [ ]) ) finalAttrs.passthru.core.filesets ); + useProvider = + let + inherit (finalAttrs.passthru) core; + in + (builtins.hasAttr "provider" core) && (core.provider.name != "local"); in { pname = @@ -70,18 +73,35 @@ lib.extendMkDerivation { "unpackPhase" "installPhase" ]; - src = coreRoot; - installPhase = lib.concatStringsSep "\n" ( - (map (file: '' - mkdir -p $out/${dirOf file} - cp ${file} $out/${file} - '') coreFileset) - ++ [ - '' - mkdir -p $out/ - cp ${(formats.yaml { }).generate coreName finalAttrs.passthru.core} $out/${coreName} - '' - ] - ); + src = if useProvider then fetchProvider finalAttrs.passthru.core providerHash else coreRoot; + installPhase = + let + patchedCore = + let + inherit (finalAttrs.passthru) core; + in + if useProvider then + core + // { + provider = { + name = "local"; + patches = core.provider.patches or [ ]; + }; + } + else + core; + in + lib.concatStringsSep "\n" ( + (map (file: '' + mkdir -p $out/${dirOf file} + cp ${file} $out/${file} + '') coreFileset) + ++ [ + '' + mkdir -p $out/ + cp ${(formats.yaml { }).generate coreName patchedCore} $out/${coreName} + '' + ] + ); }; }