From 968a7e8b8093f7530d74eec8154866629610abe9 Mon Sep 17 00:00:00 2001 From: Alejandro Rosso Date: Thu, 25 May 2023 00:20:24 -0500 Subject: [PATCH 1/6] Initial fix for tools arrays. --- lib/ceedling/configurator.rb | 42 +++++++++++++++----------- lib/ceedling/configurator_setup.rb | 14 +++++++-- lib/ceedling/configurator_validator.rb | 10 +++--- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/lib/ceedling/configurator.rb b/lib/ceedling/configurator.rb index 9d653bf92..6c2619bed 100644 --- a/lib/ceedling/configurator.rb +++ b/lib/ceedling/configurator.rb @@ -129,24 +129,25 @@ def get_runner_config # set up default values def tools_setup(config) config[:tools].each_key do |name| - tool = config[:tools][name] - - # populate name if not given - tool[:name] = name.to_s if (tool[:name].nil?) - - # handle inline ruby string substitution in executable - if (tool[:executable] =~ RUBY_STRING_REPLACEMENT_PATTERN) - tool[:executable].replace(@system_wrapper.module_eval(tool[:executable])) - end + tools = [config[:tools][name]].flatten(1) + tools.each do |tool| + # populate name if not given + tool[:name] = name.to_s if (tool[:name].nil?) + + # handle inline ruby string substitution in executable + if (tool[:executable] =~ RUBY_STRING_REPLACEMENT_PATTERN) + tool[:executable].replace(@system_wrapper.module_eval(tool[:executable])) + end - # populate stderr redirect option - tool[:stderr_redirect] = StdErrRedirect::NONE if (tool[:stderr_redirect].nil?) + # populate stderr redirect option + tool[:stderr_redirect] = StdErrRedirect::NONE if (tool[:stderr_redirect].nil?) - # populate background execution option - tool[:background_exec] = BackgroundExec::NONE if (tool[:background_exec].nil?) + # populate background execution option + tool[:background_exec] = BackgroundExec::NONE if (tool[:background_exec].nil?) - # populate optional option to control verification of executable in search paths - tool[:optional] = false if (tool[:optional].nil?) + # populate optional option to control verification of executable in search paths + tool[:optional] = false if (tool[:optional].nil?) + end end end @@ -155,11 +156,12 @@ def tools_supplement_arguments(config) tools_name_prefix = 'tools_' config[:tools].each_key do |name| tool = @project_config_hash[(tools_name_prefix + name.to_s).to_sym] + next if tool.is_a? Array # smoosh in extra arguments if specified at top-level of config (useful for plugins & default gcc tools) # arguments are squirted in at _end_ of list top_level_tool = (tools_name_prefix + name.to_s).to_sym - if (not config[top_level_tool].nil?) + if (not config[top_level_tool].nil? and not config[top_level_tool].is_a? Array) # adding and flattening is not a good idea: might over-flatten if there's array nesting in tool args tool[:arguments].concat config[top_level_tool][:arguments] end @@ -284,7 +286,12 @@ def standardize_paths(config) config[:files].each_pair { |collection, files| files.each{ |path| FilePathUtils::standardize( path ) } } - config[:tools].each_pair { |tool, config| FilePathUtils::standardize( config[:executable] ) if (config.include? :executable) } + config[:tools].each_pair do |tool, config| + tools = [config].flatten(1) + tools.each do |config| + FilePathUtils::standardize( config[:executable] ) if (config.include? :executable) + end + end # all other paths at secondary hash key level processed by convention: # ex. [:toplevel][:foo_path] & [:toplevel][:bar_paths] are standardized @@ -378,4 +385,3 @@ def eval_path_list( paths ) end - diff --git a/lib/ceedling/configurator_setup.rb b/lib/ceedling/configurator_setup.rb index c43bb5c12..399d39be2 100644 --- a/lib/ceedling/configurator_setup.rb +++ b/lib/ceedling/configurator_setup.rb @@ -103,9 +103,17 @@ def validate_tools(config) validation = [] config[:tools].keys.sort.each do |key| - validation << @configurator_validator.exists?(config, :tools, key, :executable) - validation << @configurator_validator.validate_executable_filepath(config, :tools, key, :executable) if (not config[:tools][key][:optional]) - validation << @configurator_validator.validate_tool_stderr_redirect(config, :tools, key) + if config[:tools][key].is_a? Array + config[:tools][key].each_index do |idx| + validation << @configurator_validator.exists?(config, :tools, key, idx, :executable) + validation << @configurator_validator.validate_executable_filepath(config, :tools, key, idx, :executable) if (not config[:tools][key][idx][:optional]) + validation << @configurator_validator.validate_tool_stderr_redirect(config, :tools, key, idx) + end + else + validation << @configurator_validator.exists?(config, :tools, key, :executable) + validation << @configurator_validator.validate_executable_filepath(config, :tools, key, :executable) if (not config[:tools][key][:optional]) + validation << @configurator_validator.validate_tool_stderr_redirect(config, :tools, key) + end end return false if (validation.include?(false)) diff --git a/lib/ceedling/configurator_validator.rb b/lib/ceedling/configurator_validator.rb index f362f6baa..af03f6471 100644 --- a/lib/ceedling/configurator_validator.rb +++ b/lib/ceedling/configurator_validator.rb @@ -144,12 +144,14 @@ def validate_executable_filepath(config, *keys) return true end - def validate_tool_stderr_redirect(config, tools, tool) - redirect = config[tools][tool][:stderr_redirect] + def validate_tool_stderr_redirect(config, *keys) + hash = retrieve_value(config, keys + [:stderr_redirect]) + redirect = hash[:value] + if (redirect.class == Symbol) # map constants and force to array of strings for runtime universality across ruby versions if (not StdErrRedirect.constants.map{|constant| constant.to_s}.include?(redirect.to_s.upcase)) - error = "ERROR: [:#{tools}][:#{tool}][:stderr_redirect][:#{redirect}] is not a recognized option " + + error = "ERROR: #{format_key_sequence(keys, hash[:depth])}[:#{redirect}] is not a recognized option " + "{#{StdErrRedirect.constants.map{|constant| ':' + constant.to_s.downcase}.join(', ')}}." @stream_wrapper.stderr_puts(error) return false @@ -185,7 +187,7 @@ def retrieve_value(config, keys) def format_key_sequence(keys, depth) walked_keys = keys.slice(0, depth) - formatted_keys = walked_keys.map{|key| "[:#{key}]"} + formatted_keys = walked_keys.map{|key| "[#{key.is_a?(Integer)? '' : ':'}#{key}]"} return formatted_keys.join end From bcaff8f0de26cca58f250e2f410114e9f85dabba Mon Sep 17 00:00:00 2001 From: Alejandro Rosso Date: Thu, 13 Jun 2024 22:46:51 -0500 Subject: [PATCH 2/6] Add mention to tools array usage. --- plugins/command_hooks/README.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/plugins/command_hooks/README.md b/plugins/command_hooks/README.md index ffed24ff6..9227e2d21 100644 --- a/plugins/command_hooks/README.md +++ b/plugins/command_hooks/README.md @@ -22,14 +22,14 @@ To connect a utilties or scripts to build step hooks, Ceedling tools must be def A Ceedling tool is just a YAML blob that gathers together a handful of settings and values that tell Ceedling how to build and execute a command line. Your tool can be a command line utility, a script, etc. -Example Ceedling tools follow. Their tool entry names correspond to the build step hooks listed later in this document. That's how this plugin works. When enabled, it ensures any tools you define are executed by the corresponding build step hook that shares their name. +Example Ceedling tools follow. Their tool entry names correspond to the build step hooks listed later in this document. That's how this plugin works. When enabled, it ensures any tools you define are executed by the corresponding build step hook that shares their name. The build step hook tool entry can be either a Ceedling tool or a list of them. -Each Ceedling tool requires an `:executable` string and an optional `:arguments` list. See _[CeedlingPacket][ceedling-packet]_ documentation for `:tools` entries to understand how to craft your argument list and other tool options. +Each Ceedling tool requires an `:executable` string and an optional `:arguments` list. See _[CeedlingPacket][ceedling-packet]_ documentation for [`:tools`](https://github.com/ThrowTheSwitch/Ceedling/blob/test/ceedling_0_32_rc/docs/CeedlingPacket.md#tools-configuring-command-line-tools-used-for-build-steps) entries to understand how to craft your argument list and other tool options. At present, this plugin only passes at most one runtime parameter for a given build step hook for use in a tool's argument list (from among the many processed by Ceedling's plugin framework). If available, this parameter can be referenced with a Ceedling tool argument expansion identifier `${1}`. That is, wherever you place `${1}` in your tool argument list, `${1}` will expand in the command line Ceedling constructs with the parameter this plugin provides for that build step hook. The list of build steps hooks below document any single parameters they provide at execution. ```yaml -:tools: +:command_hooks: # Called every time a mock is generated # Who knows what my_script.py does -- sky is the limit :pre_mock_generate: @@ -40,18 +40,26 @@ At present, this plugin only passes at most one runtime parameter for a given bu - ${1} # Replaced with the filepath of the header file that will be mocked # Called after each linking operation - # Here, we are converting a binary executable to S-record format + # Here, we are performing two task on the same build step hook, converting a + # binary executable to S-record format and then, zipping it along with some + # other files like linker's memory allocation/usage report and so on. :post_link_execute: - :executable: objcopy.exe - :arguments: - - ${1} # Replaced with the filepath to the linker's binary artifact output - - output.srec - - --strip-all + - :executable: objcopy.exe + :arguments: + - ${1} # Replaced with the filepath to the linker's binary artifact output + - output.srec + - --strip-all + - :executable: + :arguments: tar.exe + - -acf + - awesome_build.zip + - ${1} # Replaced with the filepath to the linker's binary artifact output + - memory_report.txt ``` # Available Build Step Hooks -Define any of the following entries within the `:tools:` section of your Ceedling project file to automagically connect utilities or scripts to build process steps. +Define any of the following entries within the `:command_hooks:` section of your Ceedling project file to automagically connect utilities or scripts to build process steps. Some hooks are called for every file-related operation for which the hook is named. Other hooks are triggered by single build step for which the hook is named. From 619a8bee6b4a5a9582eb8fcf4c6b8fbea195e4ae Mon Sep 17 00:00:00 2001 From: Alejandro Rosso Date: Mon, 17 Jun 2024 01:22:52 -0500 Subject: [PATCH 3/6] Load configuration from :command_hooks section and perform extra valildations. --- plugins/command_hooks/lib/command_hooks.rb | 134 ++++++++++++++++----- 1 file changed, 106 insertions(+), 28 deletions(-) diff --git a/plugins/command_hooks/lib/command_hooks.rb b/plugins/command_hooks/lib/command_hooks.rb index 7cc55aa70..637fb12e4 100755 --- a/plugins/command_hooks/lib/command_hooks.rb +++ b/plugins/command_hooks/lib/command_hooks.rb @@ -5,36 +5,62 @@ # SPDX-License-Identifier: MIT # ========================================================================= -require 'ceedling/plugin' require 'ceedling/constants' -class CommandHooks < Plugin +require 'ceedling/exceptions' +require 'ceedling/plugin' + +COMMAND_HOOKS_ROOT_NAME = 'command_hooks'.freeze +COMMAND_HOOKS_SYM = COMMAND_HOOKS_ROOT_NAME.to_sym - attr_reader :config +COMMAND_HOOKS_LIST = [ + :pre_mock_preprocess, + :post_mock_preprocess, + :pre_test_preprocess, + :post_test_preprocess, + :pre_mock_generate, + :post_mock_generate, + :pre_runner_generate, + :post_runner_generate, + :pre_compile_execute, + :post_compile_execute, + :pre_link_execute, + :post_link_execute, + :pre_test_fixture_execute, + :post_test_fixture_execute, + :pre_test, + :post_test, + :pre_release, + :post_release, + :pre_build, + :post_build, + :post_error, +].freeze + +class CommandHooks < Plugin def setup - @config = { - :pre_mock_preprocess => ((defined? TOOLS_PRE_MOCK_PREPROCESS) ? TOOLS_PRE_MOCK_PREPROCESS : nil ), - :post_mock_preprocess => ((defined? TOOLS_POST_MOCK_PREPROCESS) ? TOOLS_POST_MOCK_PREPROCESS : nil ), - :pre_test_preprocess => ((defined? TOOLS_PRE_TEST_PREPROCESS) ? TOOLS_PRE_TEST_PREPROCESS : nil ), - :post_test_preprocess => ((defined? TOOLS_POST_TEST_PREPROCESS) ? TOOLS_POST_TEST_PREPROCESS : nil ), - :pre_mock_generate => ((defined? TOOLS_PRE_MOCK_GENERATE) ? TOOLS_PRE_MOCK_GENERATE : nil ), - :post_mock_generate => ((defined? TOOLS_POST_MOCK_GENERATE) ? TOOLS_POST_MOCK_GENERATE : nil ), - :pre_runner_generate => ((defined? TOOLS_PRE_RUNNER_GENERATE) ? TOOLS_PRE_RUNNER_GENERATE : nil ), - :post_runner_generate => ((defined? TOOLS_POST_RUNNER_GENERATE) ? TOOLS_POST_RUNNER_GENERATE : nil ), - :pre_compile_execute => ((defined? TOOLS_PRE_COMPILE_EXECUTE) ? TOOLS_PRE_COMPILE_EXECUTE : nil ), - :post_compile_execute => ((defined? TOOLS_POST_COMPILE_EXECUTE) ? TOOLS_POST_COMPILE_EXECUTE : nil ), - :pre_link_execute => ((defined? TOOLS_PRE_LINK_EXECUTE) ? TOOLS_PRE_LINK_EXECUTE : nil ), - :post_link_execute => ((defined? TOOLS_POST_LINK_EXECUTE) ? TOOLS_POST_LINK_EXECUTE : nil ), - :pre_test_fixture_execute => ((defined? TOOLS_PRE_TEST_FIXTURE_EXECUTE) ? TOOLS_PRE_TEST_FIXTURE_EXECUTE : nil ), - :post_test_fixture_execute => ((defined? TOOLS_POST_TEST_FIXTURE_EXECUTE) ? TOOLS_POST_TEST_FIXTURE_EXECUTE : nil ), - :pre_test => ((defined? TOOLS_PRE_TEST) ? TOOLS_PRE_TEST : nil ), - :post_test => ((defined? TOOLS_POST_TEST) ? TOOLS_POST_TEST : nil ), - :pre_release => ((defined? TOOLS_PRE_RELEASE) ? TOOLS_PRE_RELEASE : nil ), - :post_release => ((defined? TOOLS_POST_RELEASE) ? TOOLS_POST_RELEASE : nil ), - :pre_build => ((defined? TOOLS_PRE_BUILD) ? TOOLS_PRE_BUILD : nil ), - :post_build => ((defined? TOOLS_POST_BUILD) ? TOOLS_POST_BUILD : nil ), - :post_error => ((defined? TOOLS_POST_ERROR) ? TOOLS_POST_ERROR : nil ), - } + project_config = @ceedling[:setupinator].config_hash + + config_exists = @ceedling[:configurator_validator].exists?( + project_config, + COMMAND_HOOKS_SYM + ) + + unless config_exists + raise CeedlingException.new("Missing configuration :command_hooks") + end + + @config = project_config[COMMAND_HOOKS_SYM] + + validate_config(@config) + + @config.each do |hook, tool| + if tool.is_a?(Array) + tool.each_index {|index| validate_hook_tool(project_config, hook, index)} + else + validate_hook_tool(project_config, hook) + end + end end def pre_mock_preprocess(arg_hash); run_hook( :pre_mock_preprocess, arg_hash[:header_file] ); end @@ -60,7 +86,60 @@ def post_build; run_hook( :post_build def post_error; run_hook( :post_error ); end private - + + ## + # Validate plugin configuration. + # + # :args: + # - config: :command_hooks section from project config hash + # + def validate_config(config) + unless config.is_a?(Hash) + error = "Expected configuration :command_hooks to be a Hash but found #{config.class}" + raise CeedlingException.new(error) + end + + unknown_hooks = config.keys - COMMAND_HOOKS_LIST + + unknown_hooks.each do |not_a_hook| + error = "Unrecognized hook '#{not_a_hook}'." + @ceedling[:loginator].log(error, Verbosity::ERRORS) + end + + unless unknown_hooks.empty? + error = "Unrecognized hooks have been found in project configuration" + raise CeedlingException.new(error) + end + end + + ## + # Validate given hook tool. + # + # :args: + # - config: Project configuration hash + # - keys: Key and index of hook inside :command_hooks configuration + # + def validate_hook_tool(config, *keys) + walk = [COMMAND_HOOKS_SYM, *keys] + name = @ceedling[:reportinator].generate_config_walk(walk) + hash = @ceedling[:config_walkinator].fetch_value(config, *walk) + + tool_exists = @ceedling[:configurator_validator].exists?(config, *walk) + + unless tool_exists + raise CeedlingException.new("Missing configuration #{name}") + end + + tool = hash[:value] + + unless tool.is_a?(Hash) + error = "Expected configuration #{name} to be a Hash but found #{tool.class}" + raise CeedlingException.new(error) + end + + @ceedling[:tool_validator].validate(tool: tool, name: name, boom: true) + end + ## # Run a hook if its available. # @@ -110,4 +189,3 @@ def run_hook(which_hook, name="") end end end - From a13525ac1e76af1c96d42677616d65a948718dc2 Mon Sep 17 00:00:00 2001 From: Alejandro Rosso Date: Mon, 17 Jun 2024 01:23:07 -0500 Subject: [PATCH 4/6] Add notes on Command Hooks plugin. --- docs/BreakingChanges.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/BreakingChanges.md b/docs/BreakingChanges.md index 6c6646d7a..97bda844a 100644 --- a/docs/BreakingChanges.md +++ b/docs/BreakingChanges.md @@ -154,6 +154,9 @@ In addition, a previously undocumented feature for merging a second configuratio Thorough documentation on Mixins and the new options for loading a project configuration can be found in _[CeedlingPacket](CeedlingPacket.md))_. +## `command_hooks` plugin tools configuration + +Previously, Command Hooks tools were defined under `:tools` section, now they must be defined under top-level `:command_hooks` section in project configuration. # Subprojects Plugin Replaced @@ -200,4 +203,4 @@ The above subproject definition will now look like the following: :defines: - DEFINE_JUST_FOR_THIS_FILE - AND_ANOTHER -``` \ No newline at end of file +``` From b508885857bdc3d6980d9c5803fbdc0036e144b1 Mon Sep 17 00:00:00 2001 From: Alejandro Rosso Date: Mon, 17 Jun 2024 01:37:14 -0500 Subject: [PATCH 5/6] Change some error messages. --- plugins/command_hooks/lib/command_hooks.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/command_hooks/lib/command_hooks.rb b/plugins/command_hooks/lib/command_hooks.rb index 637fb12e4..d940a8117 100755 --- a/plugins/command_hooks/lib/command_hooks.rb +++ b/plugins/command_hooks/lib/command_hooks.rb @@ -47,7 +47,9 @@ def setup ) unless config_exists - raise CeedlingException.new("Missing configuration :command_hooks") + name = @ceedling[:reportinator].generate_config_walk([COMMAND_HOOKS_SYM]) + error = "Missing configuration #{name}" + raise CeedlingException.new(error) end @config = project_config[COMMAND_HOOKS_SYM] @@ -95,14 +97,16 @@ def post_error; run_hook( :post_error # def validate_config(config) unless config.is_a?(Hash) - error = "Expected configuration :command_hooks to be a Hash but found #{config.class}" + name = @ceedling[:reportinator].generate_config_walk([COMMAND_HOOKS_SYM]) + error = "Expected configuration #{name} to be a Hash but found #{config.class}" raise CeedlingException.new(error) end unknown_hooks = config.keys - COMMAND_HOOKS_LIST unknown_hooks.each do |not_a_hook| - error = "Unrecognized hook '#{not_a_hook}'." + name = @ceedling[:reportinator].generate_config_walk([COMMAND_HOOKS_SYM, not_a_hook]) + error = "Unrecognized option: #{name}" @ceedling[:loginator].log(error, Verbosity::ERRORS) end From b1135f37af965fb78cec1993b3fa01d00f4fdba2 Mon Sep 17 00:00:00 2001 From: Alejandro Rosso Date: Sat, 22 Jun 2024 11:02:43 -0500 Subject: [PATCH 6/6] Update project.yml samples. --- assets/project_as_gem.yml | 44 +++++++++++++++++--------------- assets/project_with_guts.yml | 44 +++++++++++++++++--------------- examples/temp_sensor/project.yml | 44 +++++++++++++++++--------------- 3 files changed, 69 insertions(+), 63 deletions(-) diff --git a/assets/project_as_gem.yml b/assets/project_as_gem.yml index 891d9462b..1633f4529 100644 --- a/assets/project_as_gem.yml +++ b/assets/project_as_gem.yml @@ -307,6 +307,29 @@ # :build_root: ./subprojectA/build # :defines: [] +# :command_hooks: +# :pre_mock_preprocess: +# :post_mock_preprocess: +# :pre_test_preprocess: +# :post_test_preprocess: +# :pre_mock_generate: +# :post_mock_generate: +# :pre_runner_generate: +# :post_runner_generate: +# :pre_compile_execute: +# :post_compile_execute: +# :pre_link_execute: +# :post_link_execute: +# :pre_test_fixture_execute: +# :post_test_fixture_execute: +# :pre_test: +# :post_test: +# :pre_release: +# :post_release: +# :pre_build: +# :post_build: +# :post_error: + ################################################################ # TOOLCHAIN CONFIGURATION ################################################################ @@ -376,25 +399,4 @@ # :arguments: [] # :name: # :optional: FALSE -# #These tools can be filled out when command_hooks plugin is enabled -# :pre_mock_preprocess -# :post_mock_preprocess -# :pre_mock_generate -# :post_mock_generate -# :pre_runner_preprocess -# :post_runner_preprocess -# :pre_runner_generate -# :post_runner_generate -# :pre_compile_execute -# :post_compile_execute -# :pre_link_execute -# :post_link_execute -# :pre_test_fixture_execute -# :pre_test -# :post_test -# :pre_release -# :post_release -# :pre_build -# :post_build -# :post_error ... diff --git a/assets/project_with_guts.yml b/assets/project_with_guts.yml index 5f051ffc2..8b65202ea 100644 --- a/assets/project_with_guts.yml +++ b/assets/project_with_guts.yml @@ -307,6 +307,29 @@ # :build_root: ./subprojectA/build # :defines: [] +# :command_hooks: +# :pre_mock_preprocess: +# :post_mock_preprocess: +# :pre_test_preprocess: +# :post_test_preprocess: +# :pre_mock_generate: +# :post_mock_generate: +# :pre_runner_generate: +# :post_runner_generate: +# :pre_compile_execute: +# :post_compile_execute: +# :pre_link_execute: +# :post_link_execute: +# :pre_test_fixture_execute: +# :post_test_fixture_execute: +# :pre_test: +# :post_test: +# :pre_release: +# :post_release: +# :pre_build: +# :post_build: +# :post_error: + ################################################################ # TOOLCHAIN CONFIGURATION ################################################################ @@ -377,25 +400,4 @@ # :arguments: [] # :name: # :optional: FALSE -# #These tools can be filled out when command_hooks plugin is enabled -# :pre_mock_preprocess -# :post_mock_preprocess -# :pre_mock_generate -# :post_mock_generate -# :pre_runner_preprocess -# :post_runner_preprocess -# :pre_runner_generate -# :post_runner_generate -# :pre_compile_execute -# :post_compile_execute -# :pre_link_execute -# :post_link_execute -# :pre_test_fixture_execute -# :pre_test -# :post_test -# :pre_release -# :post_release -# :pre_build -# :post_build -# :post_error ... diff --git a/examples/temp_sensor/project.yml b/examples/temp_sensor/project.yml index 8854affbf..25138210d 100644 --- a/examples/temp_sensor/project.yml +++ b/examples/temp_sensor/project.yml @@ -254,6 +254,29 @@ # :build_root: ./subprojectA/build # :defines: [] +# :command_hooks: +# :pre_mock_preprocess: +# :post_mock_preprocess: +# :pre_test_preprocess: +# :post_test_preprocess: +# :pre_mock_generate: +# :post_mock_generate: +# :pre_runner_generate: +# :post_runner_generate: +# :pre_compile_execute: +# :post_compile_execute: +# :pre_link_execute: +# :post_link_execute: +# :pre_test_fixture_execute: +# :post_test_fixture_execute: +# :pre_test: +# :post_test: +# :pre_release: +# :post_release: +# :pre_build: +# :post_build: +# :post_error: + ################################################################ # TOOLCHAIN CONFIGURATION ################################################################ @@ -324,25 +347,4 @@ # :arguments: [] # :name: # :optional: FALSE -# #These tools can be filled out when command_hooks plugin is enabled -# :pre_mock_preprocess -# :post_mock_preprocess -# :pre_mock_generate -# :post_mock_generate -# :pre_runner_preprocess -# :post_runner_preprocess -# :pre_runner_generate -# :post_runner_generate -# :pre_compile_execute -# :post_compile_execute -# :pre_link_execute -# :post_link_execute -# :pre_test_fixture_execute -# :pre_test -# :post_test -# :pre_release -# :post_release -# :pre_build -# :post_build -# :post_error ...