bug-gnulib
[Top][All Lists]
Advanced

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

Re: [libvirt] [PATCH] maint: use $(SED) instead of sed for syntax-check


From: Eric Blake
Subject: Re: [libvirt] [PATCH] maint: use $(SED) instead of sed for syntax-check
Date: Mon, 27 Jan 2014 14:03:41 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0

On 01/27/2014 09:37 AM, Roman Bogorodskiy wrote:
> Some syntax-check rules use GNU sed specific regexps, so allow
> to override which sed would be used to fix 'syntax-check' for
> non GNU-userland systems.
> ---
>  cfg.mk | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)

[Adding bug-gnulib]

Hmm - this is an interesting situation.  I imagine we will probably hit
cases where maint.mk also starts assuming GNU sed, so it becomes a trade
of whether it is easier to rewrite the expressions to portable sed that
works out of the box on BSD, or to rewrite the rules to use $(SED)
uniformly.  And what happens if we use $(SED) but the configure.ac did
not request AC_PROG_SED in configure.ac?  (In gnulib, m4/po.m4 requires
AC_PROG_SED, which means any package using gettext is safe, but we'd
have to hoist the requirement of AC_PROG_SED into gnulib's gl_INIT macro
if we wanted to work even for packages that don't use gettext).

> 
> diff --git a/cfg.mk b/cfg.mk
> index 207dfeb..bd984bd 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -614,7 +614,7 @@ sc_libvirt_unmarked_diagnostics:
>         $(_sc_search_regexp)
>       @{ grep     -nE '\<$(func_re) *\(.*;$$' $$($(VC_LIST_EXCEPT));   \
>          grep -A1 -nE '\<$(func_re) *\(.*,$$' $$($(VC_LIST_EXCEPT)); } \
> -        | sed 's/_("\([^\"]\|\\.\)\+"//;s/[   ]"%s"//'               \
> +        | $(SED) 's/_("\([^\"]\|\\.\)\+"//;s/[        ]"%s"//'               
> \

Is the non-portable sed usage merely the fact that I used \+ here?  If
so, \{1,\} is a more portable way to write the 1-or-more modifier.

>          | grep '[     ]"' &&                                         \
>         { echo '$(ME): found unmarked diagnostic(s)' 1>&2;            \
>           exit 1; } || :
> @@ -639,7 +639,7 @@ sc_prohibit_newline_at_end_of_diagnostic:
>  sc_prohibit_diagnostic_without_format:
>       @{ grep     -nE '\<$(func_re) *\(.*;$$' $$($(VC_LIST_EXCEPT));   \
>          grep -A2 -nE '\<$(func_re) *\(.*,$$' $$($(VC_LIST_EXCEPT)); } \
> -        | sed -rn -e ':l; /[,"]$$/ {N;b l;}'                          \
> +        | $(SED) -rn -e ':l; /[,"]$$/ {N;b l;}'                              
>  \
>               -e '/(xenapiSessionErrorHandler|vah_(error|warning))/d'  \
>               -e '/\<$(func_re) *\([^"]*"([^%"]|"\n[^"]*")*"[,)]/p'    \

POSIX has decided to add support for 'sed -E' in a future version (GNU
sed supports that as an alias for 'sed -r', the alias has been around
for a long time, but was only recently documented as a result of the
POSIX decision):

http://austingroupbugs.net/view.php?id=528

Would using 'sed -En -e ...' fix it for you?  Or should we just rewrite
this in basic rather than extended regex:

-e /\(xenapiSessionErrorHandler\|vah_\(error\|warning\)\)/d'
-e /\<$func_re) *([^"*"\([^%"]\|"\n[^"\*"\)*"[,)]/p'

> @@ -661,7 +661,7 @@ sc_prohibit_useless_translation:
>  # or \n on one side of the split.
>  sc_require_whitespace_in_translation:
>       @grep -n -A1 '"$$' $$($(VC_LIST_EXCEPT))                        \
> -        | sed -ne ':l; /"$$/ {N;b l;}; s/"\n[^"]*"/""/g; s/\\n/ /g'  \
> +        | $(SED) -ne ':l; /"$$/ {N;b l;}; s/"\n[^"]*"/""/g; s/\\n/ /g'       
> \
>               -e '/_(.*[^\ ]""[^\ ]/p' | grep . &&                    \

Hmm, I'm not seeing the non-portable aspect here. Wonder what I'm missing...

>  sc_spec_indentation:
>       @if cppi --version >/dev/null 2>&1; then                        \
>         for f in $$($(VC_LIST_EXCEPT) | grep '\.spec\.in$$'); do      \
> -         sed -e 's|#|// #|; s|%ifn*\(arch\)* |#if a // |'            \
> +         $(SED) -e 's|#|// #|; s|%ifn*\(arch\)* |#if a // |'         \
>               -e 's/%\(else\|endif\|define\)/#\1/'                    \
>               -e 's/^\( *\)\1\1\1#/#\1/'                              \
>               -e 's|^\( *[^#/ ]\)|// \1|; s|^\( */[^/]\)|// \1|' $$f  \

Again, not seeing the non-portable use here, what am I missing?

> -         | cppi -a -c 2>&1 | sed "s|standard input|$$f|";            \
> +         | cppi -a -c 2>&1 | $(SED) "s|standard input|$$f|";         \

And I doubt this use needs $(SED), as that looks pretty bog-standard.

>  sc_require_enum_last_marker:
>       @grep -A1 -nE '^[^#]*VIR_ENUM_IMPL *\(' $$($(VC_LIST_EXCEPT))   \
> -        | sed -ne '/VIR_ENUM_IMPL[^,]*,$$/N'                         \
> +        | $(SED) -ne '/VIR_ENUM_IMPL[^,]*,$$/N'                              
> \
>            -e '/VIR_ENUM_IMPL[^,]*,[^,]*[^_,][^L,][^A,][^S,][^T,],/p' \
>            -e '/VIR_ENUM_IMPL[^,]*,[^,]\{0,4\},/p'                    \

Again, not seeing a non-portable use here.

> @@ -878,7 +878,7 @@ ifeq (0,$(MAKELEVEL))
>    # b653eda3ac4864de205419d9f41eec267cb89eeb
>    #
>    # Keep this logic in sync with autogen.sh.
> -  _submodule_hash = sed 's/^[ +-]//;s/ .*//'
> +  _submodule_hash = $(SED) 's/^[ +-]//;s/ .*//'

And this one's portable as well.  Or is the idea to replace ALL use of
s/sed/$(SED)/ even where it makes no difference?  If so, we should
probably also do it in maint.mk.  I'd like some feedback from the gnulib
community if favoring $(SED) is the right thing to do, or if I should
just rewrite libvirt's rules to stick to portable sed constructs.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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