8136383: Improve make utilities containing and not-containing
authorerikj
Tue, 15 Sep 2015 18:00:21 +0200
changeset 32553 418e3b5ff477
parent 32550 6521875cb63e
child 32561 b80d31bbf0bf
8136383: Improve make utilities containing and not-containing Reviewed-by: ihse
make/common/MakeBase.gmk
test/make/TestMakeBase.gmk
--- a/make/common/MakeBase.gmk	Wed Jul 05 20:49:25 2017 +0200
+++ b/make/common/MakeBase.gmk	Tue Sep 15 18:00:21 2015 +0200
@@ -567,16 +567,22 @@
 endif
 
 ################################################################################
-# Convenience functions for working around make's limitations with $(filter ).
-containing = \
-    $(strip $(foreach v,$(strip $2),$(if $(findstring $(strip $1),$v),$v)))
-not-containing = \
-    $(strip $(foreach v,$(strip $2),$(if $(findstring $(strip $1),$v),,$v)))
-
 # Filter out duplicate sub strings while preserving order. Keeps the first occurance.
 uniq = \
     $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
 
+# Returns all whitespace-separated words in $2 where at least one of the
+# whitespace-separated words in $1 is a substring.
+containing = \
+    $(strip \
+        $(foreach v,$(strip $2),\
+          $(call uniq,$(foreach p,$(strip $1),$(if $(findstring $p,$v),$v)))))
+
+# Returns all whitespace-separated words in $2 where none of the
+# whitespace-separated words in $1 is a substring.
+not-containing = \
+    $(strip $(filter-out $(call containing,$1,$2),$2))
+
 # Return a list of all string elements that are duplicated in $1.
 dups = \
     $(strip $(foreach v, $(sort $1), $(if $(filter-out 1, \
--- a/test/make/TestMakeBase.gmk	Wed Jul 05 20:49:25 2017 +0200
+++ b/test/make/TestMakeBase.gmk	Tue Sep 15 18:00:21 2015 +0200
@@ -73,6 +73,37 @@
 TEST_TARGETS += $(ESCAPE_DOLLAR_DIR)/_escape_dollar
 
 ################################################################################
+# Test containing and not-containing
+
+CONT_LIST := foo bar baz foobar foobaz
+
+# Param 1 - string to look for
+# Param 2 - expected result
+define TestContaining
+  value := $$(call containing, $1, $(CONT_LIST))
+  ifneq ($$(value), $2)
+    $$(info (call containing, $1, $(CONT_LIST)))
+    $$(error result >$$(value)<, expected >$2<)
+  endif
+endef
+
+$(eval $(call TestContaining,bar,bar foobar))
+$(eval $(call TestContaining,foo bar,foo bar foobar foobaz))
+
+# Param 1 - string to look for
+# Param 2 - expected result
+define TestNotContaining
+  value := $$(call not-containing, $1, $(CONT_LIST))
+  ifneq ($$(value), $2)
+    $$(info (call not-containing, $1, $(CONT_LIST)))
+    $$(error result >$$(value)<, expected >$2<)
+  endif
+endef
+
+$(eval $(call TestNotContaining,bar,foo baz foobaz))
+$(eval $(call TestNotContaining,foo bar,baz))
+
+################################################################################
 # Test Equals
 
 EQUALS_VALUE1 := value1$(SPACE)