From 995d01f2ad62dd40bb6b4d9eb75de7010fc8a55b Mon Sep 17 00:00:00 2001 From: Bharghavi-Ande-Baby Date: Thu, 25 Sep 2025 16:01:04 +0530 Subject: [PATCH 1/2] Wildcard matching issue fixed. --- src/makei/rules_mk.py | 2 +- tests/data/rules_mks/wildcard/AB2001.B.rpgle | 2 + tests/data/rules_mks/wildcard/AB2001_B.rpgle | 2 + .../data/rules_mks/wildcard/wildcard.rules.mk | 26 +++-- tests/unit/test_rules_mk.py | 98 ++++++++++++++----- 5 files changed, 95 insertions(+), 35 deletions(-) create mode 100644 tests/data/rules_mks/wildcard/AB2001.B.rpgle create mode 100644 tests/data/rules_mks/wildcard/AB2001_B.rpgle diff --git a/src/makei/rules_mk.py b/src/makei/rules_mk.py index a5bfadac..cc233f93 100644 --- a/src/makei/rules_mk.py +++ b/src/makei/rules_mk.py @@ -341,7 +341,7 @@ def from_str(cls, rules_mk_str: str, containing_dir: Path, src_dir: Path, includ # Updates variables with wildcard values for wildcard, var in wildcard_variables.items(): stripped_wildcard = wildcard.strip("%.").upper() - matched_targets = list(filter(lambda target: target.split(".")[1] == stripped_wildcard, targets)) + matched_targets = [target for target in targets if target.endswith(f".{stripped_wildcard}")] targets = list(filter(lambda target: target.split(".")[1] != stripped_wildcard, targets)) for target in matched_targets: diff --git a/tests/data/rules_mks/wildcard/AB2001.B.rpgle b/tests/data/rules_mks/wildcard/AB2001.B.rpgle new file mode 100644 index 00000000..40960f3a --- /dev/null +++ b/tests/data/rules_mks/wildcard/AB2001.B.rpgle @@ -0,0 +1,2 @@ +**free +return; \ No newline at end of file diff --git a/tests/data/rules_mks/wildcard/AB2001_B.rpgle b/tests/data/rules_mks/wildcard/AB2001_B.rpgle new file mode 100644 index 00000000..40960f3a --- /dev/null +++ b/tests/data/rules_mks/wildcard/AB2001_B.rpgle @@ -0,0 +1,2 @@ +**free +return; \ No newline at end of file diff --git a/tests/data/rules_mks/wildcard/wildcard.rules.mk b/tests/data/rules_mks/wildcard/wildcard.rules.mk index e31deaa4..63ef7b13 100644 --- a/tests/data/rules_mks/wildcard/wildcard.rules.mk +++ b/tests/data/rules_mks/wildcard/wildcard.rules.mk @@ -1,24 +1,32 @@ TGTVER := *PRV +TGTRLS := *PRV # need to support when no blanks delimiting the equals -CURRENT:=V7R5 +CURRENT :=V7R5 HEADER := some -COMMIT = *NONE -VERSION=V7R3 +COMMIT :=*NONE +VERSION :=V7R3 # test base wildcard with variables %.MODULE: %.rpgle $(HEADER).rpgleinc # test case sensitivity and overriding -Foo.MODULE: TGTVER=$(CURRENT) # test overriding different vars %.MODULE: TEXT := hardcoded for all mod -foo.MODule: private TEXT := foo is better -foo.MODULE: TGTVER := V7R2 -# test regular equals in vars -bar.MODULE: COMMIT = $(COMMIT) -bar.MODULE: TGTVER:=$(VERSION) + +AB2001_B.MODULE: AB2001_B.rpgle +AB2001_B.MODULE: TGTRLS := $(TGTRLS) + +AB2001.B.MODULE: AB2001.B.rpgle +AB2001.B.MODULE: TGTRLS := $(TGTRLS) + +bar.MODULE: COMMIT :=$(COMMIT) +bar.MODULE: TGTVER :=$(VERSION) # test support of multi line dependencies bar.MODULE: bar.rpgle \ bar.TABLE +Foo.MODULE: TGTVER :=$(CURRENT) +# test overriding different vars +foo.MODule: private TEXT := foo is better +foo.MODULE: TGTVER := V7R2 # test if this very \ cool multiline comment \ is ignored \ No newline at end of file diff --git a/tests/unit/test_rules_mk.py b/tests/unit/test_rules_mk.py index 2bcfcbe6..ed79065b 100644 --- a/tests/unit/test_rules_mk.py +++ b/tests/unit/test_rules_mk.py @@ -25,55 +25,103 @@ def test_wildcard_recipes_variables(): # Test loading from a valid file test_dir = data_dir / "wildcard" rules_mk = RulesMk.from_file(test_dir / "wildcard.rules.mk", test_dir) - expected_targets = {'TRGs': [], 'DTAARAs': [], 'DTAQs': [], 'SQLs': [], 'BNDDs': [], - 'PFs': [], 'LFs': [], 'DSPFs': [], 'PRTFs': [], 'CMDs': [], - 'MODULEs': ['BAR.MODULE', 'FOO.MODULE'], 'SRVPGMs': [], 'PGMs': [], - 'MENUs': [], 'PNLGRPs': [], 'QMQRYs': [], 'WSCSTs': [], 'MSGs': []} + + expected_targets = { + 'TRGs': [], 'DTAARAs': [], 'DTAQs': [], 'SQLs': [], 'BNDDs': [], + 'PFs': [], 'LFs': [], 'DSPFs': [], 'PRTFs': [], 'CMDs': [], + 'MODULEs': ['AB2001_B.MODULE', 'AB2001.B.MODULE','BAR.MODULE','FOO.MODULE'], 'SRVPGMs': [], 'PGMs': [], + 'MENUs': [], 'PNLGRPs': [], 'QMQRYs': [], 'WSCSTs': [], 'MSGs': [] + } + assert rules_mk.containing_dir == test_dir assert rules_mk.subdirs == [] assert rules_mk.targets == expected_targets - assert rules_mk.rules[0].variables == ['TEXT := hardcoded for all mod', 'COMMIT=*NONE', 'TGTVER:=V7R3'] + # AB2001_B.MODULE checks + assert rules_mk.rules[0].variables == ['TEXT := hardcoded for all mod', 'TGTRLS :=*PRV'] assert rules_mk.rules[0].commands == [] - assert rules_mk.rules[0].dependencies == ['bar.TABLE'] + assert rules_mk.rules[0].dependencies == [] assert rules_mk.rules[0].include_dirs == [] - assert rules_mk.rules[0].target == 'BAR.MODULE' - assert rules_mk.rules[0].source_file == '$(d)/bar.rpgle' - assert str(rules_mk.rules[0]) == '''BAR.MODULE_SRC=$(d)/bar.rpgle + assert rules_mk.rules[0].target == 'AB2001_B.MODULE' + assert rules_mk.rules[0].source_file == '$(d)/AB2001_B.rpgle' + assert str(rules_mk.rules[0]) == '''AB2001_B.MODULE_SRC=$(d)/AB2001_B.rpgle +AB2001_B.MODULE_DEP= +AB2001_B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE +AB2001_B.MODULE: TEXT := hardcoded for all mod +AB2001_B.MODULE: TGTRLS :=*PRV +''' + + # AB2001.B.MODULE checks + assert rules_mk.rules[1].variables == ['TEXT := hardcoded for all mod', 'TGTRLS :=*PRV'] + assert rules_mk.rules[1].commands == [] + assert rules_mk.rules[1].dependencies == [] + assert rules_mk.rules[1].include_dirs == [] + assert rules_mk.rules[1].target == 'AB2001.B.MODULE' + assert rules_mk.rules[1].source_file == '$(d)/AB2001.B.rpgle' + assert str(rules_mk.rules[1]) == '''AB2001.B.MODULE_SRC=$(d)/AB2001.B.rpgle +AB2001.B.MODULE_DEP= +AB2001.B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE +AB2001.B.MODULE: TEXT := hardcoded for all mod +AB2001.B.MODULE: TGTRLS :=*PRV +''' + # BAR.MODULE uses wildcard vars + target-specific vars + assert rules_mk.rules[2].variables == ['TEXT := hardcoded for all mod', 'COMMIT :=*NONE', 'TGTVER :=V7R3'] + assert rules_mk.rules[2].commands == [] + assert rules_mk.rules[2].dependencies == ['bar.TABLE'] + assert rules_mk.rules[2].include_dirs == [] + assert rules_mk.rules[2].target == 'BAR.MODULE' + assert rules_mk.rules[2].source_file == '$(d)/bar.rpgle' + assert str(rules_mk.rules[2]) == '''BAR.MODULE_SRC=$(d)/bar.rpgle BAR.MODULE_DEP=bar.TABLE BAR.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE BAR.MODULE: TEXT := hardcoded for all mod -BAR.MODULE: COMMIT=*NONE -BAR.MODULE: TGTVER:=V7R3 +BAR.MODULE: COMMIT :=*NONE +BAR.MODULE: TGTVER :=V7R3 ''' - assert rules_mk.rules[1].variables == ['TEXT := hardcoded for all mod', 'TGTVER=V7R5', - 'private TEXT := foo is better', 'TGTVER := V7R2'] - assert rules_mk.rules[1].commands == [] - assert rules_mk.rules[1].dependencies == ['$(HEADER).rpgleinc'] - assert rules_mk.rules[1].include_dirs == [] - assert rules_mk.rules[1].target == 'FOO.MODULE' - assert rules_mk.rules[1].source_file == '$(d)/foo.rpgle' - assert str(rules_mk.rules[1]) == '''FOO.MODULE_SRC=$(d)/foo.rpgle + assert rules_mk.rules[3].variables == [ + 'TEXT := hardcoded for all mod', + 'TGTVER :=V7R5', + 'private TEXT := foo is better', + 'TGTVER := V7R2' + ] + assert rules_mk.rules[3].commands == [] + assert rules_mk.rules[3].dependencies == ['$(HEADER).rpgleinc'] + assert rules_mk.rules[3].include_dirs == [] + assert rules_mk.rules[3].target == 'FOO.MODULE' + assert rules_mk.rules[3].source_file == '$(d)/foo.rpgle' + assert str(rules_mk.rules[3]) == '''FOO.MODULE_SRC=$(d)/foo.rpgle FOO.MODULE_DEP=$(HEADER).rpgleinc FOO.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE FOO.MODULE: TEXT := hardcoded for all mod -FOO.MODULE: TGTVER=V7R5 +FOO.MODULE: TGTVER :=V7R5 FOO.MODULE: private TEXT := foo is better -FOO.MODULE: TGTVER := V7R2\n''' +FOO.MODULE: TGTVER := V7R2 +''' - assert str(rules_mk) == '''MODULEs := BAR.MODULE FOO.MODULE\n\n + # Final full string check for rules_mk + assert str(rules_mk) == '''MODULEs := AB2001_B.MODULE AB2001.B.MODULE BAR.MODULE FOO.MODULE\n\n +AB2001_B.MODULE_SRC=$(d)/AB2001_B.rpgle +AB2001_B.MODULE_DEP= +AB2001_B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE +AB2001_B.MODULE: TEXT := hardcoded for all mod +AB2001_B.MODULE: TGTRLS :=*PRV +AB2001.B.MODULE_SRC=$(d)/AB2001.B.rpgle +AB2001.B.MODULE_DEP= +AB2001.B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE +AB2001.B.MODULE: TEXT := hardcoded for all mod +AB2001.B.MODULE: TGTRLS :=*PRV BAR.MODULE_SRC=$(d)/bar.rpgle BAR.MODULE_DEP=bar.TABLE BAR.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE BAR.MODULE: TEXT := hardcoded for all mod -BAR.MODULE: COMMIT=*NONE -BAR.MODULE: TGTVER:=V7R3 +BAR.MODULE: COMMIT :=*NONE +BAR.MODULE: TGTVER :=V7R3 FOO.MODULE_SRC=$(d)/foo.rpgle FOO.MODULE_DEP=$(HEADER).rpgleinc FOO.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE FOO.MODULE: TEXT := hardcoded for all mod -FOO.MODULE: TGTVER=V7R5 +FOO.MODULE: TGTVER :=V7R5 FOO.MODULE: private TEXT := foo is better FOO.MODULE: TGTVER := V7R2 ''' From 6189546fe8d5d62b839f3e6e78c7d0500b3bbe09 Mon Sep 17 00:00:00 2001 From: Irfan Sharif Date: Thu, 2 Oct 2025 16:27:21 -0400 Subject: [PATCH 2/2] Fix tests Signed-off-by: Irfan Sharif --- .../data/rules_mks/wildcard/wildcard.rules.mk | 33 ++++--- tests/unit/test_rules_mk.py | 96 ++++++++----------- 2 files changed, 58 insertions(+), 71 deletions(-) diff --git a/tests/data/rules_mks/wildcard/wildcard.rules.mk b/tests/data/rules_mks/wildcard/wildcard.rules.mk index 63ef7b13..fa2eb5aa 100644 --- a/tests/data/rules_mks/wildcard/wildcard.rules.mk +++ b/tests/data/rules_mks/wildcard/wildcard.rules.mk @@ -1,32 +1,31 @@ TGTVER := *PRV -TGTRLS := *PRV # need to support when no blanks delimiting the equals -CURRENT :=V7R5 +CURRENT:=V7R5 HEADER := some -COMMIT :=*NONE -VERSION :=V7R3 +COMMIT = *NONE +VERSION=V7R3 +TGTRLS := *PRV # test base wildcard with variables %.MODULE: %.rpgle $(HEADER).rpgleinc # test case sensitivity and overriding +Foo.MODULE: TGTVER=$(CURRENT) # test overriding different vars %.MODULE: TEXT := hardcoded for all mod +foo.MODule: private TEXT := foo is better +foo.MODULE: TGTVER := V7R2 +# test regular equals in vars +bar.MODULE: COMMIT = $(COMMIT) +bar.MODULE: TGTVER:=$(VERSION) +# test support of multi line dependencies +bar.MODULE: bar.rpgle \ + bar.TABLE +# test if this very \ +cool multiline comment \ +is ignored AB2001_B.MODULE: AB2001_B.rpgle AB2001_B.MODULE: TGTRLS := $(TGTRLS) AB2001.B.MODULE: AB2001.B.rpgle AB2001.B.MODULE: TGTRLS := $(TGTRLS) - -bar.MODULE: COMMIT :=$(COMMIT) -bar.MODULE: TGTVER :=$(VERSION) -# test support of multi line dependencies -bar.MODULE: bar.rpgle \ - bar.TABLE -Foo.MODULE: TGTVER :=$(CURRENT) -# test overriding different vars -foo.MODule: private TEXT := foo is better -foo.MODULE: TGTVER := V7R2 -# test if this very \ -cool multiline comment \ -is ignored \ No newline at end of file diff --git a/tests/unit/test_rules_mk.py b/tests/unit/test_rules_mk.py index ed79065b..f292a1e4 100644 --- a/tests/unit/test_rules_mk.py +++ b/tests/unit/test_rules_mk.py @@ -25,66 +25,56 @@ def test_wildcard_recipes_variables(): # Test loading from a valid file test_dir = data_dir / "wildcard" rules_mk = RulesMk.from_file(test_dir / "wildcard.rules.mk", test_dir) - - expected_targets = { - 'TRGs': [], 'DTAARAs': [], 'DTAQs': [], 'SQLs': [], 'BNDDs': [], - 'PFs': [], 'LFs': [], 'DSPFs': [], 'PRTFs': [], 'CMDs': [], - 'MODULEs': ['AB2001_B.MODULE', 'AB2001.B.MODULE','BAR.MODULE','FOO.MODULE'], 'SRVPGMs': [], 'PGMs': [], - 'MENUs': [], 'PNLGRPs': [], 'QMQRYs': [], 'WSCSTs': [], 'MSGs': [] - } - + expected_targets = {'TRGs': [], 'DTAARAs': [], 'DTAQs': [], 'SQLs': [], 'BNDDs': [], + 'PFs': [], 'LFs': [], 'DSPFs': [], 'PRTFs': [], 'CMDs': [], + 'MODULEs': ['BAR.MODULE', 'AB2001_B.MODULE', 'AB2001.B.MODULE', 'FOO.MODULE'], 'SRVPGMs': [], 'PGMs': [], + 'MENUs': [], 'PNLGRPs': [], 'QMQRYs': [], 'WSCSTs': [], 'MSGs': []} assert rules_mk.containing_dir == test_dir assert rules_mk.subdirs == [] assert rules_mk.targets == expected_targets - # AB2001_B.MODULE checks - assert rules_mk.rules[0].variables == ['TEXT := hardcoded for all mod', 'TGTRLS :=*PRV'] + assert rules_mk.rules[0].variables == ['TEXT := hardcoded for all mod', 'COMMIT=*NONE', 'TGTVER:=V7R3'] assert rules_mk.rules[0].commands == [] - assert rules_mk.rules[0].dependencies == [] + assert rules_mk.rules[0].dependencies == ['bar.TABLE'] assert rules_mk.rules[0].include_dirs == [] - assert rules_mk.rules[0].target == 'AB2001_B.MODULE' - assert rules_mk.rules[0].source_file == '$(d)/AB2001_B.rpgle' - assert str(rules_mk.rules[0]) == '''AB2001_B.MODULE_SRC=$(d)/AB2001_B.rpgle + assert rules_mk.rules[0].target == 'BAR.MODULE' + assert rules_mk.rules[0].source_file == '$(d)/bar.rpgle' + assert str(rules_mk.rules[0]) == '''BAR.MODULE_SRC=$(d)/bar.rpgle +BAR.MODULE_DEP=bar.TABLE +BAR.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE +BAR.MODULE: TEXT := hardcoded for all mod +BAR.MODULE: COMMIT=*NONE +BAR.MODULE: TGTVER:=V7R3 +''' + + assert rules_mk.rules[1].variables == ['TEXT := hardcoded for all mod' , 'TGTRLS :=*PRV'] + assert rules_mk.rules[1].commands == [] + assert rules_mk.rules[1].dependencies == [] + assert rules_mk.rules[1].include_dirs == [] + assert rules_mk.rules[1].target == 'AB2001_B.MODULE' + assert rules_mk.rules[1].source_file == '$(d)/AB2001_B.rpgle' + assert str(rules_mk.rules[1]) == '''AB2001_B.MODULE_SRC=$(d)/AB2001_B.rpgle AB2001_B.MODULE_DEP= AB2001_B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE AB2001_B.MODULE: TEXT := hardcoded for all mod AB2001_B.MODULE: TGTRLS :=*PRV ''' - # AB2001.B.MODULE checks - assert rules_mk.rules[1].variables == ['TEXT := hardcoded for all mod', 'TGTRLS :=*PRV'] - assert rules_mk.rules[1].commands == [] - assert rules_mk.rules[1].dependencies == [] - assert rules_mk.rules[1].include_dirs == [] - assert rules_mk.rules[1].target == 'AB2001.B.MODULE' - assert rules_mk.rules[1].source_file == '$(d)/AB2001.B.rpgle' - assert str(rules_mk.rules[1]) == '''AB2001.B.MODULE_SRC=$(d)/AB2001.B.rpgle + assert rules_mk.rules[2].variables == ['TEXT := hardcoded for all mod' , 'TGTRLS :=*PRV'] + assert rules_mk.rules[2].commands == [] + assert rules_mk.rules[2].dependencies == [] + assert rules_mk.rules[2].include_dirs == [] + assert rules_mk.rules[2].target == 'AB2001.B.MODULE' + assert rules_mk.rules[2].source_file == '$(d)/AB2001.B.rpgle' + assert str(rules_mk.rules[2]) == '''AB2001.B.MODULE_SRC=$(d)/AB2001.B.rpgle AB2001.B.MODULE_DEP= AB2001.B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE AB2001.B.MODULE: TEXT := hardcoded for all mod AB2001.B.MODULE: TGTRLS :=*PRV -''' - # BAR.MODULE uses wildcard vars + target-specific vars - assert rules_mk.rules[2].variables == ['TEXT := hardcoded for all mod', 'COMMIT :=*NONE', 'TGTVER :=V7R3'] - assert rules_mk.rules[2].commands == [] - assert rules_mk.rules[2].dependencies == ['bar.TABLE'] - assert rules_mk.rules[2].include_dirs == [] - assert rules_mk.rules[2].target == 'BAR.MODULE' - assert rules_mk.rules[2].source_file == '$(d)/bar.rpgle' - assert str(rules_mk.rules[2]) == '''BAR.MODULE_SRC=$(d)/bar.rpgle -BAR.MODULE_DEP=bar.TABLE -BAR.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE -BAR.MODULE: TEXT := hardcoded for all mod -BAR.MODULE: COMMIT :=*NONE -BAR.MODULE: TGTVER :=V7R3 ''' - assert rules_mk.rules[3].variables == [ - 'TEXT := hardcoded for all mod', - 'TGTVER :=V7R5', - 'private TEXT := foo is better', - 'TGTVER := V7R2' - ] + assert rules_mk.rules[3].variables == ['TEXT := hardcoded for all mod', 'TGTVER=V7R5', + 'private TEXT := foo is better', 'TGTVER := V7R2'] assert rules_mk.rules[3].commands == [] assert rules_mk.rules[3].dependencies == ['$(HEADER).rpgleinc'] assert rules_mk.rules[3].include_dirs == [] @@ -94,13 +84,17 @@ def test_wildcard_recipes_variables(): FOO.MODULE_DEP=$(HEADER).rpgleinc FOO.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE FOO.MODULE: TEXT := hardcoded for all mod -FOO.MODULE: TGTVER :=V7R5 +FOO.MODULE: TGTVER=V7R5 FOO.MODULE: private TEXT := foo is better -FOO.MODULE: TGTVER := V7R2 -''' +FOO.MODULE: TGTVER := V7R2\n''' - # Final full string check for rules_mk - assert str(rules_mk) == '''MODULEs := AB2001_B.MODULE AB2001.B.MODULE BAR.MODULE FOO.MODULE\n\n + assert str(rules_mk) == '''MODULEs := BAR.MODULE AB2001_B.MODULE AB2001.B.MODULE FOO.MODULE\n\n +BAR.MODULE_SRC=$(d)/bar.rpgle +BAR.MODULE_DEP=bar.TABLE +BAR.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE +BAR.MODULE: TEXT := hardcoded for all mod +BAR.MODULE: COMMIT=*NONE +BAR.MODULE: TGTVER:=V7R3 AB2001_B.MODULE_SRC=$(d)/AB2001_B.rpgle AB2001_B.MODULE_DEP= AB2001_B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE @@ -111,17 +105,11 @@ def test_wildcard_recipes_variables(): AB2001.B.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE AB2001.B.MODULE: TEXT := hardcoded for all mod AB2001.B.MODULE: TGTRLS :=*PRV -BAR.MODULE_SRC=$(d)/bar.rpgle -BAR.MODULE_DEP=bar.TABLE -BAR.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE -BAR.MODULE: TEXT := hardcoded for all mod -BAR.MODULE: COMMIT :=*NONE -BAR.MODULE: TGTVER :=V7R3 FOO.MODULE_SRC=$(d)/foo.rpgle FOO.MODULE_DEP=$(HEADER).rpgleinc FOO.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE FOO.MODULE: TEXT := hardcoded for all mod -FOO.MODULE: TGTVER :=V7R5 +FOO.MODULE: TGTVER=V7R5 FOO.MODULE: private TEXT := foo is better FOO.MODULE: TGTVER := V7R2 '''