help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: how to achieve conversion to uppercase


From: Tim Murphy
Subject: Re: how to achieve conversion to uppercase
Date: Tue, 10 Sep 2013 17:32:17 +0100

Running shell causes very poor parse performance. Not a problem in
small builds but when you get to bigger ones you'll regret using it.
It's worse on windows/cygwin of course.

Nowadays you could write a plugin function (make 4.0 and above).

If that's not suitable then are other ways to do it that also aren't
brilliant but slightly faster than invoking a shell.


# A macro for converting a string to uppercase
uppercase_TABLE:=a,A b,B c,C d,D e,E f,F g,G h,H i,I j,J k,K l,L m,M
n,N o,O p,P q,Q r,R s,S t,T u,U v,V w,W x,X y,Y z,Z

define uppercase_internal
$(if $1,$$(subst $(firstword $1),$(call uppercase_internal,$(wordlist
2,$(words $1),$1),$2)),$2)
endef

define uppercase
$(eval uppercase_RESULT:=$(call
uppercase_internal,$(uppercase_TABLE),$1))$(uppercase_RESULT)
endef

from:

https://bitbucket.org/tnmurphy/raptor/src/fbb2e624d320e5eabc0689105e2f2b80d131ca03/lib/flm/flmtools.mk?at=default

Regards,

Tim

On 10 September 2013 13:09, Paul Smith <address@hidden> wrote:
> On Tue, 2013-09-10 at 10:09 +0100, Matej Kosik wrote:
>> I am trying to figure out how to convert words to upper case.
>>
>> Make itself does not seem to have dedicated function for this
>> particular task, unless I am mistaken, so I guess I had to rely on
>> bash.
>
>> In bash, something like this:
>>   var=foo; echo ${var^}
>> works fine. I get:
>>   Foo
>>
>> However, if I try to embed this command with my makefile like this:
>>   $(shell var=foo; echo $${var^})
>> then I get:
>>   /bin/sh: 1: Bad substitution
>
> That's because make does not invoke bash.  Make invokes /bin/sh, which
> is a POSIX compliant shell, so it doesn't understand many of the special
> bash extensions (note that even if /bin/sh is actually bash, when
> invoked as /bin/sh it disables many of bash's extended features).
>
> It's best not to rely on this anyway, as it's not portable at all.
>
>> I am not sure what exactly that string expands to by make before it is
>> passed to bash so I am not sure which escape characters are missing
>> (if that is the problem).
>
> It is not the problem.  Try this from the command line:
>
>     /bin/sh -c 'var=foo; echo ${var^}'
>
> To write this portably you can use the tr(1) program:
>
>     $(shell echo foo | tr a-z A-Z)
>
> Or if you want to do it with make built-ins you can look at the GMSL:
>
>   http://gmsl.sourceforge.net/
>
>
>
> _______________________________________________
> Help-make mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/help-make



-- 
You could help some brave and decent people to have access to
uncensored news by making a donation at:

http://www.thezimbabwean.co.uk/friends/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]