diff options
author | Joel Challis <git@zvecr.com> | 2022-01-25 00:50:35 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-25 11:50:35 +1100 |
commit | 7df371750f297480ba5e78559ad3314b2d580888 (patch) | |
tree | 618281768d39f31c4764126f93af1db287e40f68 /Makefile | |
parent | 5f233458869bc5fd2d91b24f59c8519d5f99c9a6 (diff) |
Workaround in Makefile for recursive rule matching (#15988)
* Bodge for recursive rule matching
* Bodge for recursive rule matching - force python3
* Tidy up
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 51 |
1 files changed, 9 insertions, 42 deletions
@@ -87,53 +87,20 @@ endef # a function that returns the value COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND) - -# Recursively try to find a match for the start of the rule to be checked -# $1 The list to be checked -# If a match is found, then RULE_FOUND is set to true -# and MATCHED_ITEM to the item that was matched -define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3 - ifneq ($1,) - ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true) - MATCHED_ITEM := $$(firstword $1) - else - $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1))) - endif - endif -endef - -# A recursive helper function for finding the longest match -# $1 The list to be checked -# It works by always removing the currently matched item from the list -define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2 - # Stop the recursion when the list is empty - ifneq ($1,) - RULE_BEFORE := $$(RULE) - $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1)) - # If a match is found in the current list, otherwise just return what we had before - ifeq ($$(RULE_FOUND),true) - # Save the best match so far and call itself recursively - BEST_MATCH := $$(MATCHED_ITEM) - BEST_MATCH_RULE := $$(RULE) - RULE_FOUND := false - RULE := $$(RULE_BEFORE) - $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$$(filter-out $$(MATCHED_ITEM),$1))) - endif - endif -endef - - -# Recursively try to find the longest match for the start of the rule to be checked +# Try to find a match for the start of the rule to be checked # $1 The list to be checked # If a match is found, then RULE_FOUND is set to true # and MATCHED_ITEM to the item that was matched define TRY_TO_MATCH_RULE_FROM_LIST_HELPER - BEST_MATCH := - $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$1)) - ifneq ($$(BEST_MATCH),) + # Split on ":", padding with empty strings to avoid indexing issues + TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE)) + TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE)) + + FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1)) + ifneq ($$(FOUNDx),) + RULE := $$(TOKENr) RULE_FOUND := true - RULE := $$(BEST_MATCH_RULE) - MATCHED_ITEM := $$(BEST_MATCH) + MATCHED_ITEM := $$(TOKEN1) else RULE_FOUND := false MATCHED_ITEM := |