{ "staged": { "doc": ["Stage data to a logical subdirectory."] , "target_fields": ["srcs", "deps"] , "string_fields": ["stage", "drop"] , "field_doc": { "srcs": ["The files to be staged"] , "stage": [ "The logical directory to stage the files to." , "Individual directory components are joined with \"/\"." ] , "deps": [ "Targets of with their runfiles should be added as well." , "Their staging is not changed." ] , "drop": [ "List of paths to drop from (each of) the \"srcs\" targets" , "before joining and staging. In this way, GLOB constructs can" , "be used is \"srcs\"." ] } , "artifacts_doc": [ "The runfiles and artifacts of the \"srcs\" targets, leaving out" , "the ones with logical path in \"drop\", staged to the directory" , "specified in \"stage\" together the runfiles of the targets" , "specified in the field \"deps\" (in their original location)." ] , "runfiles_doc": ["Same as artifacts"] , "imports": { "runfiles": ["./", "..", "field_runfiles"] , "artifacts": ["./", "..", "field_artifacts"] , "runfiles w/o": "field_runfiles_without" , "artifacts w/o": "field_artifacts_without" } , "expression": { "type": "let*" , "bindings": [ [ "stage" , { "type": "join" , "separator": "/" , "$1": {"type": "FIELD", "name": "stage"} } ] , [ "exclude" , { "type": "map_union" , "$1": { "type": "foreach" , "range": {"type": "FIELD", "name": "drop"} , "body": { "type": "singleton_map" , "key": {"type": "var", "name": "_"} , "value": true } } } ] , [ "srcs" , { "type": "let*" , "bindings": [["fieldname", "srcs"]] , "body": { "type": "map_union" , "$1": { "type": "if" , "cond": {"type": "var", "name": "exclude"} , "then": [ {"type": "CALL_EXPRESSION", "name": "runfiles w/o"} , {"type": "CALL_EXPRESSION", "name": "artifacts w/o"} ] , "else": [ {"type": "CALL_EXPRESSION", "name": "runfiles"} , {"type": "CALL_EXPRESSION", "name": "artifacts"} ] } } } ] , [ "staged" , { "type": "to_subdir" , "subdir": {"type": "var", "name": "stage"} , "$1": {"type": "var", "name": "srcs"} } ] , [ "dep stage" , { "type": "let*" , "bindings": [["fieldname", "deps"]] , "body": {"type": "CALL_EXPRESSION", "name": "runfiles"} } ] , [ "total" , { "type": "disjoint_map_union" , "msg": "Conflict between staged data and dependencies" , "$1": [ {"type": "var", "name": "dep stage"} , {"type": "var", "name": "staged"} ] } ] ] , "body": { "type": "RESULT" , "artifacts": {"type": "var", "name": "total"} , "runfiles": {"type": "var", "name": "total"} } } } , "overlay": { "doc": ["Overlay the artifacts of \"deps\" targets in a latest-wins fashion."] , "target_fields": ["deps"] , "field_doc": {"deps": ["The targets of which to overlay the artifacts"]} , "artifacts_doc": [ "Artifacts of the targets specified in \"deps\". For conflicting" , "logical paths, the artifact is taken from the latest target (in" , "the \"deps\" field) that defines that logical path." ] , "runfiles_doc": ["Same as artifacts"] , "expression": { "type": "let*" , "bindings": [ [ "all" , { "type": "map_union" , "$1": { "type": "foreach" , "var": "dep" , "range": {"type": "FIELD", "name": "deps"} , "body": {"type": "DEP_ARTIFACTS", "dep": {"type": "var", "name": "dep"}} } } ] ] , "body": { "type": "RESULT" , "artifacts": {"type": "var", "name": "all"} , "runfiles": {"type": "var", "name": "all"} } } } }