From 34cdfeb793317de7909b18b31e72909164390794 Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Wed, 29 May 2024 12:01:30 +0200 Subject: debug rule: Add flag field to skip installing extra debug artifacts This is useful when we want to install targets built in debug mode, but do not want to stage all the additional source and header files if no debugging is being performed, e.g., in tests. --- CC/EXPRESSIONS | 22 +++++++++++++++++----- CC/RULES | 12 +++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index 7d9dfa1..437758e 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -1452,7 +1452,14 @@ } } , "install-with-deps result": - { "vars": ["pc-install-dir", "targets", "prefix", "flat-libs", "hdrs-only"] + { "vars": + [ "pc-install-dir" + , "targets" + , "prefix" + , "flat-libs" + , "hdrs-only" + , "skip-debug-stage" + ] , "imports": {"pkg-config": "pkg-config"} , "expression": { "type": "let*" @@ -1490,10 +1497,15 @@ } ] , [ "debug-srcs" - , { "type": "DEP_PROVIDES" - , "dep": {"type": "var", "name": "target"} - , "provider": "debug-srcs" - , "default": {"type": "empty_map"} + , { "type": "if" + , "cond": {"type": "var", "name": "skip-debug-stage"} + , "then": {"type": "empty_map"} + , "else": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "debug-srcs" + , "default": {"type": "empty_map"} + } } ] ] diff --git a/CC/RULES b/CC/RULES index a2ced03..4d906ff 100644 --- a/CC/RULES +++ b/CC/RULES @@ -718,12 +718,13 @@ , "the target, artifacts and dependencies will be installed to" , "subdirectories \"bin\", \"include\", and \"lib\". For library targets," , "a pkg-config file is generated and provided in \"lib/pkgconfig\"." - , "In debug mode, sources needed for local debugging will be installed to" - , "subdirectory \"debug-src\"." + , "In debug mode, depending on the target, additional artifacts needed for" + , "local debugging are gathered and installed, depending on target, to" + , "\"work\" and \"include\"." ] , "config_vars": ["PREFIX"] , "target_fields": ["targets"] - , "string_fields": ["flat-libs", "prefix", "hdrs-only"] + , "string_fields": ["flat-libs", "prefix", "hdrs-only", "skip-debug-stage"] , "imports": {"install result": "install-with-deps result"} , "field_doc": { "targets": ["Targets to install artifacts from."] @@ -739,6 +740,10 @@ , "taken, with the default value being \"/\"." ] , "hdrs-only": ["Only collect headers from deps (without subdirectory)."] + , "skip-debug-stage": + [ "If in debug mode, skip installing additional artifacts gathered if no" + , "local debugging is needed, but debug targets are nonetheless desired." + ] } , "config_doc": { "PREFIX": @@ -768,6 +773,7 @@ ] , ["flat-libs", {"type": "FIELD", "name": "flat-libs"}] , ["hdrs-only", {"type": "FIELD", "name": "hdrs-only"}] + , ["skip-debug-stage", {"type": "FIELD", "name": "skip-debug-stage"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "install result"} } -- cgit v1.2.3 From 378ab0b30a90969e70d905a977bd53bb7828f052 Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Tue, 28 May 2024 12:49:56 +0200 Subject: debug rule: Fix staging of headers For libraries the headers of private dependencies were wrongly skipped from staging. For binaries, no headers were passed at all in the provides map. To fix these issues, an additional field is added in the provides map to ensure we collect, and then properly stage, all needed headers for both libraries and binaries. --- CC/EXPRESSIONS | 82 +++++++++++++++++++++++++++++++++++++++++++++++++--------- CC/RULES | 7 +++-- 2 files changed, 75 insertions(+), 14 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index 437758e..f3188c0 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -212,11 +212,13 @@ } } } -, "debug-srcs": - { "doc": ["Collect debug dependencies (sources) from given target_fields"] - , "vars": ["deps-fieldnames", "deps-transition"] +, "debug-deps": + { "doc": + ["Collect debug dependencies (sources/headers) from given target_fields"] + , "vars": ["deps-provider", "deps-fieldnames", "deps-transition"] , "vars_doc": - { "deps-fieldnames": + { "deps-provider": ["Name of provider to use (debug-srcs/debug-hdrs)."] + , "deps-fieldnames": ["List of target_field names to collect dependencies from."] , "deps-transition": ["The optional configuration transition for the targets."] @@ -235,7 +237,7 @@ , "$1": { "type": "let*" , "bindings": - [ ["provider", "debug-srcs"] + [ ["provider", {"type": "var", "name": "deps-provider"}] , ["transition", {"type": "var", "name": "deps-transition"}] , ["default", {"type": "empty_map"}] ] @@ -1106,7 +1108,7 @@ , "cflags-files-deps": "cflags-files-deps" , "ldflags-files-deps": "ldflags-files-deps" , "lib artifact": "lib artifact" - , "debug-srcs": "debug-srcs" + , "debug-deps": "debug-deps" } , "expression": { "type": "let*" @@ -1151,8 +1153,29 @@ , "then": { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "debug-srcs"} + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-srcs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } , {"type": "var", "name": "srcs"} + , {"type": "var", "name": "private-hdrs"} + , {"type": "var", "name": "hdrs"} + ] + } + , "else": {"type": "empty_map"} + } + ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "DEBUG"} + , "then": + { "type": "map_union" + , "$1": + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } + , {"type": "var", "name": "hdrs"} ] } , "else": {"type": "empty_map"} @@ -1197,6 +1220,7 @@ , "link-args" , "package" , "debug-srcs" + , "debug-hdrs" ] } , { "type": "var" @@ -1396,7 +1420,7 @@ , "cflags-files-deps": "cflags-files-deps" , "ldflags-files-deps": "ldflags-files-deps" , "binary": "bin artifact" - , "debug-srcs": "debug-srcs" + , "debug-deps": "debug-deps" } , "expression": { "type": "let*" @@ -1436,18 +1460,34 @@ , "then": { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "debug-srcs"} + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-srcs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } , {"type": "var", "name": "srcs"} + , {"type": "var", "name": "private-hdrs"} ] } , "else": {"type": "empty_map"} } ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "DEBUG"} + , "then": + { "type": "let*" + , "bindings": [["deps-provider", "debug-hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } + , "else": {"type": "empty_map"} + } + ] ] , "body": { "type": "RESULT" , "artifacts": {"type": "CALL_EXPRESSION", "name": "binary"} - , "provides": {"type": "env", "vars": ["package", "debug-srcs"]} + , "provides": + {"type": "env", "vars": ["package", "debug-srcs", "debug-hdrs"]} } } } @@ -1508,6 +1548,18 @@ } } ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "skip-debug-stage"} + , "then": {"type": "empty_map"} + , "else": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "debug-hdrs" + , "default": {"type": "empty_map"} + } + } + ] ] , "body": { "type": "if" @@ -1650,7 +1702,13 @@ } , { "type": "to_subdir" , "subdir": "include" - , "$1": {"type": "var", "name": "headers"} + , "$1": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "headers"} + , {"type": "var", "name": "debug-hdrs"} + ] + } } , { "type": "to_subdir" , "subdir": "lib" @@ -1663,7 +1721,7 @@ , "$1": {"type": "var", "name": "pkg-config"} } , { "type": "to_subdir" - , "subdir": "debug-src" + , "subdir": "work" , "$1": {"type": "var", "name": "debug-srcs"} } ] diff --git a/CC/RULES b/CC/RULES index 4d906ff..05653fa 100644 --- a/CC/RULES +++ b/CC/RULES @@ -462,7 +462,8 @@ [ "List of strings that have to be added to the command line for linking actions" , "in targets depending on this library" ] - , "debug-srcs": ["Map of all dependencies' sources needed for debugging."] + , "debug-srcs": ["Map of all sources needed for debugging."] + , "debug-hdrs": ["Map of all additional headers needed for debugging."] } , "anonymous": { "proto-deps": @@ -642,7 +643,9 @@ , "artifacts_doc": ["The final binary, staged to the given directory"] , "runfiles_doc": ["None"] , "provides_doc": - {"debug-srcs": ["Map of all dependencies' sources needed for debugging."]} + { "debug-srcs": ["Map of all sources needed for debugging."] + , "debug-hdrs": ["Map of all additional headers needed for debugging."] + } , "anonymous": { "private-proto-deps": { "target": "private-proto" -- cgit v1.2.3 From 03fa22155c8236e4834e2b51bc7a631ca170459e Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Wed, 29 May 2024 12:18:48 +0200 Subject: debug rule: Add flag field to skip installing extra debug artifacts This is useful when we want to install targets built in debug mode, but do not want to stage all the additional source and header files if no debugging is being performed, e.g., in tests. --- CC/EXPRESSIONS | 31 +++++++++++++++++++++++++------ CC/RULES | 12 +++++++++--- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index e0c729d..f2259b6 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -2213,7 +2213,14 @@ } } , "install-with-deps stage": - { "vars": ["pc-install-dir", "targets", "prefix", "flat-libs", "hdrs-only"] + { "vars": + [ "pc-install-dir" + , "targets" + , "prefix" + , "flat-libs" + , "hdrs-only" + , "skip-debug-stage" + ] , "imports": { "compile-deps": "compile-deps" , "compile-args-deps": "compile-args-deps" @@ -2259,10 +2266,15 @@ } ] , [ "debug-srcs" - , { "type": "DEP_PROVIDES" - , "dep": {"type": "var", "name": "target"} - , "provider": "debug-srcs" - , "default": {"type": "empty_map"} + , { "type": "if" + , "cond": {"type": "var", "name": "skip-debug-stage"} + , "then": {"type": "empty_map"} + , "else": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "debug-srcs" + , "default": {"type": "empty_map"} + } } ] ] @@ -2449,7 +2461,14 @@ } } , "install-with-deps result": - { "vars": ["pc-install-dir", "targets", "prefix", "flat-libs", "hdrs-only"] + { "vars": + [ "pc-install-dir" + , "targets" + , "prefix" + , "flat-libs" + , "hdrs-only" + , "skip-debug-stage" + ] , "imports": {"install stage": "install-with-deps stage"} , "expression": { "type": "RESULT" diff --git a/CC/RULES b/CC/RULES index 2c381a6..09605f7 100644 --- a/CC/RULES +++ b/CC/RULES @@ -844,12 +844,13 @@ , "the target, artifacts and dependencies will be installed to" , "subdirectories \"bin\", \"include\", and \"lib\". For library targets," , "a pkg-config file is generated and provided in \"lib/pkgconfig\"." - , "In debug mode, sources needed for local debugging will be installed to" - , "subdirectory \"debug-src\"." + , "In debug mode, depending on the target, additional artifacts needed for" + , "local debugging are gathered and installed, depending on target, to" + , "\"work\" and \"include\"." ] , "config_vars": ["PREFIX"] , "target_fields": ["targets"] - , "string_fields": ["flat-libs", "prefix", "hdrs-only"] + , "string_fields": ["flat-libs", "prefix", "hdrs-only", "skip-debug-stage"] , "imports": {"install result": "install-with-deps result"} , "field_doc": { "targets": ["Targets to install artifacts from."] @@ -865,6 +866,10 @@ , "taken, with the default value being \"/\"." ] , "hdrs-only": ["Only collect headers from deps (without subdirectory)."] + , "skip-debug-stage": + [ "If in debug mode, skip installing additional artifacts gathered if no" + , "local debugging is needed, but debug targets are nonetheless desired." + ] } , "config_doc": { "PREFIX": @@ -894,6 +899,7 @@ ] , ["flat-libs", {"type": "FIELD", "name": "flat-libs"}] , ["hdrs-only", {"type": "FIELD", "name": "hdrs-only"}] + , ["skip-debug-stage", {"type": "FIELD", "name": "skip-debug-stage"}] ] , "body": {"type": "CALL_EXPRESSION", "name": "install result"} } -- cgit v1.2.3 From ad89c7bf02011e28d7ec822186e1d834059c8dcb Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Tue, 28 May 2024 12:50:25 +0200 Subject: debug rule: Fix staging of headers For libraries the headers of private dependencies were wrongly skipped from staging. For binaries, no headers were passed at all in the provides map. To fix these issues, an additional field is added in the provides map to ensure we collect, and then properly stage, all needed headers for both libraries and binaries. --- CC/EXPRESSIONS | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++------- CC/RULES | 7 ++- 2 files changed, 124 insertions(+), 18 deletions(-) diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index f2259b6..0e1e4b9 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -212,11 +212,13 @@ } } } -, "debug-srcs": - { "doc": ["Collect debug dependencies (sources) from given target_fields"] - , "vars": ["deps-fieldnames", "deps-transition"] +, "debug-deps": + { "doc": + ["Collect debug dependencies (sources/headers) from given target_fields"] + , "vars": ["deps-provider", "deps-fieldnames", "deps-transition"] , "vars_doc": - { "deps-fieldnames": + { "deps-provider": ["Name of provider to use (debug-srcs/debug-hdrs)."] + , "deps-fieldnames": ["List of target_field names to collect dependencies from."] , "deps-transition": ["The optional configuration transition for the targets."] @@ -235,7 +237,7 @@ , "$1": { "type": "let*" , "bindings": - [ ["provider", "debug-srcs"] + [ ["provider", {"type": "var", "name": "deps-provider"}] , ["transition", {"type": "var", "name": "deps-transition"}] , ["default", {"type": "empty_map"}] ] @@ -1193,7 +1195,7 @@ , "cflags-files-deps": "cflags-files-deps" , "ldflags-files-deps": "ldflags-files-deps" , "lib artifact": "lib artifact" - , "debug-srcs": "debug-srcs" + , "debug-deps": "debug-deps" } , "expression": { "type": "let*" @@ -1245,8 +1247,29 @@ , "then": { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "debug-srcs"} + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-srcs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } , {"type": "var", "name": "srcs"} + , {"type": "var", "name": "private-hdrs"} + , {"type": "var", "name": "hdrs"} + ] + } + , "else": {"type": "empty_map"} + } + ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "DEBUG"} + , "then": + { "type": "map_union" + , "$1": + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } + , {"type": "var", "name": "hdrs"} ] } , "else": {"type": "empty_map"} @@ -1293,6 +1316,7 @@ , "run-libs-args" , "package" , "debug-srcs" + , "debug-hdrs" ] } , { "type": "var" @@ -1548,7 +1572,7 @@ , "cflags-files-deps": "cflags-files-deps" , "ldflags-files-deps": "ldflags-files-deps" , "shared artifact": "shared artifact" - , "debug-srcs": "debug-srcs" + , "debug-deps": "debug-deps" } , "expression": { "type": "let*" @@ -1595,8 +1619,29 @@ , "then": { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "debug-srcs"} + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-srcs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } , {"type": "var", "name": "srcs"} + , {"type": "var", "name": "private-hdrs"} + , {"type": "var", "name": "hdrs"} + ] + } + , "else": {"type": "empty_map"} + } + ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "DEBUG"} + , "then": + { "type": "map_union" + , "$1": + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } + , {"type": "var", "name": "hdrs"} ] } , "else": {"type": "empty_map"} @@ -1683,6 +1728,7 @@ , "run-libs-args" , "package" , "debug-srcs" + , "debug-hdrs" ] } , { "type": "var" @@ -1828,7 +1874,7 @@ , "cflags-files-deps": "cflags-files-deps" , "ldflags-files-deps": "ldflags-files-deps" , "object artifacts": "object artifacts" - , "debug-srcs": "debug-srcs" + , "debug-deps": "debug-deps" } , "expression": { "type": "let*" @@ -1880,8 +1926,29 @@ , "then": { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "debug-srcs"} + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-srcs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } , {"type": "var", "name": "srcs"} + , {"type": "var", "name": "private-hdrs"} + , {"type": "var", "name": "hdrs"} + ] + } + , "else": {"type": "empty_map"} + } + ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "DEBUG"} + , "then": + { "type": "map_union" + , "$1": + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } + , {"type": "var", "name": "hdrs"} ] } , "else": {"type": "empty_map"} @@ -1928,6 +1995,7 @@ , "run-libs-args" , "package" , "debug-srcs" + , "debug-hdrs" ] } , { "type": "var" @@ -2152,7 +2220,7 @@ , "cflags-files-deps": "cflags-files-deps" , "ldflags-files-deps": "ldflags-files-deps" , "binary": "bin artifact" - , "debug-srcs": "debug-srcs" + , "debug-deps": "debug-deps" } , "expression": { "type": "let*" @@ -2196,19 +2264,36 @@ , "then": { "type": "map_union" , "$1": - [ {"type": "CALL_EXPRESSION", "name": "debug-srcs"} + [ { "type": "let*" + , "bindings": [["deps-provider", "debug-srcs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } , {"type": "var", "name": "srcs"} + , {"type": "var", "name": "private-hdrs"} ] } , "else": {"type": "empty_map"} } ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "DEBUG"} + , "then": + { "type": "let*" + , "bindings": [["deps-provider", "debug-hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"} + } + , "else": {"type": "empty_map"} + } + ] ] , "body": { "type": "RESULT" , "artifacts": {"type": "CALL_EXPRESSION", "name": "binary"} , "provides": - {"type": "env", "vars": ["run-libs", "package", "debug-srcs"]} + { "type": "env" + , "vars": ["run-libs", "package", "debug-srcs", "debug-hdrs"] + } } } } @@ -2277,6 +2362,18 @@ } } ] + , [ "debug-hdrs" + , { "type": "if" + , "cond": {"type": "var", "name": "skip-debug-stage"} + , "then": {"type": "empty_map"} + , "else": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "debug-hdrs" + , "default": {"type": "empty_map"} + } + } + ] ] , "body": { "type": "if" @@ -2432,7 +2529,13 @@ } , { "type": "to_subdir" , "subdir": "include" - , "$1": {"type": "var", "name": "headers"} + , "$1": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "headers"} + , {"type": "var", "name": "debug-hdrs"} + ] + } } , { "type": "to_subdir" , "subdir": "lib" @@ -2445,7 +2548,7 @@ , "$1": {"type": "var", "name": "pkg-config"} } , { "type": "to_subdir" - , "subdir": "debug-src" + , "subdir": "work" , "$1": {"type": "var", "name": "debug-srcs"} } ] diff --git a/CC/RULES b/CC/RULES index 09605f7..7e9fbf9 100644 --- a/CC/RULES +++ b/CC/RULES @@ -521,7 +521,8 @@ [ "List of strings that have to be added to the command line for linking actions" , "in targets depending on this library" ] - , "debug-srcs": ["Map of all dependencies' sources needed for debugging."] + , "debug-srcs": ["Map of all sources needed for debugging."] + , "debug-hdrs": ["Map of all additional headers needed for debugging."] } , "anonymous": { "proto-deps": @@ -768,7 +769,9 @@ , "artifacts_doc": ["The final binary, staged to the given directory"] , "runfiles_doc": ["None"] , "provides_doc": - {"debug-srcs": ["Map of all dependencies' sources needed for debugging."]} + { "debug-srcs": ["Map of all sources needed for debugging."] + , "debug-hdrs": ["Map of all additional headers needed for debugging."] + } , "anonymous": { "private-proto-deps": { "target": "private-proto" -- cgit v1.2.3