Re: [PATCH] Makefile: abort on shells that do not support ${parameter%word} expansion
- From
- Brandon Casey <brandon.casey.ctr@nrlssc.navy.mil>
- Date
- Sep 6, 2011, 19:32 UTC
- Message-ID
- <2i2CfjMHrXZ7dV7ciebqx3PjO-cpw8QIplKjdcx_bGmGt8jgFr3efDXeMJMcn_I9ZH6X71aBdaO7vGiRBQuhbukGEWFJZQuvWtq079u0KYQ@cipher.nrlssc.navy.mil>
- In-Reply-To
- <rPnr5AVZRRnklxb_Yaj0gopXRTVCT-tq7iVG-1NoXjOrHWsyuLop-co4qtQjezJ98BaKc0R71r8fMcBOijq9oCOgfBF6ticVk17DwDQzV91bcC719fGSUPDsf40AuoRfgjURcxREkMk@cipher.nrlssc.navy.mil>
FYI: It should be possible to test this patch on a modern system by doing something like:
make SHELL_PATH=/bin/false
and you should see something like this:
make: *** [please_set_SHELL_PATH_to_a_more_modern_shell] Error 1
But beware, GNU make 3.81 seems to have a bug which sends it into an infinite loop.
make 3.80 produces the desired results, as does 3.77 which I have installed on an old machine. GNU make 3.82 seems to be the latest but I don't have access to it. If anyone does, I'd appreciate if you could test.
-Brandon
On 09/06/2011 02:09 PM, Brandon Casey wrote:
Show 50 quoted lines
> From: Brandon Casey <drafnel@gmail.com>
>
> Add an entry to the please_set_SHELL_PATH_to_a_more_modern_shell target
> which tests whether the shell supports ${parameter%word} expansion. I
> assume this one test is enough to indicate whether the shell supports the
> entire family of prefix and suffix removal syntax:
>
> ${parameter%word}
> ${parameter%%word}
> ${parameter#word}
> ${parameter##word}
>
> FreeBSD, for one, has a /bin/sh that, apparently, supports $() notation but
> not the above prefix/suffix removal notation.
> ---
>
> On 09/05/2011 02:09 AM, Junio C Hamano wrote:
>> Naohiro Aota <naota@elisp.net> writes:
>>
>>> Variable expansions like "${foo#bar}" or "${foo%bar}" doesn't work on
>>> shells like FreeBSD sh and they made the test to fail.
>>
>> Sorry, I do appreciate the effort, but a patch like this takes us in the
>> wrong direction.
>>
>> While we do not allow blatant bashisms like ${parameter:offset:length}
>> (substring expansion), ${parameter/pattern/string} (pattern substitution),
>> "local" variables, "function" noiseword, and shell arrays in our shell
>> scripts, the two kinds of substitution you quoted above are purely POSIX,
>> and our coding guideline does allow them to be used in the scripts.
>
> Perhaps we should add a test for this shell feature.
>
> -Brandon
>
> Makefile | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 8d6d451..46d9c5d 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1738,6 +1738,7 @@ endif
>
> please_set_SHELL_PATH_to_a_more_modern_shell:
> @$$(:)
> + @foo=bar_suffix && test bar = "$${foo%_*}"
>
> shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell
>