diff options
author | Vincent Ambo <tazjin@google.com> | 2019-12-09T00·27+0000 |
---|---|---|
committer | Vincent Ambo <mail@tazj.in> | 2019-12-13T00·39+0000 |
commit | c40e8a4061b033282031cd1a8d64df9a591aa694 (patch) | |
tree | a8acced924a10b62c062fae326c9bec96b659fd0 /buildGo.nix | |
parent | 6a526620e25a349642b161eb687dec2e005360e5 (diff) |
feat(buildGo): Add new traversing external' implementation
Adds an alternative implementation of a builder for external packages which traverses packages and builds up an attribute set tree out of their structure. Currently this is not functional because there is no useable method of specifying dependencies within that package set.
Diffstat (limited to 'buildGo.nix')
-rw-r--r-- | buildGo.nix | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/buildGo.nix b/buildGo.nix index 5f5118e8cec2..366be770a959 100644 --- a/buildGo.nix +++ b/buildGo.nix @@ -14,10 +14,12 @@ let dirOf elemAt filter + listToAttrs map match readDir - replaceStrings; + replaceStrings + toString; inherit (pkgs) lib go runCommand fetchFromGitHub protobuf symlinkJoin; @@ -34,14 +36,6 @@ let srcCopy = path: src: "cp ${src} $out/${path}/${srcBasename src}"; srcList = path: srcs: lib.concatStringsSep "\n" (map (srcCopy path) srcs); - isGoFile = f: (match ".*\.go" f) != null; - isGoTest = f: (match ".*_test\.go" f) != null; - goFileFilter = k: v: (v == "regular") && (isGoFile k) && (!isGoTest k); - goFilesIn = dir: - let files = readDir dir; - goFiles = filter (f: goFileFilter f files."${f}") (attrNames files); - in map (f: dir + "/" + f) goFiles; - allDeps = deps: lib.unique (lib.flatten (deps ++ (map (d: d.goDeps) deps))); xFlags = x_defs: spaceOut (map (k: "-X ${k}=${x_defs."${k}"}") (attrNames x_defs)); @@ -93,6 +87,41 @@ let # Build a Go library out of the specified gRPC definition. grpc = args: proto (args // { extraDeps = [ protoLibs.goGrpc ]; }); + # Traverse an externally defined Go library to build up a tree of + # its packages. + # + # TODO(tazjin): Automatically infer which packages depend on which + # other packages, which currently requires overriding. + # + # TODO(tazjin): Add support for rewriting package paths. + external' = { src, path, deps ? [] }: + let + dir = readDir src; + isGoFile = f: (match ".*\.go" f) != null; + isGoTest = f: (match ".*_test\.go" f) != null; + goFileFilter = k: v: (v == "regular") && (isGoFile k) && (!isGoTest k); + goSources = + let goFiles = filter (f: goFileFilter f dir."${f}") (attrNames dir); + in map (f: src + ("/" + f)) goFiles; + + subDirs = filter (n: dir."${n}" == "directory") (attrNames dir); + subPackages = map (name: { + inherit name; + value = external' { + inherit deps; + src = src + ("/" + name); + path = path + ("/" + name); + }; + }) subDirs; + subAttrs = listToAttrs (filter (p: p.value != {}) subPackages); + + current = package { + inherit deps path; + name = pathToName path; + srcs = goSources; + }; + in if goSources == [] then subAttrs else (current // subAttrs); + # Build an externally defined Go library using `go build` itself. # # Libraries built this way can be included in any standard buildGo @@ -144,4 +173,12 @@ in { proto = makeOverridable proto; grpc = makeOverridable grpc; external = makeOverridable external; + + # TODO: remove + inherit external'; + + extTest = external' { + src = /home/tazjin/go/src/cloud.google.com/go; + path = "cloud.google.com/go"; + }; } |