Re: AS_ECHO and printf

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

 



On 2023-05-22 02:35, Po Lu wrote:
printf is not portable; it is missing, both as a built-in to
ksh and a command, on Ultrix 4.5, as well as (AFAIK) Solaris 2.6, the
first of which is important for historical purposes, and the second of
which is still found in the wild in some fields.

In Autoconf and Gnulib the general rule is to draw the line at systems that are no longer supported by their suppliers. This applies to both Solaris 2.6 (end of life 2006, back when Sun was still independent) and Ultrix 4.5 (so poorly supported that I can't easily find out when end of life was, but I think around 2000). If it's easy to support these obsolete systems without significantly hurting current systems or complicating maintenance that's OK (though a volunteer needs to step up); otherwise, it's not worth the trouble.

That being said, Autoconf-generated 'configure' scripts should still work on these obsolete systems, as Autoconf automatically re-execs 'configure' with one of the more POSIX-compatible shells that are shipped with these systems. With Solaris, the shells used are bash, ksh, or /usr/xpg4/bin/sh; with Ultrix, sh5 is used. If your installation has omitted these shells I suggest that you simply install them. Otherwise, if your POSIX-compatible shell has some other name you should be able to configure with a command like this:

CONFIG_SHELL=/my/sh ./configure CONFIG_SHELL=/my/sh

as documented in the Autoconf manual. When this issue came up in the past (and this was a while ago), these workarounds were sufficient to get builds working.


On 2023-05-22 07:57, Zack Weinberg wrote:

I would be willing to consider a patch that adds to _AS_DETECT_BETTER_SHELL
a check for support for `printf '%s' "$message"` and `printf '%s\n'
"$message"` (those two constructs specifically), and/or a patch that
partially restores _AS_ECHO_PREPARE such that it attempts to fall back
to `echo [-n]` on systems where the above two constructs don't work.

I looked into the former idea and doubt whether it'd be worth the trouble. Although we could add something like this to m4sh.m4 ...

  # Printing a long string crashes Solaris 7 /usr/bin/printf.
  m4_define([_AS_SHELL_PRINTF_WORKS],

[[bs='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
  bs=$bs$bs
  bs=$bs$bs$bs
  bs=$bs$bs$bs$bs$bs
  test "X`(printf '%s\n' $bs) 2>/dev/null`" = "X$bs"]])
  ...
  _AS_DETECT_REQUIRED([_AS_SHELL_PRINTF_WORKS])

... this would slow down every execution of 'configure' (a fork would be required) merely to work around bugs in obsolete shells. And these obsolete shells are already caught and eliminated by the other _AS_DETECT_REQUIRED calls. So I imagine that doing this wouldn't help in practice, and so would slow down 'configure' unnecessarily.

The latter idea (i.e., partially restoring _AS_ECHO_PREPARE) has the same problem, plus it'd require even more hacking and testing.

If there's a better way to do things that would not hurt 'configure' scripts on typical hosts while still porting to obsolete ones, then we could accept such a patch. Someone would have to write and test it on these older platforms though.




[Index of Archives]     [GCC Help]     [Kernel Discussion]     [RPM Discussion]     [Red Hat Development]     [Yosemite News]     [Linux USB]     [Samba]

  Powered by Linux