From 8feb75af0b786d8a7fa3e9200415d343ecccd975 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Tue, 15 Sep 2015 18:00:21 +0200 Subject: [PATCH] 8136383: Improve make utilities containing and not-containing Reviewed-by: ihse --- make/common/MakeBase.gmk | 18 ++++++++++++------ test/make/TestMakeBase.gmk | 31 +++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/make/common/MakeBase.gmk b/make/common/MakeBase.gmk index bd8c03e2b0f..ea975f0e4fd 100644 --- a/make/common/MakeBase.gmk +++ b/make/common/MakeBase.gmk @@ -567,16 +567,22 @@ else 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, \ diff --git a/test/make/TestMakeBase.gmk b/test/make/TestMakeBase.gmk index 98a8e7ba07c..443f364841b 100644 --- a/test/make/TestMakeBase.gmk +++ b/test/make/TestMakeBase.gmk @@ -72,6 +72,37 @@ $(ESCAPE_DOLLAR_DIR)/_escape_dollar: $(DEPS) 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