X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f From: Rugxulo Newsgroups: comp.os.msdos.djgpp Subject: AutoConf "\\r" woes (again) Date: Sat, 16 Jan 2010 04:51:26 -0800 (PST) Organization: http://groups.google.com Lines: 144 Message-ID: NNTP-Posting-Host: 65.13.115.246 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 X-Trace: posting.google.com 1263646286 21290 127.0.0.1 (16 Jan 2010 12:51:26 GMT) X-Complaints-To: groups-abuse AT google DOT com NNTP-Posting-Date: Sat, 16 Jan 2010 12:51:26 +0000 (UTC) Complaints-To: groups-abuse AT google DOT com Injection-Info: j19g2000yqk.googlegroups.com; posting-host=65.13.115.246; posting-account=p5rsXQoAAAB8KPnVlgg9E_vlm2dvVhfO User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.38 Safari/532.0,gzip(gfe),gzip(gfe) Bytes: 5537 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com (quoting Ralf.Wildenhues_CXE_gmx_PUNKTO_de): Hello Rugxulo, Andris, I need your help for a bit of Autoconf testing for me; see below. Background: Peter reported an Autoconf regression on OS X: that came from this patch: (bug also reported here: ) I've looked at the issue now. The patch we've applied is wrong. Let's fix it. The logic is supposed to work this way: 1) This code tries to create a variable containing the carriage return character: ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi Back in Autoconf 2.63, this code was: ac_cr='^M' with a literal carriage return in it. 2) This code (and I've undone said patch above here) tries to find out whether awk's print function expands the string literal "\r" to a carriage return, or a literal carriage return is needed for that: ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi It sets the variable $ac_cs_awk_cr in such a way that, when used in the replacement part of a sed 's' command, it causes sed to insert a literal into the output that makes awk expand it to a carriage return. This is where said patch went wrong: the logic never meant to use '\r' which some sed's but not all expand to a literal carriage return; IOW, we were relying on, and fooled by, undefined behavior in sed here. 3) This code is meant to cause config.status to replace literal carriage return characters in substituted variables into strings that awk will expand to carriage returns in the config.files, while avoiding to munge end-of-line (EOL): if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ The idea was that, on systems where EOL is CR-LF, the sed "s/$ac_cr\ $//" would still prevent us from matching any carriage returns at EOL. You both reported that, on your DJGPP installations, this causes '\r' strings to appear at the end of each line in the $tmp/subs.awk file. I have a DJGPP installation now, but I cannot reproduce this failure with Autoconf 2.65: for me, the first line of code in (1) expands to a literal carriage return, DJGPP awk understands that, and the code in (3) is never invoked. I'm not quite sure whether that is just due to the changes of the code in (1), or whether there are other differences between our systems. Can you please try the following: grap Autoconf 2.65 from ftp.gnu.org, apply the patch below, build and install it on DJGPP, and see whether it works on this example package? cat >configure.ac <<\EOF AC_INIT([foo], [1]) AC_CONFIG_FILES([foo]) AC_OUTPUT EOF cat >foo.in <<\EOF @PACKAGE_STRING@ EOF autoconf ./configure cat foo If that does not work, then we may need to change the code in (3) to something like if test -z "$DJDIR" && sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ Thanks, Ralf PS: I still need to test on w32 systems before re-enabling carriage return in the "Substitute and define special characters" test. Fix substitution of carriage return on Darwin. * lib/autoconf/status.m4 (_AC_OUTPUT_FILES_PREPARE): Set ac_cs_awk_cr to '\\r', so that sed portably expands this to '\r' rather than a literal carriage return, to fix substitution on Darwin. Regression introduced in 2.63b. Report by Peter O'Gorman. diff --git a/lib/autoconf/status.m4 b/lib/autoconf/status.m4 index f74bd34..3c6cf38 100644 --- a/lib/autoconf/status.m4 +++ b/lib/autoconf/status.m4 @@ -364,7 +364,7 @@ if test "x$ac_cr" = x; then fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\r' + ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi