diff mbox

[RFC,1/3] pkg-utils: introduce a make-based LOWERCASE function

Message ID 1395596582-7062-2-git-send-email-thomas.petazzoni@free-electrons.com
State Accepted
Headers show

Commit Message

Thomas Petazzoni March 23, 2014, 5:43 p.m. UTC
Until now, our UPPERCASE function was implemented purely in make for
performance reasons, but our LOWERCASE function was implemented by
calling "tr", which was reasonable due to the fact that LOWERCASE was
rarely used.

An upcoming change is going to make LOWERCASE used quite a bit more,
so we turn it into a pure make function.

Moreover, we want this LOWERCASE function to turn a "_" into a "-" and
not a ".", so we slightly adjust the existing FROM and TO lists to
make this possible. This doesn't change the behavior of the UPPERCASE
macro because both "-" and "." are converted into "_" by this
function.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 package/pkg-utils.mk | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

Comments

Arnout Vandecappelle March 25, 2014, 9:47 p.m. UTC | #1
On 23/03/14 18:43, Thomas Petazzoni wrote:
> Until now, our UPPERCASE function was implemented purely in make for
> performance reasons, but our LOWERCASE function was implemented by
> calling "tr", which was reasonable due to the fact that LOWERCASE was
> rarely used.
> 
> An upcoming change is going to make LOWERCASE used quite a bit more,
> so we turn it into a pure make function.
> 
> Moreover, we want this LOWERCASE function to turn a "_" into a "-" and
> not a ".", so we slightly adjust the existing FROM and TO lists to
> make this possible. This doesn't change the behavior of the UPPERCASE
> macro because both "-" and "." are converted into "_" by this
> function.
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  package/pkg-utils.mk | 15 +++++++--------
>  1 file changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/package/pkg-utils.mk b/package/pkg-utils.mk
> index 91a1981..8c3e534 100644
> --- a/package/pkg-utils.mk
> +++ b/package/pkg-utils.mk
> @@ -13,7 +13,7 @@
>  # as this macro is used a lot it matters
>  # This works by creating translation character pairs (E.G. a:A b:B)
>  # and then looping though all of them running $(subst from,to,text)
> -[FROM] := a b c d e f g h i j k l m n o p q r s t u v w x y z . -
> +[FROM] := a b c d e f g h i j k l m n o p q r s t u v w x y z - .
>  [TO]   := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ _
>  
>  UPPERCASE = $(strip $(eval __tmp := $1) \
> @@ -23,13 +23,12 @@ UPPERCASE = $(strip $(eval __tmp := $1) \
>  	$(__tmp)))) \
>  	$(__tmp))
>  
> -# LOWERCASE macro -- transforms its arguments to lowercase
> -# The above non-tr implementation is not needed, because LOWERCASE is not
> -# called very often
> -
> -define LOWERCASE
> -$(shell echo $1 | tr '[:upper:]' '[:lower:]')
> -endef
> +LOWERCASE = $(strip $(eval __tmp := $1) \
> +	$(foreach c, $(join $(addsuffix :,$([TO])),$([FROM])), \
> +		$(eval __tmp :=	\
> +		$(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),\
> +	$(__tmp)))) \
> +	$(__tmp))

 I get a further 30-40% speedup with the following definition:


define caseconvert-helper
$(1) = $$(strip \
	$$(eval __tmp := $$(1))\
	$(foreach c, $(2),\
		$$(eval __tmp := $$(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$$(__tmp))))\
	$$(__tmp))
endef

$(eval $(call caseconvert-helper,UPPERCASE,$(join $(addsuffix :,$([FROM])),$([TO]))))
$(eval $(call caseconvert-helper,LOWERCASE,$(join $(addsuffix :,$([TO])),$([FROM]))))


(this avoids re-evaluating the foreach in every call).


 Regards,
 Arnout

>  
>  #
>  # Manipulation of .config files based on the Kconfig
>
diff mbox

Patch

diff --git a/package/pkg-utils.mk b/package/pkg-utils.mk
index 91a1981..8c3e534 100644
--- a/package/pkg-utils.mk
+++ b/package/pkg-utils.mk
@@ -13,7 +13,7 @@ 
 # as this macro is used a lot it matters
 # This works by creating translation character pairs (E.G. a:A b:B)
 # and then looping though all of them running $(subst from,to,text)
-[FROM] := a b c d e f g h i j k l m n o p q r s t u v w x y z . -
+[FROM] := a b c d e f g h i j k l m n o p q r s t u v w x y z - .
 [TO]   := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ _
 
 UPPERCASE = $(strip $(eval __tmp := $1) \
@@ -23,13 +23,12 @@  UPPERCASE = $(strip $(eval __tmp := $1) \
 	$(__tmp)))) \
 	$(__tmp))
 
-# LOWERCASE macro -- transforms its arguments to lowercase
-# The above non-tr implementation is not needed, because LOWERCASE is not
-# called very often
-
-define LOWERCASE
-$(shell echo $1 | tr '[:upper:]' '[:lower:]')
-endef
+LOWERCASE = $(strip $(eval __tmp := $1) \
+	$(foreach c, $(join $(addsuffix :,$([TO])),$([FROM])), \
+		$(eval __tmp :=	\
+		$(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),\
+	$(__tmp)))) \
+	$(__tmp))
 
 #
 # Manipulation of .config files based on the Kconfig