[ http://lists.gnu.org/archive/html/autoconf-patches/2007-07/msg00008.html ] * Sebastian Freundt wrote on Wed, Jul 25, 2007 at 12:06:01AM CEST: > Ralf Wildenhues <Ralf.Wildenhues@xxxxxx> writes: > > * Sebastian Freundt wrote on Mon, Jul 23, 2007 at 11:31:07PM CEST: > > [...] > >> my build directory (distinct from $srcdir): > >> /home/src/=build/ > >> > >> There's an AC_CONFIG_LINKS([src/s:src/s]) in my configure.ac. > >> configure or config.status, respectively, now do the following: > >> > >> 1. in a clean build directory: create the src subdirectory, create the > >> symlink from $srcdir/src/s to $builddir/src/s > >> 2. in a configured build directory: delete $builddir/src/s and create a > >> link from $builddir/src/s(!) to $builddir/src/s > >> 3. in such a screwed build directory, another invocation of config.status > >> yields the correct link again ($builddir/src/s -> $srcdir/src/s) [...] > > OK to apply? > > Fine by me :) Works like a charm! No developer commented, so I installed the patch (copied below again for autoconf-patches records). Cheers, Ralf 2007-08-18 Ralf Wildenhues <Ralf.Wildenhues@xxxxxx> * lib/autoconf/status.m4 (_AC_OUTPUT_LINK): Do not try to link a file to itself if source and build trees coincide. * tests/torture.at (AC_CONFIG_LINKS and identical files): New test. Report by Sebastian Freundt <hroptatyr@...>. Index: lib/autoconf/status.m4 =================================================================== RCS file: /cvsroot/autoconf/autoconf/lib/autoconf/status.m4,v retrieving revision 1.136 diff -u -r1.136 status.m4 --- lib/autoconf/status.m4 20 Jul 2007 23:11:53 -0000 1.136 +++ lib/autoconf/status.m4 18 Aug 2007 09:06:19 -0000 @@ -871,24 +871,31 @@ # CONFIG_LINK # - test -r "$ac_source" || ac_source=$srcdir/$ac_source + if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then + AC_MSG_WARN([not linking $ac_source to itself]) + else + # Prefer the file from the source tree if names are identical. + if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then + ac_source=$srcdir/$ac_source + fi - AC_MSG_NOTICE([linking $ac_source to $ac_file]) + AC_MSG_NOTICE([linking $ac_source to $ac_file]) - if test ! -r "$ac_source"; then - AC_MSG_ERROR([$ac_source: file not found]) - fi - rm -f "$ac_file" + if test ! -r "$ac_source"; then + AC_MSG_ERROR([$ac_source: file not found]) + fi + rm -f "$ac_file" - # Try a relative symlink, then a hard link, then a copy. - case $srcdir in - [[\\/$]]* | ?:[[\\/]]* ) ac_rel_source=$ac_source ;; - *) ac_rel_source=$ac_top_build_prefix$ac_source ;; - esac - ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || - ln "$ac_source" "$ac_file" 2>/dev/null || - cp -p "$ac_source" "$ac_file" || - AC_MSG_ERROR([cannot link or copy $ac_source to $ac_file]) + # Try a relative symlink, then a hard link, then a copy. + case $srcdir in + [[\\/$]]* | ?:[[\\/]]* ) ac_rel_source=$ac_source ;; + *) ac_rel_source=$ac_top_build_prefix$ac_source ;; + esac + ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || + ln "$ac_source" "$ac_file" 2>/dev/null || + cp -p "$ac_source" "$ac_file" || + AC_MSG_ERROR([cannot link or copy $ac_source to $ac_file]) + fi ])# _AC_OUTPUT_LINK Index: tests/torture.at =================================================================== RCS file: /cvsroot/autoconf/autoconf/tests/torture.at,v retrieving revision 1.84 diff -u -r1.84 torture.at --- tests/torture.at 20 Jul 2007 23:11:55 -0000 1.84 +++ tests/torture.at 18 Aug 2007 09:06:19 -0000 @@ -880,6 +880,40 @@ AT_CLEANUP +## ------------------------------------- ## +## AC_CONFIG_LINKS and identical files. ## +## ------------------------------------- ## +AT_SETUP([AC_CONFIG_LINKS and identical files]) + +AT_DATA([configure.ac], +[[AC_INIT +AC_CONFIG_LINKS([src/s:src/s]) +test "$srcdir" != '.' && AC_CONFIG_LINKS([src/t:src/t]) +AC_OUTPUT +]]) + +mkdir src build +echo file1 > src/s +echo file2 > src/t +AT_CHECK_AUTOCONF +cd build +AT_CHECK([../configure && ../configure], 0, [ignore]) +AT_CHECK([cat src/s src/t], 0, [file1 +file2 +]) +cd .. +AT_CHECK([./configure && ./configure], 0, [ignore], [stderr]) +AT_CHECK([grep src/t stderr], 1) +AT_CHECK([cat src/s src/t], 0, [file1 +file2 +]) +AT_CHECK(["`pwd`"/configure && "`pwd`"/configure], 0, [ignore], [ignore]) +AT_CHECK([cat src/s src/t], 0, [file1 +file2 +]) + +AT_CLEANUP + AT_BANNER([autoreconf.]) _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx http://lists.gnu.org/mailman/listinfo/autoconf