From 808b62b8e362d8c0bea03d38d3792a1d2de623d4 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Wed, 16 Aug 2023 12:48:17 +0200 Subject: rules: Remove pointless defaults --- CC/EXPRESSIONS | 32 ++++++++------------------------ CC/proto/EXPRESSIONS | 20 +++++--------------- 2 files changed, 13 insertions(+), 39 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index cad28e8..0ac44d2 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -6,9 +6,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "CC"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -21,9 +19,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "CXX"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -36,9 +32,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "AR"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -51,9 +45,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "CFLAGS"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -66,9 +58,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "CXXFLAGS"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -81,9 +71,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "LDFLAGS"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -96,9 +84,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "ENV"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] , ["default", {"type": "empty_map"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} @@ -112,9 +98,7 @@ , "bindings": [ ["fieldname", "defaults"] , ["provider", "TOOLCHAIN"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] , ["default", {"type": "empty_map"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} diff --git a/CC/proto/EXPRESSIONS b/CC/proto/EXPRESSIONS index 6be74df..84d3d55 100644 --- a/CC/proto/EXPRESSIONS +++ b/CC/proto/EXPRESSIONS @@ -6,9 +6,7 @@ , "bindings": [ ["fieldname", "proto-defaults"] , ["provider", "PROTOC"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -21,9 +19,7 @@ , "bindings": [ ["fieldname", "proto-defaults"] , ["provider", "LDFLAGS"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -36,9 +32,7 @@ , "bindings": [ ["fieldname", "proto-defaults"] , ["provider", "GRPC_PLUGIN"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } @@ -51,9 +45,7 @@ , "bindings": [ ["fieldname", "proto-defaults"] , ["provider", "ENV"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] , ["default", {"type": "empty_map"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} @@ -67,9 +59,7 @@ , "bindings": [ ["fieldname", "proto-defaults"] , ["provider", "TOOLCHAIN"] - , [ "transition" - , {"type": "var", "name": "defaults-transition", "default": null} - ] + , ["transition", {"type": "var", "name": "defaults-transition"}] , ["default", {"type": "empty_map"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} -- cgit v1.2.3 From 4830f2de654d2a4d43dcca3c8ad21fecea622378 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Thu, 10 Aug 2023 10:59:20 +0200 Subject: rules: Expression to get base providers as list --- CC/EXPRESSIONS | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index 0ac44d2..2ebe7c1 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -126,29 +126,39 @@ } } } -, "defaults-base-provides": - { "doc": ["Query list-provider from 'base' targets (last wins)"] +, "defaults-base-provides-list": + { "doc": ["Query list of providers from 'base' targets"] , "vars": ["provider", "default"] , "vars_doc": - { "provider": ["The name of the list-provider in the provides map."] + { "provider": ["The name of the provider in the provides map."] , "default": ["The default if provider is missing (default: [])."] } , "imports": {"provider_list": ["./", "..", "field_provider_list"]} , "expression": { "type": "let*" , "bindings": [["fieldname", "base"]] + , "body": {"type": "CALL_EXPRESSION", "name": "provider_list"} + } + } +, "defaults-base-provides": + { "doc": ["Query provider from 'base' targets (last wins)"] + , "vars": ["provider", "default"] + , "vars_doc": + { "provider": ["The name of the provider in the provides map."] + , "default": ["The default if provider is missing (default: [])."] + } + , "imports": {"base-provides-list": "defaults-base-provides-list"} + , "expression": + { "type": "foldl" + , "var": "next" + , "start": {"type": "var", "name": "default", "default": []} + , "accum_var": "curr" + , "range": {"type": "CALL_EXPRESSION", "name": "base-provides-list"} , "body": - { "type": "foldl" - , "var": "next" - , "start": {"type": "var", "name": "default", "default": []} - , "accum_var": "curr" - , "range": {"type": "CALL_EXPRESSION", "name": "provider_list"} - , "body": - { "type": "if" - , "cond": {"type": "var", "name": "next"} - , "then": {"type": "var", "name": "next"} - , "else": {"type": "var", "name": "curr"} - } + { "type": "if" + , "cond": {"type": "var", "name": "next"} + , "then": {"type": "var", "name": "next"} + , "else": {"type": "var", "name": "curr"} } } } -- cgit v1.2.3 From ec6dc0a5b6f5a8320f02ce926be3ba01e24a27ff Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Thu, 10 Aug 2023 11:01:21 +0200 Subject: rules: Extend toolchains via defaults from base --- CC/RULES | 39 ++++++++++++++++++++++----------------- CC/proto/RULES | 39 ++++++++++++++++++++++----------------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/CC/RULES b/CC/RULES index 98c5cb4..8af70be 100644 --- a/CC/RULES +++ b/CC/RULES @@ -26,7 +26,7 @@ [ "Optional toolchain directory. A collection of artifacts that provide" , "the tools CC, CXX, and AR (if needed). Note that only artifacts of" , "the specified targets are considered (no runfiles etc.). Specifying" - , "this field overlays artifacts from \"base\"." + , "this field extends artifacts from \"base\"." ] , "deps": [ "Optional CC libraries any CC library and CC binary implicitly depend" @@ -72,7 +72,8 @@ , "config_vars": ["ARCH", "HOST_ARCH"] , "imports": { "base-provides": "defaults-base-provides" - , "artifacts": ["./", "..", "field_artifacts"] + , "base-provides-list": "defaults-base-provides-list" + , "artifacts_list": ["./", "..", "field_artifacts_list"] , "compile-deps": "compile-deps" , "compile-args-deps": "compile-args-deps" , "link-deps": "link-deps" @@ -224,24 +225,28 @@ , ["provider", "TOOLCHAIN"] , ["default", {"type": "empty_map"}] , [ "TOOLCHAIN" - , { "type": "map_union" + , { "type": "disjoint_map_union" + , "msg": "toolchain artifacts may not overlap" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "base-provides"} - , { "type": "if" - , "cond": {"type": "FIELD", "name": "toolchain"} - , "then": - { "type": "let*" - , "bindings": - [ ["fieldname", "toolchain"] - , [ "transition" - , {"type": "CALL_EXPRESSION", "name": "for host"} + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "base-provides-list"} + , { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": + { "type": "let*" + , "bindings": + [ ["fieldname", "toolchain"] + , [ "transition" + , {"type": "CALL_EXPRESSION", "name": "for host"} + ] ] - ] - , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"} + , "body": + {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } } - , "else": {"type": "empty_map"} - } - ] + ] + } } ] , [ "CFLAGS" diff --git a/CC/proto/RULES b/CC/proto/RULES index 6d2e725..cfc3786 100644 --- a/CC/proto/RULES +++ b/CC/proto/RULES @@ -19,7 +19,7 @@ [ "Optional toolchain directory. A collection of artifacts that provide" , "the protobuf compiler and the GRPC plugin (if needed). Note that only" , "artifacts of the specified targets are considered (no runfiles etc.)." - , "Specifying this field overlays artifacts from \"base\"." + , "Specifying this field extends artifacts from \"base\"." ] , "deps": [ "Optional CC libraries the resulting CC proto libraries implicitly" @@ -56,7 +56,8 @@ } , "imports": { "base-provides": ["./", "..", "defaults-base-provides"] - , "artifacts": ["", "field_artifacts"] + , "base-provides-list": ["./", "..", "defaults-base-provides-list"] + , "artifacts_list": ["", "field_artifacts_list"] , "compile-deps": ["CC", "compile-deps"] , "compile-args-deps": ["CC", "compile-args-deps"] , "link-deps": ["CC", "link-deps"] @@ -158,24 +159,28 @@ , ["provider", "TOOLCHAIN"] , ["default", {"type": "empty_map"}] , [ "TOOLCHAIN" - , { "type": "map_union" + , { "type": "disjoint_map_union" + , "msg": "toolchain artifacts may not overlap" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "base-provides"} - , { "type": "if" - , "cond": {"type": "FIELD", "name": "toolchain"} - , "then": - { "type": "let*" - , "bindings": - [ ["fieldname", "toolchain"] - , [ "transition" - , {"type": "CALL_EXPRESSION", "name": "for host"} + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "base-provides-list"} + , { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": + { "type": "let*" + , "bindings": + [ ["fieldname", "toolchain"] + , [ "transition" + , {"type": "CALL_EXPRESSION", "name": "for host"} + ] ] - ] - , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"} + , "body": + {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } } - , "else": {"type": "empty_map"} - } - ] + ] + } } ] , [ "LDFLAGS" -- cgit v1.2.3 From f61161f05e88b42e9ee141a8fd4809f0e4f4e0c6 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Thu, 10 Aug 2023 11:58:18 +0200 Subject: rules: Implement nub_left for PATH --- EXPRESSIONS | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/EXPRESSIONS b/EXPRESSIONS index c84ebf4..59efead 100644 --- a/EXPRESSIONS +++ b/EXPRESSIONS @@ -273,4 +273,35 @@ } } } +, "reverse_list": + { "doc": ["Returns the list in reverse order."] + , "vars": ["list"] + , "vars_doc": {"list": ["The list to reverse."]} + , "expression": + { "type": "foldl" + , "var": "item" + , "start": [] + , "accum_var": "out" + , "range": {"type": "var", "name": "list"} + , "body": + { "type": "++" + , "$1": + [[{"type": "var", "name": "item"}], {"type": "var", "name": "out"}] + } + } + } +, "nub_left": + { "doc": ["Removes all but the leftmost duplicate from the list."] + , "vars": ["list"] + , "vars_doc": {"list": ["The list to remove duplicates from."]} + , "imports": {"reverse": "reverse_list"} + , "expression": + { "type": "let*" + , "bindings": + [ ["list", {"type": "CALL_EXPRESSION", "name": "reverse"}] + , ["list", {"type": "nub_right", "$1": {"type": "var", "name": "list"}}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "reverse"} + } + } } -- cgit v1.2.3 From 161772df4241adefd2ff3440f00ee72d13987bf8 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Fri, 21 Jul 2023 15:20:51 +0200 Subject: rules: Propagate PATH list from defaults ... instead of creating an ENV from it and propagating this. The idea is to keep PATH entries separate and only join them with ":" when we need it. In this way, we can accumulate PATHs from multiple defaults later, and perform a deduplication ("nub_left") to shorten the final string length. --- CC/EXPRESSIONS | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ CC/RULES | 35 ++++++++++++---------- CC/auto/RULES | 31 ++++++++++++++++++++ CC/pkgconfig/EXPRESSIONS | 35 +++++++++++++++++++++- CC/proto/EXPRESSIONS | 46 ++++++++++++++++++++++++++++- CC/proto/RULES | 35 ++++++++++++---------- 6 files changed, 225 insertions(+), 32 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index 2ebe7c1..cec5b8a 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -90,6 +90,19 @@ , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} } } +, "default-PATH": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "defaults"] + , ["provider", "PATH"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } , "default-TOOLCHAIN": { "vars": ["defaults-transition"] , "imports": {"map_provider": ["./", "..", "field_map_provider"]} @@ -811,6 +824,7 @@ , "objects": "objects" , "default-AR": "default-AR" , "default-ENV": "default-ENV" + , "default-PATH": "default-PATH" , "default-TOOLCHAIN": "default-TOOLCHAIN" , "default-NON_SYSTEM_TOOLS": "default-NON_SYSTEM_TOOLS" } @@ -868,6 +882,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , ["objects", {"type": "CALL_EXPRESSION", "name": "objects"}] , [ "base name" , { "type": "if" @@ -1079,6 +1123,7 @@ , "flags": "flags" , "objects": "objects" , "default-ENV": "default-ENV" + , "default-PATH": "default-PATH" , "default-LDFLAGS": "default-LDFLAGS" , "default-TOOLCHAIN": "default-TOOLCHAIN" , "default-NON_SYSTEM_TOOLS": "default-NON_SYSTEM_TOOLS" @@ -1115,6 +1160,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , ["hdrs", {"type": "empty_map"}] , ["objects", {"type": "CALL_EXPRESSION", "name": "objects"}] , [ "link-args" diff --git a/CC/RULES b/CC/RULES index 8af70be..33b8520 100644 --- a/CC/RULES +++ b/CC/RULES @@ -66,7 +66,7 @@ ] , "PATH": [ "Path for looking up the compilers. Individual paths are joined" - , "with \":\"." + , "with \":\". Specifying this field extends values from \"base\"." ] } , "config_vars": ["ARCH", "HOST_ARCH"] @@ -74,6 +74,7 @@ { "base-provides": "defaults-base-provides" , "base-provides-list": "defaults-base-provides-list" , "artifacts_list": ["./", "..", "field_artifacts_list"] + , "nub_left": ["", "nub_left"] , "compile-deps": "compile-deps" , "compile-args-deps": "compile-args-deps" , "link-deps": "link-deps" @@ -142,23 +143,26 @@ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} } ] - , ["provider", "ENV"] - , ["default", {"type": "empty_map"}] - , [ "ENV" - , { "type": "if" - , "cond": {"type": "var", "name": "PATH"} - , "then": - { "type": "singleton_map" - , "key": "PATH" - , "value": - { "type": "join" - , "separator": ":" - , "$1": {"type": "var", "name": "PATH"} + , ["provider", "PATH"] + , [ "PATH" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "PATH"} + , { "type": "++" + , "$1": {"type": "CALL_EXPRESSION", "name": "base-provides-list"} } - } - , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + ] + } + ] + , [ "PATH" + , { "type": "let*" + , "bindings": [["list", {"type": "var", "name": "PATH"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "nub_left"} } ] + , ["provider", "ENV"] + , ["default", {"type": "empty_map"}] + , ["ENV", {"type": "CALL_EXPRESSION", "name": "base-provides"}] , ["provider", "NON_SYSTEM_TOOLS"] , ["default", {"type": "empty_map"}] , [ "NON_SYSTEM_TOOLS" @@ -299,6 +303,7 @@ , "CXXFLAGS" , "LDFLAGS" , "AR" + , "PATH" , "ENV" , "TOOLCHAIN" , "NON_SYSTEM_TOOLS" diff --git a/CC/auto/RULES b/CC/auto/RULES index 247ee01..0e156c9 100644 --- a/CC/auto/RULES +++ b/CC/auto/RULES @@ -156,6 +156,7 @@ , "flags-cc": ["./", "..", "flags-cc"] , "flags-cxx": ["./", "..", "flags-cxx"] , "default-ENV": ["./", "..", "default-ENV"] + , "default-PATH": ["./", "..", "default-PATH"] , "default-TOOLCHAIN": ["./", "..", "default-TOOLCHAIN"] , "default-NON_SYSTEM_TOOLS": ["./", "..", "default-NON_SYSTEM_TOOLS"] } @@ -222,6 +223,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , [ "c.flags" , { "type": "BLOB" , "data": diff --git a/CC/pkgconfig/EXPRESSIONS b/CC/pkgconfig/EXPRESSIONS index 4c174c4..535faf6 100644 --- a/CC/pkgconfig/EXPRESSIONS +++ b/CC/pkgconfig/EXPRESSIONS @@ -1,6 +1,9 @@ { "pkgconfig result": { "vars": ["ENV", "name", "args", "stage"] - , "imports": {"default-ENV": ["./", "..", "default-ENV"]} + , "imports": + { "default-ENV": ["./", "..", "default-ENV"] + , "default-PATH": ["./", "..", "default-PATH"] + } , "expression": { "type": "let*" , "bindings": @@ -12,6 +15,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , [ "cflags-filename" , {"type": "join", "$1": [{"type": "var", "name": "name"}, ".cflags"]} ] diff --git a/CC/proto/EXPRESSIONS b/CC/proto/EXPRESSIONS index 84d3d55..29c205c 100644 --- a/CC/proto/EXPRESSIONS +++ b/CC/proto/EXPRESSIONS @@ -51,6 +51,19 @@ , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} } } +, "default-PATH": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "../..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "proto-defaults"] + , ["provider", "PATH"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } , "default-TOOLCHAIN": { "vars": ["defaults-transition"] , "imports": {"map_provider": ["./", "../..", "field_map_provider"]} @@ -118,6 +131,7 @@ , "default-LDFLAGS": "default-LDFLAGS" , "default-GRPC_PLUGIN": "default-GRPC_PLUGIN" , "default-ENV": "default-ENV" + , "default-PATH": "default-PATH" , "default-TOOLCHAIN": "default-TOOLCHAIN" , "default-NON_SYSTEM_TOOLS": "default-NON_SYSTEM_TOOLS" } @@ -172,7 +186,7 @@ } } ] - , [ "protoc-ENV" + , [ "ENV" , { "type": "map_union" , "$1": [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} @@ -180,6 +194,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "protoc-ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , ["protoc-deps", {"type": "CALL_EXPRESSION", "name": "protoc-deps"}] , [ "proto srcs" , { "type": "disjoint_map_union" diff --git a/CC/proto/RULES b/CC/proto/RULES index cfc3786..4ffc73b 100644 --- a/CC/proto/RULES +++ b/CC/proto/RULES @@ -51,13 +51,14 @@ ] , "PATH": [ "Path for looking up the proto compiler. Individual paths are joined" - , "with \":\"." + , "with \":\". Specifying this field extends values from \"base\"." ] } , "imports": { "base-provides": ["./", "..", "defaults-base-provides"] , "base-provides-list": ["./", "..", "defaults-base-provides-list"] , "artifacts_list": ["", "field_artifacts_list"] + , "nub_left": ["", "nub_left"] , "compile-deps": ["CC", "compile-deps"] , "compile-args-deps": ["CC", "compile-args-deps"] , "link-deps": ["CC", "link-deps"] @@ -99,23 +100,26 @@ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} } ] - , ["provider", "ENV"] - , ["default", {"type": "empty_map"}] - , [ "ENV" - , { "type": "if" - , "cond": {"type": "var", "name": "PATH"} - , "then": - { "type": "singleton_map" - , "key": "PATH" - , "value": - { "type": "join" - , "separator": ":" - , "$1": {"type": "var", "name": "PATH"} + , ["provider", "PATH"] + , [ "PATH" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "PATH"} + , { "type": "++" + , "$1": {"type": "CALL_EXPRESSION", "name": "base-provides-list"} } - } - , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + ] + } + ] + , [ "PATH" + , { "type": "let*" + , "bindings": [["list", {"type": "var", "name": "PATH"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "nub_left"} } ] + , ["provider", "ENV"] + , ["default", {"type": "empty_map"}] + , ["ENV", {"type": "CALL_EXPRESSION", "name": "base-provides"}] , ["provider", "NON_SYSTEM_TOOLS"] , ["default", {"type": "empty_map"}] , [ "NON_SYSTEM_TOOLS" @@ -214,6 +218,7 @@ [ "PROTOC" , "LDFLAGS" , "GRPC_PLUGIN" + , "PATH" , "ENV" , "TOOLCHAIN" , "NON_SYSTEM_TOOLS" -- cgit v1.2.3 From 7858f9a9b61ee2d695252e6785158e7436063263 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Wed, 9 Aug 2023 12:17:58 +0200 Subject: patch: Drop patch-part ... because it was using tool that are not part of coreutils. Using patch parts can still be done via patching patches. --- patch/RULES | 68 ------------------------------------------------------------- 1 file changed, 68 deletions(-) diff --git a/patch/RULES b/patch/RULES index b1ba95e..4de3ddb 100644 --- a/patch/RULES +++ b/patch/RULES @@ -1,18 +1,12 @@ { "file": { "doc": ["Replace a file, logically in place, by a patched version"] , "target_fields": ["src", "patch"] - , "string_fields": ["patch-part"] , "config_vars": ["PATCH", "ENV"] , "field_doc": { "src": [ "The single source file to patch, typically an explicit file reference." ] , "patch": ["The patch to apply."] - , "patch-part": - [ "If the patch contains hunks for multiple files, only apply hunks for" - , "the specified file path. Individual directory components are joined" - , "with \"/\". Note that the patch must be provided in unified format." - ] } , "artifacts_doc": ["The patched file, staged to the position the of the original file"] @@ -36,68 +30,6 @@ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} } ] - , [ "patch-part" - , { "type": "join" - , "separator": "\\/" - , "$1": {"type": "FIELD", "name": "patch-part"} - } - ] - , [ "splitpatch" - , { "type": "BLOB" - , "data": - { "type": "join" - , "separator": "\n" - , "$1": - [ "set -e" - , { "type": "join" - , "$1": - [ { "type": "join_cmd" - , "$1": - [ "sed" - , "-n" - , { "type": "join" - , "$1": - [ "/^--- " - , {"type": "var", "name": "patch-part"} - , "/," - , "/^[^-+@\\ ]\\|^---\\ /p" - ] - } - ] - } - , " $1 | sed '$d' > patch" - ] - } - ] - } - } - ] - , [ "patch" - , { "type": "if" - , "cond": {"type": "var", "name": "patch-part"} - , "then": - { "type": "ACTION" - , "inputs": - { "type": "map_union" - , "$1": - [ { "type": "to_subdir" - , "subdir": "in" - , "$1": {"type": "var", "name": "patch"} - } - , { "type": "singleton_map" - , "key": "splitpatch" - , "value": {"type": "var", "name": "splitpatch"} - } - ] - } - , "outs": ["patch"] - , "cmd": ["sh", "./splitpatch", "in/patch"] - , "env": - {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} - } - , "else": {"type": "var", "name": "patch"} - } - ] , [ "inputs" , { "type": "map_union" , "$1": -- cgit v1.2.3 From 49a1fc766de1b78427a50f37dbf5650237293067 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Thu, 10 Aug 2023 11:01:49 +0200 Subject: patch: Support defaults for patch rules ... and extend compatibility by not relying on arguments that are only supported by GNU patch implementations. --- patch/EXPRESSIONS | 77 ++++++++++++++++ patch/RULES | 272 +++++++++++++++++++++++++++++++++++++++++++++++++++--- patch/TARGETS | 6 ++ 3 files changed, 342 insertions(+), 13 deletions(-) create mode 100644 patch/EXPRESSIONS create mode 100644 patch/TARGETS diff --git a/patch/EXPRESSIONS b/patch/EXPRESSIONS new file mode 100644 index 0000000..7f8ce19 --- /dev/null +++ b/patch/EXPRESSIONS @@ -0,0 +1,77 @@ +{ "default-PATCH": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "PATCH"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-ENV": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["./", "..", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "ENV"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "default-PATH": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "PATH"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-TOOLCHAIN": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["./", "..", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "TOOLCHAIN"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "default-NON_SYSTEM_TOOLS": + { "vars": ["defaults-transition"] + , "expression": + { "type": "map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "FIELD", "name": "patch-defaults"} + , "body": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "x"} + , "provider": "NON_SYSTEM_TOOLS" + , "transition": + { "type": "var" + , "name": "defaults-transition" + , "default": {"type": "empty_map"} + } + , "default": {"type": "empty_map"} + } + } + } + } +} diff --git a/patch/RULES b/patch/RULES index 4de3ddb..712a487 100644 --- a/patch/RULES +++ b/patch/RULES @@ -1,7 +1,151 @@ -{ "file": +{ "defaults": + { "doc": + [ "A rule to provide defaults." + , "All targets take their defaults for PATCH from the target" + , "[\"\", \"defaults\"]. This is probably the only sensible" + , "use of this rule. As targets form a different root, the defaults" + , "can be provided without changing this directory." + ] + , "target_fields": ["base", "toolchain"] + , "string_fields": ["PATCH", "PATH", "SYSTEM_TOOLS"] + , "field_doc": + { "base": ["Other targets (using the same rule) to inherit values from."] + , "toolchain": + [ "Optional toolchain directory. A collection of artifacts that provide" + , "the tool PATCH. Note that only artifacts of" + , "the specified targets are considered (no runfiles etc.). Specifying" + , "this field extends artifacts from \"base\"." + ] + , "PATCH": ["The patch binary to use"] + , "SYSTEM_TOOLS": + [ "List of tools (\"PATCH\") that should be taken from" + , "the system instead of from \"toolchain\" (if specified)." + ] + , "PATH": + [ "Path for looking up the compilers. Individual paths are joined" + , "with \":\". Specifying this field extends values from \"base\"." + ] + } + , "config_vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] + , "imports": + { "base-provides": ["CC", "defaults-base-provides"] + , "base-provides-list": ["CC", "defaults-base-provides-list"] + , "artifacts_list": ["", "field_artifacts_list"] + , "nub_left": ["", "nub_left"] + , "for host": ["transitions", "for host"] + } + , "config_transitions": + {"toolchain": [{"type": "CALL_EXPRESSION", "name": "for host"}]} + , "expression": + { "type": "let*" + , "bindings": + [ ["PATCH", {"type": "FIELD", "name": "PATCH"}] + , ["PATH", {"type": "FIELD", "name": "PATH"}] + , ["provider", "PATCH"] + , [ "PATCH" + , { "type": "if" + , "cond": {"type": "var", "name": "PATCH"} + , "then": {"type": "var", "name": "PATCH"} + , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + ] + , ["provider", "PATH"] + , [ "PATH" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "PATH"} + , { "type": "++" + , "$1": {"type": "CALL_EXPRESSION", "name": "base-provides-list"} + } + ] + } + ] + , [ "PATH" + , { "type": "let*" + , "bindings": [["list", {"type": "var", "name": "PATH"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "nub_left"} + } + ] + , ["provider", "ENV"] + , ["default", {"type": "empty_map"}] + , ["ENV", {"type": "CALL_EXPRESSION", "name": "base-provides"}] + , ["provider", "NON_SYSTEM_TOOLS"] + , ["default", {"type": "empty_map"}] + , [ "NON_SYSTEM_TOOLS" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ [{"type": "CALL_EXPRESSION", "name": "base-provides"}] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "PATCH"} + , "then": + [ { "type": "singleton_map" + , "key": "PATCH" + , "value": + { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": true + , "else": false + } + } + ] + } + , { "type": "foreach" + , "range": {"type": "FIELD", "name": "SYSTEM_TOOLS"} + , "var": "tool" + , "body": + { "type": "singleton_map" + , "key": {"type": "var", "name": "tool"} + , "value": false + } + } + ] + } + } + ] + , ["provider", "TOOLCHAIN"] + , ["default", {"type": "empty_map"}] + , [ "TOOLCHAIN" + , { "type": "disjoint_map_union" + , "msg": "toolchain artifacts may not overlap" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "base-provides-list"} + , { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": + { "type": "let*" + , "bindings": + [ ["fieldname", "toolchain"] + , [ "transition" + , {"type": "CALL_EXPRESSION", "name": "for host"} + ] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } + } + ] + } + } + ] + ] + , "body": + { "type": "RESULT" + , "provides": + { "type": "env" + , "vars": ["PATCH", "PATH", "ENV", "TOOLCHAIN", "NON_SYSTEM_TOOLS"] + } + } + } + } +, "file": { "doc": ["Replace a file, logically in place, by a patched version"] , "target_fields": ["src", "patch"] , "config_vars": ["PATCH", "ENV"] + , "implicit": {"patch-defaults": ["defaults"]} , "field_doc": { "src": [ "The single source file to patch, typically an explicit file reference." @@ -14,11 +158,88 @@ , "imports": { "stage_field": ["./", "..", "stage_singleton_field"] , "stage_artifact": ["./", "..", "stage_artifact_to_singleton_field"] + , "default-PATCH": "default-PATCH" + , "default-TOOLCHAIN": "default-TOOLCHAIN" + , "default-ENV": "default-ENV" + , "default-PATH": "default-PATH" + , "default-NON_SYSTEM_TOOLS": "default-NON_SYSTEM_TOOLS" } , "expression": { "type": "let*" , "bindings": - [ [ "orig" + [ ["TOOLCHAIN_DIR", "toolchain"] + , ["TOOLCHAIN", {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"}] + , [ "TOOLCHAIN" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "TOOLCHAIN_DIR"} + , "$1": {"type": "var", "name": "TOOLCHAIN"} + } + ] + , [ "NON_SYSTEM_TOOLS" + , {"type": "CALL_EXPRESSION", "name": "default-NON_SYSTEM_TOOLS"} + ] + , [ "PATCH" + , { "type": "var" + , "name": "PATCH" + , "default": + { "type": "join" + , "$1": + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": + { "type": "lookup" + , "key": "PATCH" + , "map": {"type": "var", "name": "NON_SYSTEM_TOOLS"} + } + , "then": + ["./", {"type": "var", "name": "TOOLCHAIN_DIR"}, "/"] + } + , {"type": "CALL_EXPRESSION", "name": "default-PATCH"} + ] + } + } + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} + ] + } + ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] + , [ "orig" , { "type": "let*" , "bindings": [["fieldname", "src"], ["location", "orig"]] , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} @@ -30,26 +251,51 @@ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} } ] + , [ "script" + , { "type": "singleton_map" + , "key": "run_patch.sh" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ "set -e" + , "cp orig patched" + , "chmod +w patched" + , { "type": "join" + , "$1": + [ { "type": "join_cmd" + , "$1": + [ {"type": "var", "name": "PATCH", "default": "patch"} + , "patched" + , "patch" + ] + } + , " >log || (cat log && exit 1)" + ] + } + ] + } + } + } + ] , [ "inputs" , { "type": "map_union" , "$1": - [{"type": "var", "name": "orig"}, {"type": "var", "name": "patch"}] + [ {"type": "var", "name": "orig"} + , {"type": "var", "name": "patch"} + , {"type": "var", "name": "TOOLCHAIN"} + , {"type": "var", "name": "script"} + ] } ] , [ "patched" , { "type": "ACTION" , "inputs": {"type": "var", "name": "inputs"} , "outs": ["patched"] - , "cmd": - [ {"type": "var", "name": "PATCH", "default": "patch"} - , "-s" - , "--read-only=ignore" - , "--follow-symlinks" - , "-o" - , "patched" - , "orig" - , "patch" - ] + , "cmd": ["sh", "./run_patch.sh"] + , "env": {"type": "var", "name": "ENV"} } ] , [ "result" diff --git a/patch/TARGETS b/patch/TARGETS new file mode 100644 index 0000000..9a0ad77 --- /dev/null +++ b/patch/TARGETS @@ -0,0 +1,6 @@ +{ "defaults": + { "type": ["patch", "defaults"] + , "PATCH": ["patch"] + , "PATH": ["/bin", "/usr/bin"] + } +} -- cgit v1.2.3 From 2c5e3a6756fc871bbdde8a34d38cda297519b0f9 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Mon, 7 Aug 2023 15:14:46 +0200 Subject: rules: Support BUILD_ARCH for CC defaults --- CC/RULES | 7 +++++-- transitions/EXPRESSIONS | 25 +++++++++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/CC/RULES b/CC/RULES index 33b8520..c30aaee 100644 --- a/CC/RULES +++ b/CC/RULES @@ -26,7 +26,10 @@ [ "Optional toolchain directory. A collection of artifacts that provide" , "the tools CC, CXX, and AR (if needed). Note that only artifacts of" , "the specified targets are considered (no runfiles etc.). Specifying" - , "this field extends artifacts from \"base\"." + , "this field extends artifacts from \"base\". If the toolchain" + , "supports cross-compilation, it should perform a dispatch on the" + , "configuration variable \"BUILD_ARCH\" to determine for which" + , "architecture to generate code for." ] , "deps": [ "Optional CC libraries any CC library and CC binary implicitly depend" @@ -69,7 +72,7 @@ , "with \":\". Specifying this field extends values from \"base\"." ] } - , "config_vars": ["ARCH", "HOST_ARCH"] + , "config_vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] , "imports": { "base-provides": "defaults-base-provides" , "base-provides-list": "defaults-base-provides-list" diff --git a/transitions/EXPRESSIONS b/transitions/EXPRESSIONS index 4fd0d1e..596b20e 100644 --- a/transitions/EXPRESSIONS +++ b/transitions/EXPRESSIONS @@ -1,13 +1,22 @@ { "for host": - { "vars": ["ARCH", "HOST_ARCH"] + { "vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] , "expression": - { "type": "singleton_map" - , "key": "TARGET_ARCH" - , "value": - { "type": "var" - , "name": "HOST_ARCH" - , "default": {"type": "var", "name": "ARCH"} - } + { "type": "let*" + , "bindings": + [ [ "BUILD_ARCH" + , { "type": "var" + , "name": "TARGET_ARCH" + , "default": {"type": "var", "name": "ARCH"} + } + ] + , [ "TARGET_ARCH" + , { "type": "var" + , "name": "HOST_ARCH" + , "default": {"type": "var", "name": "ARCH"} + } + ] + ] + , "body": {"type": "env", "vars": ["BUILD_ARCH", "TARGET_ARCH"]} } } , "target properties": -- cgit v1.2.3 From 54bb2a33b3e36123f8f411f77ec8e76f5b021e3d Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Wed, 16 Aug 2023 15:10:31 +0200 Subject: rules: Propagate PATH list from defaults ... instead of creating an ENV from it and propagating this. The idea is to keep PATH entries separate and only join them with ":" when we need it. In this way, we can accumulate PATHs from multiple defaults later, and perform a deduplication ("nub_left") to shorten the final string length. --- CC/EXPRESSIONS | 31 +++++++++++++++++++++++++++++++ CC/foreign/EXPRESSIONS | 31 +++++++++++++++++++++++++++++++ CC/foreign/cmake/EXPRESSIONS | 29 ++++++++++++++++++++++++++--- CC/foreign/make/EXPRESSIONS | 29 ++++++++++++++++++++++++++--- CC/prebuilt/EXPRESSIONS | 31 +++++++++++++++++++++++++++++++ 5 files changed, 145 insertions(+), 6 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index 2a5011d..b718f76 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -1223,6 +1223,7 @@ , "flags": "flags" , "objects": "objects" , "default-ENV": "default-ENV" + , "default-PATH": "default-PATH" , "default-LDFLAGS": "default-LDFLAGS" , "default-TOOLCHAIN": "default-TOOLCHAIN" , "default-NON_SYSTEM_TOOLS": "default-NON_SYSTEM_TOOLS" @@ -1271,6 +1272,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , ["objects", {"type": "CALL_EXPRESSION", "name": "objects"}] , [ "base name" , { "type": "if" diff --git a/CC/foreign/EXPRESSIONS b/CC/foreign/EXPRESSIONS index 64e0e27..1692f83 100644 --- a/CC/foreign/EXPRESSIONS +++ b/CC/foreign/EXPRESSIONS @@ -43,6 +43,7 @@ , "imports": { "compiler-cc": ["CC", "compiler-cc"] , "default-ENV": ["CC", "default-ENV"] + , "default-PATH": ["CC", "default-PATH"] , "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"] , "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"] } @@ -69,6 +70,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , [ "expand_exec.c" , { "type": "singleton_map" , "key": "expand_exec.c" diff --git a/CC/foreign/cmake/EXPRESSIONS b/CC/foreign/cmake/EXPRESSIONS index 2266f61..ac7039c 100644 --- a/CC/foreign/cmake/EXPRESSIONS +++ b/CC/foreign/cmake/EXPRESSIONS @@ -27,6 +27,7 @@ ] , "imports": { "artifacts": ["", "field_artifacts"] + , "nub_left": ["", "nub_left"] , "flags-cc": ["CC", "flags-cc"] , "flags-cxx": ["CC", "flags-cxx"] , "compiler-cc": ["CC", "compiler-cc"] @@ -34,6 +35,7 @@ , "default-LDFLAGS": ["CC", "default-LDFLAGS"] , "default-AR": ["CC", "default-AR"] , "default-ENV": ["CC", "default-ENV"] + , "default-PATH": ["CC", "default-PATH"] , "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"] , "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"] , "expand_exec_tool": ["./", "..", "expand_exec_tool"] @@ -136,14 +138,25 @@ } } ] + , [ "PATH" + , { "type": "join" + , "separator": ":" + , "$1": + { "type": "let*" + , "bindings": + [["list", {"type": "CALL_EXPRESSION", "name": "default-PATH"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "nub_left"} + } + } + ] , [ "ENV" , { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} - , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} - , { "type": "env" + [ { "type": "env" , "vars": ["CC", "CXX", "CXXFLAGS", "CFLAGS", "LDFLAGS", "AR"] } + , {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} ] } ] @@ -190,7 +203,17 @@ , "mkdir scratch" , "readonly ROOT=\"$(pwd)\"" , "export TMPDIR=\"$(pwd)/scratch\"" + , "export TOOLCHAIN=\"$(pwd)/toolchain\"" , "export LOCALBASE=\"$(pwd)/localbase\"" + , { "type": "join" + , "$1": + [ "export PATH=\"$(./expand_exec TOOLCHAIN -- echo " + , { "type": "join_cmd" + , "$1": [{"type": "var", "name": "PATH"}] + } + , ")\":$PATH" + ] + } ] , { "type": "if" , "cond": {"type": "var", "name": "pre_cmds"} diff --git a/CC/foreign/make/EXPRESSIONS b/CC/foreign/make/EXPRESSIONS index ba98154..133b775 100644 --- a/CC/foreign/make/EXPRESSIONS +++ b/CC/foreign/make/EXPRESSIONS @@ -29,6 +29,7 @@ ] , "imports": { "artifacts": ["", "field_artifacts"] + , "nub_left": ["", "nub_left"] , "flags-cc": ["CC", "flags-cc"] , "flags-cxx": ["CC", "flags-cxx"] , "compiler-cc": ["CC", "compiler-cc"] @@ -36,6 +37,7 @@ , "default-LDFLAGS": ["CC", "default-LDFLAGS"] , "default-AR": ["CC", "default-AR"] , "default-ENV": ["CC", "default-ENV"] + , "default-PATH": ["CC", "default-PATH"] , "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"] , "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"] , "expand_exec_tool": ["./", "..", "expand_exec_tool"] @@ -132,15 +134,26 @@ , "else": {"type": "var", "name": "PREFIX", "default": "/"} } ] + , [ "PATH" + , { "type": "join" + , "separator": ":" + , "$1": + { "type": "let*" + , "bindings": + [["list", {"type": "CALL_EXPRESSION", "name": "default-PATH"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "nub_left"} + } + } + ] , [ "ENV" , { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} - , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} - , { "type": "env" + [ { "type": "env" , "vars": ["CC", "CXX", "CFLAGS", "CXXFLAGS", "LDFLAGS", "AR", "PREFIX"] } + , {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} ] } ] @@ -188,7 +201,17 @@ , "readonly ROOT=\"$(pwd)\"" , "export TMPDIR=\"$(pwd)/scratch\"" , "export DESTDIR=\"$(pwd)/install\"" + , "export TOOLCHAIN=\"$(pwd)/toolchain\"" , "export LOCALBASE=\"$(pwd)/localbase\"" + , { "type": "join" + , "$1": + [ "export PATH=\"$(./expand_exec TOOLCHAIN -- echo " + , { "type": "join_cmd" + , "$1": [{"type": "var", "name": "PATH"}] + } + , ")\":$PATH" + ] + } ] , { "type": "if" , "cond": {"type": "var", "name": "pre_cmds"} diff --git a/CC/prebuilt/EXPRESSIONS b/CC/prebuilt/EXPRESSIONS index c404bec..7b35c21 100644 --- a/CC/prebuilt/EXPRESSIONS +++ b/CC/prebuilt/EXPRESSIONS @@ -111,6 +111,7 @@ , "cflags-files-deps": ["./", "..", "cflags-files-deps"] , "ldflags-files-deps": ["./", "..", "ldflags-files-deps"] , "default-ENV": ["./", "..", "default-ENV"] + , "default-PATH": ["./", "..", "default-PATH"] } , "expression": { "type": "let*" @@ -239,6 +240,36 @@ ] } ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] , [ "main-pkg-config" , { "type": "foldl" , "range": -- cgit v1.2.3