From 00272131c13c4bb754f2c15a507202dd918ba26c Mon Sep 17 00:00:00 2001 From: Maxwell Kang Date: Sat, 16 Sep 2023 14:40:44 -0700 Subject: [PATCH] Enable msbuild batching for custom rules add `rule.inputs` and `rule.outputs` pathVars add test cases add documentation --- modules/codelite/_preload.lua | 5 ++ modules/gmake2/_preload.lua | 7 ++- .../vstudio/tests/vc2010/test_rule_props.lua | 17 ++++++ .../tests/vc2010/test_rule_targets.lua | 53 +++++++++++++++++++ modules/vstudio/vs2010.lua | 2 + modules/vstudio/vs2010_rules_targets.lua | 8 +-- modules/vstudio/vs2010_rules_xml.lua | 3 +- website/docs/Custom-Rules.md | 11 ++++ 8 files changed, 100 insertions(+), 6 deletions(-) diff --git a/modules/codelite/_preload.lua b/modules/codelite/_preload.lua index 902d085621..32e39a3e9b 100644 --- a/modules/codelite/_preload.lua +++ b/modules/codelite/_preload.lua @@ -46,6 +46,11 @@ onCleanTarget = function(prj) p.modules.codelite.cleanTarget(prj) end, + + pathVars = { + ["rule.inputs"] = { absolute = false, token = "$<" }, + ["rule.outputs"] = { absolute = false, token = "$@" } + } } diff --git a/modules/gmake2/_preload.lua b/modules/gmake2/_preload.lua index b92151f66e..75b06566ed 100644 --- a/modules/gmake2/_preload.lua +++ b/modules/gmake2/_preload.lua @@ -62,7 +62,12 @@ onCleanProject = function(prj) p.clean.file(prj, p.modules.gmake2.getmakefilename(prj, true)) - end + end, + + pathVars = { + ["rule.inputs"] = { absolute = false, token = "$<" }, + ["rule.outputs"] = { absolute = false, token = "$@" } + } } -- diff --git a/modules/vstudio/tests/vc2010/test_rule_props.lua b/modules/vstudio/tests/vc2010/test_rule_props.lua index 8b61eec2c6..13f58a729b 100644 --- a/modules/vstudio/tests/vc2010/test_rule_props.lua +++ b/modules/vstudio/tests/vc2010/test_rule_props.lua @@ -38,6 +38,10 @@ '%{output_path}%{file.basename}.example.cc', '%{output_path}%{file.basename}.example.h' } + builddependencies { + 'dependency_1.lib', + 'dependency_2.lib', + } end @@ -68,3 +72,16 @@ ]] end + +-- +-- additionalDependencies +-- + + function suite.additionalDependencies() + local r = test.getRule("example") + m.additionalDependencies(r) + + test.capture [[ +dependency_1.lib;dependency_2.lib + ]] + end diff --git a/modules/vstudio/tests/vc2010/test_rule_targets.lua b/modules/vstudio/tests/vc2010/test_rule_targets.lua index 21bda828ef..f5bb784dbb 100644 --- a/modules/vstudio/tests/vc2010/test_rule_targets.lua +++ b/modules/vstudio/tests/vc2010/test_rule_targets.lua @@ -95,3 +95,56 @@ ]] end + + + +-- +-- ruleTask +-- + + function suite.ruleTask() + local r = test.getRule("example") + m.rule(r) + + test.capture [[ + + ]] + end + + + +-- +-- targetInputs +-- + + function suite.targetInputs() + local r = test.getRule("example") + m.targetInputs(r) + + test.capture [[ +Inputs="@(example);%(example.AdditionalDependencies);$(MSBuildProjectFile)" + ]] + end + + + +-- +-- targetOutputs +-- + + function suite.targetOutputs() + local r = test.getRule("example") + m.targetOutputs(r) + + test.capture [[ +Outputs="@(example->'%(Outputs)')" + ]] + end diff --git a/modules/vstudio/vs2010.lua b/modules/vstudio/vs2010.lua index ed4fcfe7c9..e87b029434 100644 --- a/modules/vstudio/vs2010.lua +++ b/modules/vstudio/vs2010.lua @@ -36,6 +36,8 @@ ["file.reldirectory"] = { absolute = false, token = "%(RelativeDir)" }, ["file.extension"] = { absolute = false, token = "%(Extension)" }, ["file.name"] = { absolute = false, token = "%(Filename)%(Extension)" }, + ["rule.inputs"] = { absolute = false, token = "[Inputs]" }, + ["rule.outputs"] = { absolute = false, token = "[Outputs]" }, } diff --git a/modules/vstudio/vs2010_rules_targets.lua b/modules/vstudio/vs2010_rules_targets.lua index 6079bd5cfb..363f3f6a7d 100644 --- a/modules/vstudio/vs2010_rules_targets.lua +++ b/modules/vstudio/vs2010_rules_targets.lua @@ -294,7 +294,9 @@ function m.inputs(r) - p.w('Inputs="%%(%s.Identity)"', r.name) + -- inputs and outputs passed to task + p.w('Inputs="@(%s)"', r.name) + p.w('Outputs="@(%s->\'%%(Outputs)\')"', r.name) end @@ -410,7 +412,7 @@ end end extra = table.concat(extra) - p.w('Inputs="%%(%s.Identity);%%(%s.AdditionalDependencies);%s$(MSBuildProjectFile)"', r.name, r.name, extra) + p.w('Inputs="@(%s);%%(%s.AdditionalDependencies);%s$(MSBuildProjectFile)"', r.name, r.name, extra) end @@ -422,7 +424,7 @@ function m.targetOutputs(r) - p.w('Outputs="%%(%s.Outputs)"', r.name) + p.w('Outputs="@(%s->\'%%(Outputs)\')"', r.name) end diff --git a/modules/vstudio/vs2010_rules_xml.lua b/modules/vstudio/vs2010_rules_xml.lua index 491d7710c7..228d85d454 100644 --- a/modules/vstudio/vs2010_rules_xml.lua +++ b/modules/vstudio/vs2010_rules_xml.lua @@ -406,8 +406,7 @@ p.push('') + p.w('IncludeInCommandLine="true" />') p.pop() end diff --git a/website/docs/Custom-Rules.md b/website/docs/Custom-Rules.md index 371ae225d4..3119092f41 100644 --- a/website/docs/Custom-Rules.md +++ b/website/docs/Custom-Rules.md @@ -72,3 +72,14 @@ project "MyProject" StripDebugInfo = true } ``` + +## Rule Batching + +With msbuild, custom rules can be batched if same properties are used. To enable this, use `rule.inputs` or `rule.outputs` tokens in `buildcommands`. If corresponding output is up-to-date to the input, then the input will be omitted. + +```lua +rule "BatchRule" + fileextension ".xyz" + buildcommands 'MyProcessor.exe %{rule.inputs}' +``` +