bug-autoconf
[Top][All Lists]
Advanced

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

Re: Improper substitution of @srcdir@ in VPATH template for "in-source"


From: Ralf Wildenhues
Subject: Re: Improper substitution of @srcdir@ in VPATH template for "in-source" configure
Date: Wed, 23 Jun 2010 20:20:01 +0200
User-agent: Mutt/1.5.20 (2010-04-22)

Hi Keith,

* Keith Marshall wrote on Wed, Jun 23, 2010 at 10:58:01AM CEST:
> Initially reported here:
> http://thread.gmane.org/gmane.comp.gnu.mingw.user/33435/focus=33455

Thanks for the bug report.

>   $ cat Makefile.in
>   # @configure_input@
>   srcdir = @srcdir@
>   VPATH = @srcdir@/src
>   # EOF

>   $ grep VPATH Makefile
>   VPATH = /src
> 
> Note that this should be `VPATH = ./src', but the dot, which should 
> have resulted from substitution of @srcdir@, has been elided.  Note 
> however:

The patch below should fix this.  Tested on several systems.  OK?

Space-separated VPATH entries are not portable to FreeBSD and several
vendor makes.  I'm not quite sure if in practice we may run into make
implementations any more that do not support
- variable expansions at all in VPATH,
- multiple entries in VPATH,
- VPATH at all,

but the manual indicates there used to be such makes.  Eric, are you ok
with the testsuite addition being a test balloon for this?  Otherwise,
it needs a prerequisite test for the basic functionality to avoid
spurious failures.

Thanks,
Ralf

    Improve VPATH handling in config.status for non-Automake projects.
    
    * lib/autoconf/status.m4 (_AC_OUTPUT_FILES_PREPARE): Be sure not
    to remove references to a subdir of srcdir.  Fix treatment of
    multiple colon-separated VPATH entries.
    * tests/torture.at (VPATH): New test.
    Report by Keith Marshall.

diff --git a/lib/autoconf/status.m4 b/lib/autoconf/status.m4
index fd3c5da..b9e7026 100644
--- a/lib/autoconf/status.m4
+++ b/lib/autoconf/status.m4
@@ -552,17 +552,25 @@ fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
   || AC_MSG_ERROR([could not setup config files machinery])
 _ACEOF
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
 # trailing colons and then remove the whole line if VPATH becomes empty
 # (actually we leave an empty line to preserve line numbers).
 if test "x$srcdir" = x.; then
-  ac_vpsub=['/^[        ]*VPATH[        ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:address@hidden@:*/:/
-s/^\([^=]*=[    ]*\):*/\1/
+  ac_vpsub=['/^[        ]*VPATH[        ]*=[    ]*/{
+h
+s///
+s/^/:/
+s/[     ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
 s/:*$//
+x
+s/\(=[  ]*\).*/\1/
+G
+s/\n//
 s/^[^=]*=[      ]*$//
 }']
 fi
diff --git a/tests/torture.at b/tests/torture.at
index dc906a8..27405b7 100644
--- a/tests/torture.at
+++ b/tests/torture.at
@@ -1151,6 +1151,92 @@ AT_CHECK([cd at-dir && "$at_here/configure" 
$configure_options], [], [ignore])
 AT_CLEANUP
 
 
+## ------- ##
+## VPATH.  ##
+## ------- ##
+
+AT_SETUP([VPATH])
+
+dirs='at paren brace space'
+for dir in $dirs; do
+  mkdir $dir $dir/s1 $dir/s2
+  touch $dir/f $dir/s1/f1 $dir/s2/f2
+done
+
+AT_DATA([configure.ac],
+[[AC_INIT
+AC_CONFIG_FILES([at/Makefile paren/Makefile brace/Makefile space/Makefile])
+AC_OUTPUT
+]])
+
+AT_DATA([at/Makefile.in],
+[[# This is what you should use in order to be portable to old makes.
+srcdir = @srcdir@
+VPATH = @srcdir@/s1:@srcdir@:@srcdir@/s2
+all: f f1 f2
+       @echo ok
+]])
+
+AT_DATA([paren/Makefile.in],
+[[# This works with some makes but not with old ones.
+srcdir = @srcdir@
+VPATH = $(srcdir)/s1:$(srcdir):$(srcdir)/s2
+all: f f1 f2
+       @echo ok
+]])
+
+AT_DATA([brace/Makefile.in],
+[[# This works with some makes but not with old ones.
+srcdir = @srcdir@
+VPATH = ${srcdir}/s1:${srcdir}:${srcdir}/s2
+all: f f1 f2
+       @echo ok
+]])
+
+AT_DATA([space/Makefile.in],
+[[# This fails with FreeBSD make, for example.
+srcdir = @srcdir@
+VPATH = @srcdir@/s1 @srcdir@ @srcdir@/s2
+all: f f1 f2
+       @echo ok
+]])
+
+AT_CHECK_AUTOCONF
+
+: ${MAKE=make}
+
+# In place.
+AT_CHECK([./configure $configure_options], [], [ignore])
+# Treat BSD make separately, afterwards, for maximal coverage.
+dirs='at paren brace'
+for dir in $dirs; do
+  AT_CHECK([cd $dir && $MAKE], [], [ignore], [ignore])
+done
+
+rm -f config.status
+mkdir build absbuild
+
+# Relative name.
+AT_CHECK([cd build && ../configure $configure_options], [], [ignore])
+for dir in $dirs; do
+  AT_CHECK([cd build/$dir && $MAKE], [], [ignore], [ignore])
+done
+
+# Absolute name.
+at_here=`pwd`
+AT_CHECK([cd absbuild && "$at_here/configure" $configure_options], [], 
[ignore])
+for dir in $dirs; do
+  AT_CHECK([cd absbuild/$dir && $MAKE], [], [ignore], [ignore])
+done
+
+# These will not pass with BSD make.
+AT_CHECK([cd space && { $MAKE || exit 77; }], [], [ignore], [ignore])
+AT_CHECK([cd build/space && $MAKE], [], [ignore], [ignore])
+AT_CHECK([cd absbuild/space && $MAKE], [], [ignore], [ignore])
+
+AT_CLEANUP
+
+
 ## ----------------- ##
 ## Signal handling.  ##
 ## ----------------- ##



reply via email to

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