~ruther/qmk_firmware

7df371750f297480ba5e78559ad3314b2d580888 — Joel Challis 3 years ago 5f23345
Workaround in Makefile for recursive rule matching (#15988)

* Bodge for recursive rule matching

* Bodge for recursive rule matching - force python3

* Tidy up
1 files changed, 9 insertions(+), 42 deletions(-)

M Makefile
M Makefile => Makefile +9 -42
@@ 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 :=