From 7df371750f297480ba5e78559ad3314b2d580888 Mon Sep 17 00:00:00 2001
From: Joel Challis <git@zvecr.com>
Date: Tue, 25 Jan 2022 00:50:35 +0000
Subject: Workaround in Makefile for recursive rule matching (#15988)

* Bodge for recursive rule matching

* Bodge for recursive rule matching - force python3

* Tidy up
---
 Makefile | 51 +++++++++------------------------------------------
 1 file changed, 9 insertions(+), 42 deletions(-)

(limited to 'Makefile')

diff --git a/Makefile b/Makefile
index b435837d30..22c79880a3 100644
--- a/Makefile
+++ b/Makefile
@@ -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 :=
-- 
cgit v1.2.3