* Re: [Mingw-users] Solving the "relink exe's" libtool problem
2003-01-13 3:04 Solving the "relink exe's" libtool problem Charles Wilson
@ 2003-01-13 3:04 ` Michael Bester
2003-01-13 3:30 ` Alexandre Duret-Lutz
1 sibling, 0 replies; 22+ messages in thread
From: Michael Bester @ 2003-01-13 3:04 UTC (permalink / raw)
To: Charles Wilson; +Cc: cygwin, mingw-users
Charles Wilson wrote:
> [cross posted. Please keep (at least) cygwin@cygwin.com in all
> replies, especially as the @gnu.org mailserver has not been archiving
> all messages]
>
> There has been a long-standing problem with libtool on windows-ish
> platforms (cygwin, mingw, others?), in which libtool relinks exe's
> over and over and over, when the exe depends on a shared lib that is
> also built as part of the same package.
>
> This behavior is due to the necessity that we must use a wrapper
> script to set the PATH properly, so that the newly compiled exe can
> "find" its shared lib, when run "in place" -- e.g. as part of a
> test-suite. Thus, we have
>
> <build-dir>/foo (wrapper script)
> <build-dir>/.libs/foo.exe (real exe)
>
> However, the Makefile target is "foo$(EXEEXT)" -- which isn't
> satisfied by the "foo" wrapper script, so 'make' keeps trying to
> create it. However, the wrapper script can NOT be named "foo.exe", for
> a number of good reasons.
>
> For more information on this problem, see
>
> Cygwin List O' Issues (take 2): #3 relinking exe's
> http://mail.gnu.org/pipermail/libtool/2002-November/007153.html
> There is an attachment that demonstrates the problem; I've also
> attached it directly to this email.
>
> EXEEXT and -link
> http://mail.gnu.org/pipermail/libtool/2002-October/007131.html
>
> Based on Earnie's suggestion in the second message, I have implemented
> a solution, but it is TIGHTLY linked between automake and libtool.
> This linkage is necessary because both libtool and automake 'use' the
> value of EXEEXT in a number of places; by saving its value and
> resetting it to null in libtool, we must re-supply the original value
> *in some places, but not others* so that automake works properly --
> which means automake needs to "know" about the new variable that holds
> the original value of EXEEXT.
>
> On non-windows platforms, EXEEXT is null. (pre-existing, unchanged)
> On all platforms, LT_EXEEXT is null without the libtool changes.
>
> Thus, on non-windows platforms, the automake changes have no effect,
> even if they are accepted (and used) without the corresponding libtool
> changes.
>
> Similarly, on non-windows platforms, the libtool changes have no
> effect, even if they are accepted (and used) without the corresponding
> automake changes.
>
> However, on windows-ish platforms, you must have BOTH changes or
> NEITHER -- or else things break. (Actually, it's not QUITE that bad.
> Even on windows, IF you have only the automake changes -- but don't
> use libtool at all, then things are fine. No probs. But you can't
> use an updated automake + non-updated libtool, and you can't use
> non-updated automake + updated libtool.)
>
> So, for non-windows, each patch can be accepted and applied
> independently. For windows, they need to be synchronized -- but
> perhaps the autotool maintainers for cygwin (me) and mingw/MSYS
> (Earnie) can handle that *synchronization* "outside the tree" -- as
> long as it is clear that *eventually* both patches will make it in to
> their respective codebase.
>
> -----------------------
>
> For testing purposes, I've provided automake-devel-1.7.2-2 and
> libtool-devel-20030103-2 packages for cygwin. Just point setup.exe at
>
> http://www.neuro.gatech.edu/users/cwilson/cygutils/testing/
>
> and select the appropriate packages.
>
> -----------------------
>
> I've attached the changelogs and patches for both automake (against
> 1.7.2) and libtool (against current CVS). I've also attached a simple
> testcase. Just unpack, run ./bootstrap, ./configure, make.
>
> Then 'make' again. Without these changes, program.exe will be
> relinked. With these changes it will not be. 'make install' and
> 'make uninstall' work as expected -- without relinking, with these
> changes.
>
> I've run the testsuites of both automake and libtool with these
> changes, and have had no regressions -- but they ran a lot faster... <g>
>
> -----------------------
>
> Cygwin people: please test
> Mingw/MSYS people: please apply to your own packages, and test
> Libtool people: please apply?
> I'd really like to make sure this or something like it
> gets into 1.5...
> Automake people: please apply?
>
> I realize that, even if all of the cygwin and mingw people say "this
> is great", we will still require some coordination between the libtool
> and automake folks to insure both sets are eventually accepted and the
> timing of that acceptance.
>
> --Chuck
> cygwin libtool maintainer
> cygwin automake co-maintainer
>
>------------------------------------------------------------------------
>
>2003-01-05 Charles Wilson <cwilson@ece.gatech.edu>
>
> * lib/am/program.am: when %?LIBTOOL%, use $(LT_EXEEXT)
> not %EXEEXT%
> * lib/am/progs.am (install-%DIR%PROGRAMS): when %?LIBTOOL%,
> use $(LT_EXEEXT) not $(EXEEXT). Insure that we test for
> both foo and foo$[LT_]EXEEXT. Insure that we install
> foo$([LT_]EXEEXT) and not foo.
> (uninstall-%DIR%PROGRAMS): when %?LIBTOOL%, use
> $(LT_EXEEXT) not $(EXEEXT)
> (clean-%DIR%PROGRAMS): when %?LIBTOOL%, use $(LT_EXEEXT),
> not $(EXEEXT). Insure that we remove both foo$(LT_EXEEXT)
> and foo.
>
>
>
>------------------------------------------------------------------------
>
>2002-01-05 Charles Wilson <cwilson@ece.gatech.edu>
>
> * libtool.m4 (_LT_EXEEXT): new function
> (AC_LIBTOOL_SETUP): call it
> * tests/Makefile.am: pass $(LT_EXEEXT) on to
> TEST_ENVIRONMENT
> * tests/build-relink.test: use $(LT_EXEEXT)
> instead of $(EXEEXT)
> * tests/dryrun.test: ditto
> * tests/noinst-link.test: ditto
>
>
>------------------------------------------------------------------------
>
>diff -u automake-1.7.2-orig/lib/am/program.am automake-1.7.2/lib/am/program.am
>--- automake-1.7.2-orig/lib/am/program.am 2002-12-06 04:53:18.000000000 -0500
>+++ automake-1.7.2/lib/am/program.am 2003-01-05 18:09:01.000000000 -0500
>@@ -15,6 +15,12 @@
> ## along with this program; if not, write to the Free Software
> ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
> ## 02111-1307, USA.
>+if %?LIBTOOL%
>+%PROGRAM%%EXEEXT%: $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_DEPENDENCIES) %DIRSTAMP%
>+## take care of wrapper script, static executable, and dynamic executable
>+ @rm -f %PROGRAM% %PROGRAM%$(LT_EXEEXT) .libs/%PROGRAM%$(LT_EXEEXT) _libs/%PROGRAM%$(LT_EXEEXT)
>+ $(%XLINK%) $(%XPROGRAM%_LDFLAGS) $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_LDADD) $(LIBS)
>+else !%?LIBTOOL%
> %PROGRAM%%EXEEXT%: $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_DEPENDENCIES) %DIRSTAMP%
> ## Remove program before linking. Otherwise the link will fail if the
> ## program is running somewhere. FIXME: this could be a loss if
>@@ -23,3 +29,4 @@
> ## systems.
> @rm -f %PROGRAM%%EXEEXT%
> $(%XLINK%) $(%XPROGRAM%_LDFLAGS) $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_LDADD) $(LIBS)
>+endif !%?LIBTOOL%
>diff -u automake-1.7.2-orig/lib/am/progs.am automake-1.7.2/lib/am/progs.am
>--- automake-1.7.2-orig/lib/am/progs.am 2002-12-06 04:53:19.000000000 -0500
>+++ automake-1.7.2/lib/am/progs.am 2003-01-05 18:43:30.000000000 -0500
>@@ -36,8 +36,11 @@
> @list='$(%DIR%_PROGRAMS)'; for p in $$list; do \
> ## On Cygwin with libtool test won't see `foo.exe' but instead `foo'.
> ## So we check for both.
>- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
>- if test -f $$p \
>+?LIBTOOL? p1=`echo $$p|sed 's/$(LT_EXEEXT)$$//'`; \
>+?LIBTOOL? p2=`echo $$p1|sed 's/$$/$(LT_EXEEXT)/'`; \
>+?!LIBTOOL? p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
>+?!LIBTOOL? p2=`echo $$p1|sed 's/$$/$(EXEEXT)/'`; \
>+ if test -f $$p2 \
> ?LIBTOOL? || test -f $$p1 \
> ; then \
> ## Compute basename of source file. Unless this is a nobase_ target, we
>@@ -45,16 +48,17 @@
> ## not '$(DESTDIR)$(%NDIR%dir)/python/foo.yo'.
> ## However in all cases $(transform) applies only to the basename,
> ## so we have to strip the directory part.
>- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
>+?LIBTOOL? f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(LT_EXEEXT)/'`; \
>+?!LIBTOOL? f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
> ## Prepend the directory part if nobase_ is used.
> ?!BASE? f=`echo "$$p1" | sed 's|[^/]*$$||'`"$$f"; \
> ## Note that we explicitly set the libtool mode. This avoids any
> ## lossage if the install program doesn't have a name that libtool
> ## expects.
>-?LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f"; \
>-?LIBTOOL? $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
>-?!LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f"; \
>-?!LIBTOOL? $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
>+?LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f"; \
>+?LIBTOOL? $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
>+?!LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f"; \
>+?!LIBTOOL? $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
> else :; fi; \
> done
> endif %?INSTALL%
>@@ -70,7 +74,8 @@
> @$(NORMAL_UNINSTALL)
> @list='$(%DIR%_PROGRAMS)'; for p in $$list; do \
> ## Remove any leading directory before applying $(transform).
>- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
>+?LIBTOOL? f=`echo "$$p" | sed 's,^.*/,,;s/$(LT_EXEEXT)$$//;$(transform);s/$$/$(LT_EXEEXT)/'`; \
>+?!LIBTOOL? f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
> ## Prepend the directory part if nobase_ is used.
> ?!BASE? f=`echo "$$p" | sed 's|[^/]*$$||'`"$$f"; \
> echo " rm -f $(DESTDIR)$(%NDIR%dir)/$$f"; \
>@@ -95,9 +100,10 @@
> ## FIXME: In the future (i.e., when it works) it would be nice to delegate
> ## this task to `libtool --mode=clean'.
> ?LIBTOOL? @list='$(%DIR%_PROGRAMS)'; for p in $$list; do \
>-?LIBTOOL? f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
>-?LIBTOOL? echo " rm -f $$p $$f"; \
>-?LIBTOOL? rm -f $$p $$f ; \
>+?LIBTOOL? f1=`echo $$p|sed 's/$(LT_EXEEXT)$$//'`; \
>+?LIBTOOL? f2=`echo $$f1|sed 's/$$/$(LT_EXEEXT)/'`; \
>+?LIBTOOL? echo " rm -f $$f1 $$f2"; \
>+?LIBTOOL? rm -f $$f1 $$f2 ; \
> ?LIBTOOL? done
>
>
>@@ -116,7 +122,8 @@
> esac; \
> ## Strip the directory and $(EXEEXT) before applying $(transform).
> f=`echo "$$p" | \
>- sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
>+?LIBTOOL? sed 's,^.*/,,;s/$(LT_EXEEXT)$$//;$(transform);s/$$/$(LT_EXEEXT)/'`; \
>+?!LIBTOOL? sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
> ## Insert the directory back if nobase_ is used.
> ?!BASE? f=`echo "$$p" | sed 's|[^/]*$$||'`"$$f"; \
> for opt in --help --version; do \
>
>
>------------------------------------------------------------------------
>
>? .build
>? .inst
>? .sinst
>? COPYING
>? CYGWIN-PATCHES
>? INSTALL
>? install-sh
>? missing
>? mkinstalldirs
>? libltdl/config-h.in
>Index: libtool.m4
>===================================================================
>RCS file: /cvsroot/libtool/libtool/libtool.m4,v
>retrieving revision 1.287
>diff -u -u -r1.287 libtool.m4
>--- libtool.m4 31 Dec 2002 05:43:23 -0000 1.287
>+++ libtool.m4 6 Jan 2003 07:34:06 -0000
>@@ -109,6 +109,7 @@
> # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
> AC_REQUIRE([AC_OBJEXT])dnl
> AC_REQUIRE([AC_EXEEXT])dnl
>+AC_REQUIRE([_LT_EXEEXT])dnl
> dnl
>
> AC_LIBTOOL_SYS_MAX_CMD_LEN
>@@ -5510,6 +5511,17 @@
> AC_DEFUN([LT_AC_PROG_RC],
> [AC_CHECK_TOOL(RC, windres, no)
> ])
>+
>+AC_DEFUN([_LT_EXEEXT],
>+[lt_exeext=$ac_exeext
>+AC_SUBST([LT_EXEEXT], [$lt_exeext])dnl
>+# Don't allow calls to AC_EXEEXT again
>+define([AC_EXEEXT], [])
>+# keep definition of $ac_exeext, but insure that EXEEXT
>+# is empty in makefiles
>+ac_cv_exeext=
>+EXEEXT=
>+])# _LT_EXEEXT
>
> ############################################################
> # NOTE: This macro has been submitted for inclusion into #
>Index: tests/Makefile.am
>===================================================================
>RCS file: /cvsroot/libtool/libtool/tests/Makefile.am,v
>retrieving revision 1.32
>diff -u -u -r1.32 Makefile.am
>--- tests/Makefile.am 18 Nov 2002 18:59:44 -0000 1.32
>+++ tests/Makefile.am 6 Jan 2003 07:34:07 -0000
>@@ -75,7 +75,8 @@
> TESTS_ENVIRONMENT = MAKE="$(MAKE)" CC="$(CC)" CFLAGS="$(CFLAGS)" \
> CPPFLAGS="$(CPPFLAGS)" LD="$(LD)" LDFLAGS="$(LDFLAGS)" \
> LIBS="$(LIBS)" LN_S="$(LN_S)" NM="$(NM)" RANLIB="$(RANLIB)" \
>- OBJEXT="$(OBJEXT)" EXEEXT="$(EXEEXT)" FFLAGS="$(FFLAGS)"
>+ OBJEXT="$(OBJEXT)" EXEEXT="$(EXEEXT)" LT_EXEEXT="$(LT_EXEEXT)" \
>+ FFLAGS="$(FFLAGS)"
>
> EXTRA_DIST = defs $(COMMON_TESTS) $(CXX_TESTS) $(F77_TESTS)
>
>Index: tests/build-relink.test
>===================================================================
>RCS file: /cvsroot/libtool/libtool/tests/build-relink.test,v
>retrieving revision 1.13
>diff -u -u -r1.13 build-relink.test
>--- tests/build-relink.test 19 Nov 2002 09:42:39 -0000 1.13
>+++ tests/build-relink.test 6 Jan 2003 07:34:07 -0000
>@@ -105,8 +105,8 @@
> fi
>
> if test "$shlibpath_overrides_runpath" != yes; then
>- rm -f $objdir/lt-hell$EXEEXT || exit 1
>- cp $objdir/hell$EXEEXT $objdir/lt-hell$EXEEXT || exit 1
>+ rm -f $objdir/lt-hell$LT_EXEEXT || exit 1
>+ cp $objdir/hell$LT_EXEEXT $objdir/lt-hell$LT_EXEEXT || exit 1
> echo "running ../demo/hell with installed libhello.la"
> if ./hell; then
> echo "Worked, as expected"
>@@ -114,7 +114,7 @@
> echo "shlibpath_overrides_runpath should be set to yes"
> status=1
> fi
>- rm -f $objdir/lt-hell$EXEEXT
>+ rm -f $objdir/lt-hell$LT_EXEEXT
> fi
>
> exit $status
>Index: tests/dryrun.test
>===================================================================
>RCS file: /cvsroot/libtool/libtool/tests/dryrun.test,v
>retrieving revision 1.9
>diff -u -u -r1.9 dryrun.test
>--- tests/dryrun.test 3 Mar 2002 03:19:55 -0000 1.9
>+++ tests/dryrun.test 6 Jan 2003 07:34:08 -0000
>@@ -89,7 +89,7 @@
>
> echo "= Running $make uninstall in ../mdemo (dry run)"
> # Libtool does not uninstall the programs, remove them first
>-rm -f $prefix/bin/mdemo$EXEEXT $prefix/bin/mdemo_static$EXEEXT
>+rm -f $prefix/bin/mdemo$LT_EXEEXT $prefix/bin/mdemo_static$LT_EXEEXT
> ls -l . $objdir > $before
> ls -lR $prefix >> $before
> force_dry_run=yes $make uninstall 1>&2 || exit $?
>Index: tests/noinst-link.test
>===================================================================
>RCS file: /cvsroot/libtool/libtool/tests/noinst-link.test,v
>retrieving revision 1.3
>diff -u -u -r1.3 noinst-link.test
>--- tests/noinst-link.test 3 Mar 2002 03:19:55 -0000 1.3
>+++ tests/noinst-link.test 6 Jan 2003 07:34:08 -0000
>@@ -22,14 +22,14 @@
> cd ../demo || exit 77
>
> echo "removing libhello.la and hell from ../demo"
>-rm -f libhello.la hell$EXEEXT
>+rm -f libhello.la hell$LT_EXEEXT
>
> echo "linking hell with a broken ../demo/libhello.la"
>-if $make hell$EXEEXT libhello_la_OBJECTS=hello.lo; then
>+if $make hell$LT_EXEEXT libhello_la_OBJECTS=hello.lo; then
> echo "= Succeeded: this means the installed library was used, which is wrong"
> status=1
> fi
>
>-rm -f libhello.la hell$EXEEXT
>+rm -f libhello.la hell$LT_EXEEXT
>
> exit $status
>
Hi,
This is a change I was waiting for a long time now. Great!
No more endless installs and fights with the libtool.
Thanks.
Regards.
Michael Bester.
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Solving the "relink exe's" libtool problem
@ 2003-01-13 3:04 Charles Wilson
2003-01-13 3:04 ` [Mingw-users] " Michael Bester
2003-01-13 3:30 ` Alexandre Duret-Lutz
0 siblings, 2 replies; 22+ messages in thread
From: Charles Wilson @ 2003-01-13 3:04 UTC (permalink / raw)
To: cygwin, libtool-patches, automake-patches, mingw-users
[-- Attachment #1: Type: text/plain, Size: 4382 bytes --]
[cross posted. Please keep (at least) cygwin@cygwin.com in all replies,
especially as the @gnu.org mailserver has not been archiving all messages]
There has been a long-standing problem with libtool on windows-ish
platforms (cygwin, mingw, others?), in which libtool relinks exe's over
and over and over, when the exe depends on a shared lib that is also
built as part of the same package.
This behavior is due to the necessity that we must use a wrapper script
to set the PATH properly, so that the newly compiled exe can "find" its
shared lib, when run "in place" -- e.g. as part of a test-suite. Thus,
we have
<build-dir>/foo (wrapper script)
<build-dir>/.libs/foo.exe (real exe)
However, the Makefile target is "foo$(EXEEXT)" -- which isn't satisfied
by the "foo" wrapper script, so 'make' keeps trying to create it.
However, the wrapper script can NOT be named "foo.exe", for a number of
good reasons.
For more information on this problem, see
Cygwin List O' Issues (take 2): #3 relinking exe's
http://mail.gnu.org/pipermail/libtool/2002-November/007153.html
There is an attachment that demonstrates the problem; I've also attached
it directly to this email.
EXEEXT and -link
http://mail.gnu.org/pipermail/libtool/2002-October/007131.html
Based on Earnie's suggestion in the second message, I have implemented a
solution, but it is TIGHTLY linked between automake and libtool. This
linkage is necessary because both libtool and automake 'use' the value
of EXEEXT in a number of places; by saving its value and resetting it to
null in libtool, we must re-supply the original value *in some places,
but not others* so that automake works properly -- which means automake
needs to "know" about the new variable that holds the original value of
EXEEXT.
On non-windows platforms, EXEEXT is null. (pre-existing, unchanged)
On all platforms, LT_EXEEXT is null without the libtool changes.
Thus, on non-windows platforms, the automake changes have no effect,
even if they are accepted (and used) without the corresponding libtool
changes.
Similarly, on non-windows platforms, the libtool changes have no effect,
even if they are accepted (and used) without the corresponding automake
changes.
However, on windows-ish platforms, you must have BOTH changes or NEITHER
-- or else things break. (Actually, it's not QUITE that bad. Even on
windows, IF you have only the automake changes -- but don't use libtool
at all, then things are fine. No probs. But you can't use an updated
automake + non-updated libtool, and you can't use non-updated automake +
updated libtool.)
So, for non-windows, each patch can be accepted and applied
independently. For windows, they need to be synchronized -- but perhaps
the autotool maintainers for cygwin (me) and mingw/MSYS (Earnie) can
handle that *synchronization* "outside the tree" -- as long as it is
clear that *eventually* both patches will make it in to their respective
codebase.
-----------------------
For testing purposes, I've provided automake-devel-1.7.2-2 and
libtool-devel-20030103-2 packages for cygwin. Just point setup.exe at
http://www.neuro.gatech.edu/users/cwilson/cygutils/testing/
and select the appropriate packages.
-----------------------
I've attached the changelogs and patches for both automake (against
1.7.2) and libtool (against current CVS). I've also attached a simple
testcase. Just unpack, run ./bootstrap, ./configure, make.
Then 'make' again. Without these changes, program.exe will be relinked.
With these changes it will not be. 'make install' and 'make
uninstall' work as expected -- without relinking, with these changes.
I've run the testsuites of both automake and libtool with these changes,
and have had no regressions -- but they ran a lot faster... <g>
-----------------------
Cygwin people: please test
Mingw/MSYS people: please apply to your own packages, and test
Libtool people: please apply?
I'd really like to make sure this or something like it
gets into 1.5...
Automake people: please apply?
I realize that, even if all of the cygwin and mingw people say "this is
great", we will still require some coordination between the libtool and
automake folks to insure both sets are eventually accepted and the
timing of that acceptance.
--Chuck
cygwin libtool maintainer
cygwin automake co-maintainer
[-- Attachment #2: automake.changelog --]
[-- Type: text/plain, Size: 539 bytes --]
2003-01-05 Charles Wilson <cwilson@ece.gatech.edu>
* lib/am/program.am: when %?LIBTOOL%, use $(LT_EXEEXT)
not %EXEEXT%
* lib/am/progs.am (install-%DIR%PROGRAMS): when %?LIBTOOL%,
use $(LT_EXEEXT) not $(EXEEXT). Insure that we test for
both foo and foo$[LT_]EXEEXT. Insure that we install
foo$([LT_]EXEEXT) and not foo.
(uninstall-%DIR%PROGRAMS): when %?LIBTOOL%, use
$(LT_EXEEXT) not $(EXEEXT)
(clean-%DIR%PROGRAMS): when %?LIBTOOL%, use $(LT_EXEEXT),
not $(EXEEXT). Insure that we remove both foo$(LT_EXEEXT)
and foo.
[-- Attachment #3: libtool.changelog --]
[-- Type: text/plain, Size: 317 bytes --]
2002-01-05 Charles Wilson <cwilson@ece.gatech.edu>
* libtool.m4 (_LT_EXEEXT): new function
(AC_LIBTOOL_SETUP): call it
* tests/Makefile.am: pass $(LT_EXEEXT) on to
TEST_ENVIRONMENT
* tests/build-relink.test: use $(LT_EXEEXT)
instead of $(EXEEXT)
* tests/dryrun.test: ditto
* tests/noinst-link.test: ditto
[-- Attachment #4: automake.patch --]
[-- Type: text/plain, Size: 5234 bytes --]
diff -u automake-1.7.2-orig/lib/am/program.am automake-1.7.2/lib/am/program.am
--- automake-1.7.2-orig/lib/am/program.am 2002-12-06 04:53:18.000000000 -0500
+++ automake-1.7.2/lib/am/program.am 2003-01-05 18:09:01.000000000 -0500
@@ -15,6 +15,12 @@
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
## 02111-1307, USA.
+if %?LIBTOOL%
+%PROGRAM%%EXEEXT%: $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_DEPENDENCIES) %DIRSTAMP%
+## take care of wrapper script, static executable, and dynamic executable
+ @rm -f %PROGRAM% %PROGRAM%$(LT_EXEEXT) .libs/%PROGRAM%$(LT_EXEEXT) _libs/%PROGRAM%$(LT_EXEEXT)
+ $(%XLINK%) $(%XPROGRAM%_LDFLAGS) $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_LDADD) $(LIBS)
+else !%?LIBTOOL%
%PROGRAM%%EXEEXT%: $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_DEPENDENCIES) %DIRSTAMP%
## Remove program before linking. Otherwise the link will fail if the
## program is running somewhere. FIXME: this could be a loss if
@@ -23,3 +29,4 @@
## systems.
@rm -f %PROGRAM%%EXEEXT%
$(%XLINK%) $(%XPROGRAM%_LDFLAGS) $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_LDADD) $(LIBS)
+endif !%?LIBTOOL%
diff -u automake-1.7.2-orig/lib/am/progs.am automake-1.7.2/lib/am/progs.am
--- automake-1.7.2-orig/lib/am/progs.am 2002-12-06 04:53:19.000000000 -0500
+++ automake-1.7.2/lib/am/progs.am 2003-01-05 18:43:30.000000000 -0500
@@ -36,8 +36,11 @@
@list='$(%DIR%_PROGRAMS)'; for p in $$list; do \
## On Cygwin with libtool test won't see `foo.exe' but instead `foo'.
## So we check for both.
- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- if test -f $$p \
+?LIBTOOL? p1=`echo $$p|sed 's/$(LT_EXEEXT)$$//'`; \
+?LIBTOOL? p2=`echo $$p1|sed 's/$$/$(LT_EXEEXT)/'`; \
+?!LIBTOOL? p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+?!LIBTOOL? p2=`echo $$p1|sed 's/$$/$(EXEEXT)/'`; \
+ if test -f $$p2 \
?LIBTOOL? || test -f $$p1 \
; then \
## Compute basename of source file. Unless this is a nobase_ target, we
@@ -45,16 +48,17 @@
## not '$(DESTDIR)$(%NDIR%dir)/python/foo.yo'.
## However in all cases $(transform) applies only to the basename,
## so we have to strip the directory part.
- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+?LIBTOOL? f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(LT_EXEEXT)/'`; \
+?!LIBTOOL? f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
## Prepend the directory part if nobase_ is used.
?!BASE? f=`echo "$$p1" | sed 's|[^/]*$$||'`"$$f"; \
## Note that we explicitly set the libtool mode. This avoids any
## lossage if the install program doesn't have a name that libtool
## expects.
-?LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f"; \
-?LIBTOOL? $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
-?!LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f"; \
-?!LIBTOOL? $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
+?LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f"; \
+?LIBTOOL? $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
+?!LIBTOOL? echo " $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f"; \
+?!LIBTOOL? $(INSTALL_PROGRAM_ENV) $(%DIR%PROGRAMS_INSTALL) $$p2 $(DESTDIR)$(%NDIR%dir)/$$f || exit 1; \
else :; fi; \
done
endif %?INSTALL%
@@ -70,7 +74,8 @@
@$(NORMAL_UNINSTALL)
@list='$(%DIR%_PROGRAMS)'; for p in $$list; do \
## Remove any leading directory before applying $(transform).
- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+?LIBTOOL? f=`echo "$$p" | sed 's,^.*/,,;s/$(LT_EXEEXT)$$//;$(transform);s/$$/$(LT_EXEEXT)/'`; \
+?!LIBTOOL? f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
## Prepend the directory part if nobase_ is used.
?!BASE? f=`echo "$$p" | sed 's|[^/]*$$||'`"$$f"; \
echo " rm -f $(DESTDIR)$(%NDIR%dir)/$$f"; \
@@ -95,9 +100,10 @@
## FIXME: In the future (i.e., when it works) it would be nice to delegate
## this task to `libtool --mode=clean'.
?LIBTOOL? @list='$(%DIR%_PROGRAMS)'; for p in $$list; do \
-?LIBTOOL? f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-?LIBTOOL? echo " rm -f $$p $$f"; \
-?LIBTOOL? rm -f $$p $$f ; \
+?LIBTOOL? f1=`echo $$p|sed 's/$(LT_EXEEXT)$$//'`; \
+?LIBTOOL? f2=`echo $$f1|sed 's/$$/$(LT_EXEEXT)/'`; \
+?LIBTOOL? echo " rm -f $$f1 $$f2"; \
+?LIBTOOL? rm -f $$f1 $$f2 ; \
?LIBTOOL? done
@@ -116,7 +122,8 @@
esac; \
## Strip the directory and $(EXEEXT) before applying $(transform).
f=`echo "$$p" | \
- sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+?LIBTOOL? sed 's,^.*/,,;s/$(LT_EXEEXT)$$//;$(transform);s/$$/$(LT_EXEEXT)/'`; \
+?!LIBTOOL? sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
## Insert the directory back if nobase_ is used.
?!BASE? f=`echo "$$p" | sed 's|[^/]*$$||'`"$$f"; \
for opt in --help --version; do \
[-- Attachment #5: libtool.patch --]
[-- Type: text/plain, Size: 4280 bytes --]
? .build
? .inst
? .sinst
? COPYING
? CYGWIN-PATCHES
? INSTALL
? install-sh
? missing
? mkinstalldirs
? libltdl/config-h.in
Index: libtool.m4
===================================================================
RCS file: /cvsroot/libtool/libtool/libtool.m4,v
retrieving revision 1.287
diff -u -u -r1.287 libtool.m4
--- libtool.m4 31 Dec 2002 05:43:23 -0000 1.287
+++ libtool.m4 6 Jan 2003 07:34:06 -0000
@@ -109,6 +109,7 @@
# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
AC_REQUIRE([AC_OBJEXT])dnl
AC_REQUIRE([AC_EXEEXT])dnl
+AC_REQUIRE([_LT_EXEEXT])dnl
dnl
AC_LIBTOOL_SYS_MAX_CMD_LEN
@@ -5510,6 +5511,17 @@
AC_DEFUN([LT_AC_PROG_RC],
[AC_CHECK_TOOL(RC, windres, no)
])
+
+AC_DEFUN([_LT_EXEEXT],
+[lt_exeext=$ac_exeext
+AC_SUBST([LT_EXEEXT], [$lt_exeext])dnl
+# Don't allow calls to AC_EXEEXT again
+define([AC_EXEEXT], [])
+# keep definition of $ac_exeext, but insure that EXEEXT
+# is empty in makefiles
+ac_cv_exeext=
+EXEEXT=
+])# _LT_EXEEXT
############################################################
# NOTE: This macro has been submitted for inclusion into #
Index: tests/Makefile.am
===================================================================
RCS file: /cvsroot/libtool/libtool/tests/Makefile.am,v
retrieving revision 1.32
diff -u -u -r1.32 Makefile.am
--- tests/Makefile.am 18 Nov 2002 18:59:44 -0000 1.32
+++ tests/Makefile.am 6 Jan 2003 07:34:07 -0000
@@ -75,7 +75,8 @@
TESTS_ENVIRONMENT = MAKE="$(MAKE)" CC="$(CC)" CFLAGS="$(CFLAGS)" \
CPPFLAGS="$(CPPFLAGS)" LD="$(LD)" LDFLAGS="$(LDFLAGS)" \
LIBS="$(LIBS)" LN_S="$(LN_S)" NM="$(NM)" RANLIB="$(RANLIB)" \
- OBJEXT="$(OBJEXT)" EXEEXT="$(EXEEXT)" FFLAGS="$(FFLAGS)"
+ OBJEXT="$(OBJEXT)" EXEEXT="$(EXEEXT)" LT_EXEEXT="$(LT_EXEEXT)" \
+ FFLAGS="$(FFLAGS)"
EXTRA_DIST = defs $(COMMON_TESTS) $(CXX_TESTS) $(F77_TESTS)
Index: tests/build-relink.test
===================================================================
RCS file: /cvsroot/libtool/libtool/tests/build-relink.test,v
retrieving revision 1.13
diff -u -u -r1.13 build-relink.test
--- tests/build-relink.test 19 Nov 2002 09:42:39 -0000 1.13
+++ tests/build-relink.test 6 Jan 2003 07:34:07 -0000
@@ -105,8 +105,8 @@
fi
if test "$shlibpath_overrides_runpath" != yes; then
- rm -f $objdir/lt-hell$EXEEXT || exit 1
- cp $objdir/hell$EXEEXT $objdir/lt-hell$EXEEXT || exit 1
+ rm -f $objdir/lt-hell$LT_EXEEXT || exit 1
+ cp $objdir/hell$LT_EXEEXT $objdir/lt-hell$LT_EXEEXT || exit 1
echo "running ../demo/hell with installed libhello.la"
if ./hell; then
echo "Worked, as expected"
@@ -114,7 +114,7 @@
echo "shlibpath_overrides_runpath should be set to yes"
status=1
fi
- rm -f $objdir/lt-hell$EXEEXT
+ rm -f $objdir/lt-hell$LT_EXEEXT
fi
exit $status
Index: tests/dryrun.test
===================================================================
RCS file: /cvsroot/libtool/libtool/tests/dryrun.test,v
retrieving revision 1.9
diff -u -u -r1.9 dryrun.test
--- tests/dryrun.test 3 Mar 2002 03:19:55 -0000 1.9
+++ tests/dryrun.test 6 Jan 2003 07:34:08 -0000
@@ -89,7 +89,7 @@
echo "= Running $make uninstall in ../mdemo (dry run)"
# Libtool does not uninstall the programs, remove them first
-rm -f $prefix/bin/mdemo$EXEEXT $prefix/bin/mdemo_static$EXEEXT
+rm -f $prefix/bin/mdemo$LT_EXEEXT $prefix/bin/mdemo_static$LT_EXEEXT
ls -l . $objdir > $before
ls -lR $prefix >> $before
force_dry_run=yes $make uninstall 1>&2 || exit $?
Index: tests/noinst-link.test
===================================================================
RCS file: /cvsroot/libtool/libtool/tests/noinst-link.test,v
retrieving revision 1.3
diff -u -u -r1.3 noinst-link.test
--- tests/noinst-link.test 3 Mar 2002 03:19:55 -0000 1.3
+++ tests/noinst-link.test 6 Jan 2003 07:34:08 -0000
@@ -22,14 +22,14 @@
cd ../demo || exit 77
echo "removing libhello.la and hell from ../demo"
-rm -f libhello.la hell$EXEEXT
+rm -f libhello.la hell$LT_EXEEXT
echo "linking hell with a broken ../demo/libhello.la"
-if $make hell$EXEEXT libhello_la_OBJECTS=hello.lo; then
+if $make hell$LT_EXEEXT libhello_la_OBJECTS=hello.lo; then
echo "= Succeeded: this means the installed library was used, which is wrong"
status=1
fi
-rm -f libhello.la hell$EXEEXT
+rm -f libhello.la hell$LT_EXEEXT
exit $status
[-- Attachment #6: relinkprog-demo.tar.bz2 --]
[-- Type: application/octet-stream, Size: 2211 bytes --]
[-- Attachment #7: Type: text/plain, Size: 214 bytes --]
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem [take 2]
2003-01-13 3:30 ` Solving the "relink exe's" libtool problem [take 2] Charles Wilson
@ 2003-01-13 3:30 ` Alexandre Duret-Lutz
2003-01-13 7:44 ` Charles Wilson
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Earnie Boyd
1 sibling, 1 reply; 22+ messages in thread
From: Alexandre Duret-Lutz @ 2003-01-13 3:30 UTC (permalink / raw)
To: Charles Wilson; +Cc: automake-patches, libtool-patches, cygwin, mingw-users
>>> "Chuck" == Charles Wilson <cwilson@ece.gatech.edu> writes:
[...]
Chuck> I left the shell wrapper where it was, in the build directory. When
Chuck> creating the shell wrapper, libtool will also create lt-${prog}.c and
Chuck> compile it using
Chuck> $run $LTCC -s -o ${prog}.exe lt-${prog}.c
Chuck> So, you end up with:
Chuck> <builddir>/foo (shell wrapper)
Chuck> <builddir>/foo.exe (binary wrapper)
Chuck> <builddir>/lt-foo.c
Chuck> <builddir>/.libs/foo.exe (the real executable)
Any way lt-foo.c could go into .libs/? Or just be erased after
foo.exe has been built? Maybe both?
Also I if you don't move `foo' to `.libs/' I think you
should ensure that `libtool --mode=clean rm -f foo.exe'
erases `foo'. (Or does Cygwin's `rm' erase both at once?)
Right now Automake doesn't use `--mode=clean'. Maybe Automake
1.8 could start doing this so we don't have to hardcode this
sort of knowledge.
[...]
--
Alexandre Duret-Lutz
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem
2003-01-13 3:30 ` Charles Wilson
@ 2003-01-13 3:30 ` Earnie Boyd
2003-01-13 3:30 ` Alexandre Duret-Lutz
1 sibling, 0 replies; 22+ messages in thread
From: Earnie Boyd @ 2003-01-13 3:30 UTC (permalink / raw)
To: Charles Wilson
Cc: Alexandre Duret-Lutz, cygwin, libtool-patches, automake-patches,
mingw-users
Charles Wilson wrote:
>
> Hmmm...now there's a thought. Perhaps, perhaps...
>
> Said "stub" executable would have to do ALL of the things the script
> does, and then pass that environment to its exec'ed target in .libs/ --
> does native windows provide an exec() command? Environment inheritance?
> You'd probably need different source code for the stub, depending on
> the platform... if buildhost == posixy, then exec() is our friend;
> otherwise, nasty native Windows code...
>
Yes MSVCRT.DLL contains both exec and spawn sets of functions. Yes the
parent environment is inherited by the child. So, the stub should be
able to work for either environment.
> Unfortunately, I can't work on that right now; my available time just
> went to zero. :-(
>
Sorry to hear that. :(
Earnie.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2]
2003-01-13 3:30 ` Solving the "relink exe's" libtool problem [take 2] Charles Wilson
2003-01-13 3:30 ` Alexandre Duret-Lutz
@ 2003-01-13 3:30 ` Earnie Boyd
2003-01-13 3:30 ` Blue screen of death on cygwin+win98+./configure Bhiksha Raj
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Charles Wilson
1 sibling, 2 replies; 22+ messages in thread
From: Earnie Boyd @ 2003-01-13 3:30 UTC (permalink / raw)
To: Charles Wilson
Cc: Alexandre Duret-Lutz, automake-patches, libtool-patches, cygwin,
mingw-users
Charles Wilson wrote:
>
> There are two places in ltmain.sh where the shell wrapper is directly
> sourced. This doesn't work very well, because when both "foo" and
> "foo.exe" exist, ". ./foo" ends up sourcing "foo.exe" -- which is bad.
>
This can be resolved by ``. ./foo.'' instead for the cygwin/mingw hosts.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem
2003-01-13 3:30 ` Alexandre Duret-Lutz
@ 2003-01-13 3:30 ` Charles Wilson
2003-01-13 3:30 ` [Mingw-users] " Earnie Boyd
2003-01-13 3:30 ` Alexandre Duret-Lutz
0 siblings, 2 replies; 22+ messages in thread
From: Charles Wilson @ 2003-01-13 3:30 UTC (permalink / raw)
To: Alexandre Duret-Lutz
Cc: cygwin, libtool-patches, automake-patches, mingw-users
Alexandre Duret-Lutz wrote:
>
> Chuck> However, the Makefile target is "foo$(EXEEXT)" -- which
> Chuck> isn't satisfied by the "foo" wrapper script, so 'make'
> Chuck> keeps trying to create it.
>
> Maybe I'm wrong, but my understanding is that wrapper scripts
> are generated only when linking programs with uninstalled shared
> libraries.
Yes.
> For instance wrapper scripts aren't created when the user uses
> --disable-shared, or simply if some program in the package
> doesn't link with shared libraries. In these cases reseting
> EXEEXT globally doesn't look like a solution (I guess it would
> just create the converse issue: the `foo:' target not satisfied
> by `foo.exe').
eh, sort of. If we were still in the days of yore, then you would be
correct. However, more modern cygwin and mingw environments (e.g. MSYS)
provide a patched 'make' that works around the issue. In fact, foo.exe
DOES satisfy a 'foo:' rule, but NOT vice versa. That's why it is okay
to get foo.exe when building 'foo:' statically, but it *wasn't* okay to
get foo when building 'foo.exe:' dynamically.
> In the current situation I don't think there is any way to find
> out whether a Makefile target needs `.exe' appended.
Right. But given the hacked 'make's that are used on cygwin and mingw,
this solution works "as expected" for both staticly and dynamicly linked
executables -- on the platforms that these variables (EXEEXT, LT_EXEEXT)
actually affect.
'Course, there's the whole cross-compiler issue (running on linux,
building stuff intended for cygwin).
> Chuck> However, the wrapper script can NOT be named "foo.exe",
> Chuck> for a number of good reasons.
>
> I assume these reasons are related to the word `script'?
> Have binaries been considered?
Hmmm...now there's a thought. Perhaps, perhaps...
Said "stub" executable would have to do ALL of the things the script
does, and then pass that environment to its exec'ed target in .libs/ --
does native windows provide an exec() command? Environment inheritance?
You'd probably need different source code for the stub, depending on
the platform... if buildhost == posixy, then exec() is our friend;
otherwise, nasty native Windows code...
Unfortunately, I can't work on that right now; my available time just
went to zero. :-(
--Chuck
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem [take 2]
2003-01-13 3:30 ` Alexandre Duret-Lutz
@ 2003-01-13 3:30 ` Charles Wilson
2003-01-13 3:30 ` Alexandre Duret-Lutz
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Earnie Boyd
0 siblings, 2 replies; 22+ messages in thread
From: Charles Wilson @ 2003-01-13 3:30 UTC (permalink / raw)
To: Alexandre Duret-Lutz
Cc: automake-patches, libtool-patches, cygwin, mingw-users
[-- Attachment #1: Type: text/plain, Size: 4894 bytes --]
Alexandre Duret-Lutz wrote:
> Chuck> Said "stub" executable would have to do ALL of the
> Chuck> things the script does, and then pass that environment
> Chuck> to its exec'ed target in .libs/ --
>
> Maybe it could just exec() something like `/bin/sh .libs/foo.sh',
> where `.libs/foo.sh' is the script wrapper.
Good idea. Try this version...
It no longer requires any coordination with automake; it's all
implemented in ltmain.sh and doesn't mess with EXEEXT or LT_EXEEXT.
Now, this isn't perfect -- it solves the problem, has no regressions on
cygwin, and is probably okay for inclusion in libtool CVS. But there
are stylistic warts that could be sanded off, if someone else were to
take the effort (hint, hint)
The following behavior is only "active" when $host is cygwin or mingw:
I left the shell wrapper where it was, in the build directory. When
creating the shell wrapper, libtool will also create lt-${prog}.c and
compile it using
$run $LTCC -s -o ${prog}.exe lt-${prog}.c
So, you end up with:
<builddir>/foo (shell wrapper)
<builddir>/foo.exe (binary wrapper)
<builddir>/lt-foo.c
<builddir>/.libs/foo.exe (the real executable)
Since builddir contains foo.exe, make is happy. ./foo.exe execs
"/bin/sh foo", which sets up the environment and calls .libs/foo.exe.
Eventually, the functionality of the shell wrapper could be moved into
the source code for the binary wrapper, and we could drop the shell
wrapper completely for cygwin/mingw $host.
So the fact that the shell wrapper is still there is a wart (but
removing the shell wrapper creates its own difficulties -- see next point).
There are two places in ltmain.sh where the shell wrapper is directly
sourced. This doesn't work very well, because when both "foo" and
"foo.exe" exist, ". ./foo" ends up sourcing "foo.exe" -- which is bad.
[Note, if the shell wrapper is eliminated, then somehow libtool needs to
be able to get the info embedded into the binary wrapper. Maybe the
binary wrapper needs a "--shell" option, that emits what is effectively
the current shell script? But then, that's just another wart (`binwrap
--shell > shellwrap`; . shellwrap ; rm shellwrap), unless there is a way
to "source" rather than execute the contents of a variable.]
But, if both the binary wrapper and the shell wrapper exist, there are a
few ways to solve the conflict that occurs when libtool tries to source
the shell wrapper (and sources the binary wrapper instead):
(1) prior to directly sourcing the shell wrapper into libtool's
memory space, make a temporary copy with a name that doesn't conflict
with "foo.exe" in the same way that "foo" does. E.g.
cp foo lt-foo.sh
. ./lt-foo.sh
rm -f lt-foo.sh
Yes, it's a race condition, but it should be temporary pending further
work...
(2) on the cygwin/mingw platforms, change the name of the shell
wrapper itself. So don't create "foo" at all; instead, create lt-foo.sh
(or .libs/foo.sh). But this requires catching ALL of the places were
$output or $outputname are set, and fixing them with case $host ;
*cgywin* | *mingw* ) ... ;; esac blocks. Blech.
I did #1, as it appeared to require fewer modifications. ($output and
$outputname are set in SO many different places...) Plus, I anticipate
that, at least on cygwin/mingw, we might eventually completely do away
with the shell wrapper by incorporating its functionality within the
binary wrapper(given the caveats re: --shell above)...an added incentive
to avoid disrupting the rest of ltmain.sh beyond the absolute minimum.
Also, there may be some complaints about using $LTCC to build the binary
wrapper, especially in the context of a cross compiler. Here's a block
of comments from the patch:
# we should really use a build-platform specific compiler
# here, but OTOH, the wrappers (shell script and this C one)
# are only useful if you want to execute the "real" binary.
# Since the "real" binary is built for $host, then this
# wrapper might as well be built for $host, too.
$run $LTCC -s -o $cwrapper $cwrappersource
--------------------------------------
cgywin: if you've already installed my test versions of automake and
libtool (automake-devel-1.7.2-2 and libtool-devel-20030103-2), you must
revert to the "REAL" cygwin automake-devel-1.7.2-1. Then, update to
libtool-devel-20030103-3 which is now available by pointing setup.exe at
http://www.neuro.gatech.edu/users/cwilson/cygutils/testing/
mingw: test reports?
automake: please ignore the previously posted patch
libtool: Hopefully this gives a starting point for further refinement.
But IMO it is okay (e.g. functional) for inclusion into CVS as-is,
provided that it causes no problems on non-windows, and fixes the
relink-exe problem on mingw. It DOES fix the relink-exe problem on cygwin.
---------------------------------------
--Chuck
[-- Attachment #2: libtool-relinkexe2.changelog --]
[-- Type: text/plain, Size: 353 bytes --]
2003-01-11 Charles Wilson <cwilson@ece.gatech.edu>
* ltmain.in: add code for a binary wrapper
to use with uninstalled executables on cygwin/mingw.
To work around a feature of the cygwin/MSYS shell,
temporarily create a copy of the shell wrapper under
a different name before sourcing it (otherwise,
the binary wrapper gets sourced, instead...)
[-- Attachment #3: libtool-relinkexe2.patch --]
[-- Type: text/plain, Size: 6118 bytes --]
Index: ltmain.in
===================================================================
RCS file: /cvsroot/libtool/libtool/ltmain.in,v
retrieving revision 1.318
diff -u -u -r1.318 ltmain.in
--- ltmain.in 1 Jan 2003 01:57:47 -0000 1.318
+++ ltmain.in 11 Jan 2003 20:00:37 -0000
@@ -4284,6 +4284,201 @@
outputname=`echo $outputname|${SED} 's,.exe$,,'` ;;
*) exeext= ;;
esac
+ case $host in
+ *cygwin* | *mingw* )
+ cwrappersource=`echo lt-$output|${SED} 's,$,.c,'`
+ cwrapper=`echo $output|${SED} 's,$,.exe,'`
+ $rm $cwrappersource $cwrapper
+ trap "$fm $cwrappersource $cwrapper; exit 1" 1 2 15
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+#define HAVE_DOS_BASED_FILE_SYSTEM
+#ifndef DIR_SEPARATOR_2
+#define DIR_SEPARATOR_2 '\\'
+#endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+char * basename (const char *name);
+char * fnqualify(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char *full;
+
+ program_name = (char *) xstrdup ((char *) basename (argv[0]));
+ full = fnqualify(argv[0]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure full doesn't end in .exe */
+ strendzap(full,".exe");
+ execl("/bin/sh","/bin/sh",full,NULL);
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+char *
+basename (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha (name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return (char *) base;
+}
+
+char *
+fnqualify(const char *path)
+{
+ size_t size;
+ char *p;
+ char tmp[LT_PATHMAX + 1];
+
+ assert(path != NULL);
+
+ /* Is it qualified already? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha (path[0]) && path[1] == ':')
+ return xstrdup (path);
+#endif
+ if (IS_DIR_SEPARATOR (path[0]))
+ return xstrdup (path);
+
+ /* prepend the current directory */
+ /* doesn't handle '~' */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */
+ p = XMALLOC(char, size);
+ sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path);
+ return p;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert(str != NULL);
+ assert(pat != NULL);
+
+ len = strlen(str);
+ patlen = strlen(pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp(str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC -s -o $cwrapper $cwrappersource
+ ;;
+ esac
$rm $output
trap "$rm $output; exit 1" 1 2 15
@@ -5066,8 +5261,12 @@
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $wrapper ;;
- *) . ./$wrapper ;;
+ */* | *\\*) cp ${wrapper} ${wrapper}-lt.sh
+ . ${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
+ *) cp ./${wrapper} ./${wrapper}-lt.sh
+ . ./${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
esac
# Check the variables that should have been set.
@@ -5097,8 +5296,12 @@
relink_command=
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
+ */* | *\\*) cp ${wrapper} ${wrapper}-lt.sh
+ . ${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
+ *) cp ./${wrapper} ./${wrapper}-lt.sh
+ . ./${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
esac
outputname=
^ permalink raw reply [flat|nested] 22+ messages in thread
* Blue screen of death on cygwin+win98+./configure
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Earnie Boyd
@ 2003-01-13 3:30 ` Bhiksha Raj
2003-01-13 3:30 ` Igor Pechtchanski
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Charles Wilson
1 sibling, 1 reply; 22+ messages in thread
From: Bhiksha Raj @ 2003-01-13 3:30 UTC (permalink / raw)
To: cygwin
Hi All,
Im trying to install TeXmacs on my win98+cygwin laptop.
First I installed the binaries for guile from the cygwin setup
(I have XFree and Tex and all associated libs already)
downloaded TeXmacs sources, ran ./configure and then
gave a "make".
I got the blue screen of death (BSD).
After iterating through several BSDs, I hunted on the web
and found a site that said that static linkages were a problem with
the latest guile and that I must install guile 1.4.1. So I uninstalled
guile,
downloaded the sources for guile 1.4.1, untarred them and
ran
./configure --disable-shared
It runs through several checks, but never completes - insted it
gives me at some point it simply gives me the blue screen of death.
This time around Im not even getting past configure.
Im not sure what to do now.
Any advice at all would be greatly appreciated.
Much thanks
Bhiksha
bhiksha@merl.com
P.S: Ive hunted on the web and faqs for answers and couldnt find
any.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem
2003-01-13 3:04 Solving the "relink exe's" libtool problem Charles Wilson
2003-01-13 3:04 ` [Mingw-users] " Michael Bester
@ 2003-01-13 3:30 ` Alexandre Duret-Lutz
2003-01-13 3:30 ` Charles Wilson
1 sibling, 1 reply; 22+ messages in thread
From: Alexandre Duret-Lutz @ 2003-01-13 3:30 UTC (permalink / raw)
To: Charles Wilson; +Cc: cygwin, libtool-patches, automake-patches, mingw-users
>>> "Chuck" == Charles Wilson <cwilson@ece.gatech.edu> writes:
Chuck> There has been a long-standing problem with libtool on windows-ish
Chuck> platforms (cygwin, mingw, others?), in which libtool relinks exe's
Chuck> over and over and over, when the exe depends on a shared lib that is
Chuck> also built as part of the same package.
Chuck> This behavior is due to the necessity that we must use a wrapper
Chuck> script to set the PATH properly, so that the newly compiled exe can
Chuck> "find" its shared lib, when run "in place" -- e.g. as part of a
Chuck> test-suite. Thus, we have
Chuck> <build-dir>/foo (wrapper script)
Chuck> <build-dir>/.libs/foo.exe (real exe)
Chuck> However, the Makefile target is "foo$(EXEEXT)" -- which
Chuck> isn't satisfied by the "foo" wrapper script, so 'make'
Chuck> keeps trying to create it.
Maybe I'm wrong, but my understanding is that wrapper scripts
are generated only when linking programs with uninstalled shared
libraries.
For instance wrapper scripts aren't created when the user uses
--disable-shared, or simply if some program in the package
doesn't link with shared libraries. In these cases reseting
EXEEXT globally doesn't look like a solution (I guess it would
just create the converse issue: the `foo:' target not satisfied
by `foo.exe').
In the current situation I don't think there is any way to find
out whether a Makefile target needs `.exe' appended.
Chuck> However, the wrapper script can NOT be named "foo.exe",
Chuck> for a number of good reasons.
I assume these reasons are related to the word `script'?
Have binaries been considered?
[...]
--
Alexandre Duret-Lutz
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem
2003-01-13 3:30 ` Charles Wilson
2003-01-13 3:30 ` [Mingw-users] " Earnie Boyd
@ 2003-01-13 3:30 ` Alexandre Duret-Lutz
2003-01-13 3:30 ` Solving the "relink exe's" libtool problem [take 2] Charles Wilson
1 sibling, 1 reply; 22+ messages in thread
From: Alexandre Duret-Lutz @ 2003-01-13 3:30 UTC (permalink / raw)
To: Charles Wilson; +Cc: automake-patches, libtool-patches, cygwin, mingw-users
>>> "Chuck" == Charles Wilson <cwilson@ece.gatech.edu> writes:
[...]
Chuck> 'Course, there's the whole cross-compiler issue (running
Chuck> on linux, building stuff intended for cygwin).
Yes. Sigh.
[...]
Chuck> Said "stub" executable would have to do ALL of the
Chuck> things the script does, and then pass that environment
Chuck> to its exec'ed target in .libs/ --
Maybe it could just exec() something like `/bin/sh .libs/foo.sh',
where `.libs/foo.sh' is the script wrapper.
[...]
--
Alexandre Duret-Lutz
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Blue screen of death on cygwin+win98+./configure
2003-01-13 3:30 ` Blue screen of death on cygwin+win98+./configure Bhiksha Raj
@ 2003-01-13 3:30 ` Igor Pechtchanski
0 siblings, 0 replies; 22+ messages in thread
From: Igor Pechtchanski @ 2003-01-13 3:30 UTC (permalink / raw)
To: Bhiksha Raj; +Cc: cygwin
On Sun, 12 Jan 2003, Bhiksha Raj wrote:
> Hi All,
>
> Im trying to install TeXmacs on my win98+cygwin laptop.
> First I installed the binaries for guile from the cygwin setup
> (I have XFree and Tex and all associated libs already)
> downloaded TeXmacs sources, ran ./configure and then
> gave a "make".
> I got the blue screen of death (BSD).
> After iterating through several BSDs, I hunted on the web
> and found a site that said that static linkages were a problem with
> the latest guile and that I must install guile 1.4.1. So I uninstalled
> guile,
> downloaded the sources for guile 1.4.1, untarred them and
> ran
> ./configure --disable-shared
>
> It runs through several checks, but never completes - insted it
> gives me at some point it simply gives me the blue screen of death.
> This time around Im not even getting past configure.
>
> Im not sure what to do now.
> Any advice at all would be greatly appreciated.
>
> Much thanks
> Bhiksha
> bhiksha@merl.com
>
> P.S: Ive hunted on the web and faqs for answers and couldnt find
> any.
Bhiksha,
Just two notes: it is unlikely that anyone will answer your post right
away on a weekend, so repeating your posts is only going to annoy people.
Especially if your second post continues an unrelated thread - it's much
better to start a new one, so people with threaded browsers notice your
post. Your second message does have a much more descriptive subject,
though.
For further info, see answers to your original post <http://cygwin.com/ml/cygwin/2003-01/msg00561.html>.
Igor
--
http://cs.nyu.edu/~pechtcha/
|\ _,,,---,,_ pechtcha@cs.nyu.edu
ZZZzz /,`.-'`' -. ;-;;,_ igor@watson.ibm.com
|,4- ) )-,_. ,\ ( `'-' Igor Pechtchanski
'---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow!
Oh, boy, virtual memory! Now I'm gonna make myself a really *big* RAMdisk!
-- /usr/games/fortune
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2]
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Earnie Boyd
2003-01-13 3:30 ` Blue screen of death on cygwin+win98+./configure Bhiksha Raj
@ 2003-01-13 3:30 ` Charles Wilson
1 sibling, 0 replies; 22+ messages in thread
From: Charles Wilson @ 2003-01-13 3:30 UTC (permalink / raw)
To: Earnie Boyd
Cc: Alexandre Duret-Lutz, automake-patches, libtool-patches, cygwin,
mingw-users
[-- Attachment #1: Type: text/plain, Size: 1691 bytes --]
Earnie Boyd wrote:
> Charles Wilson wrote:
>
>>
>> There are two places in ltmain.sh where the shell wrapper is directly
>> sourced. This doesn't work very well, because when both "foo" and
>> "foo.exe" exist, ". ./foo" ends up sourcing "foo.exe" -- which is bad.
>>
>
> This can be resolved by ``. ./foo.'' instead for the cygwin/mingw hosts.
I knew that would work for cygwin, but wasn't sure it would work for
mingw. In that case, this portion of the earlier patch:
@@ -5066,8 +5261,12 @@
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $wrapper ;;
- *) . ./$wrapper ;;
+ */* | *\\*) cp ${wrapper} ${wrapper}-lt.sh
+ . ${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
+ *) cp ./${wrapper} ./${wrapper}-lt.sh
+ . ./${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
esac
# Check the variables that should have been set.
@@ -5097,8 +5296,12 @@
relink_command=
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
+ */* | *\\*) cp ${wrapper} ${wrapper}-lt.sh
+ . ${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
+ *) cp ./${wrapper} ./${wrapper}-lt.sh
+ . ./${wrapper}-lt.sh
+ $rm -f ${wrapper}-lt.sh ;;
esac
outputname=
could be replaced with the attached version, instead (note: attached
file is NOT a complete patch, and hasn't been tested extensively.) The
newer version has the benefit that it avoids the race introduced by the
above. I'm not sure it is advisable to change the definition of
$wrapper itself for cygwin/mingw host, though, so I introduced a new
variable wrapperdot.
--
Chuck
[-- Attachment #2: libtool-relinkexe3partial.patch --]
[-- Type: text/plain, Size: 1145 bytes --]
@@ -5064,10 +5259,17 @@
notinst_deplibs=
relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $host in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}.
+ *) wrapperdot=${wrapper}
+ esac
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $wrapper ;;
- *) . ./$wrapper ;;
+ */* | *\\*) . ${wrapperdot}
+ *) . ./${wrapperdot}
esac
# Check the variables that should have been set.
@@ -5095,10 +5297,17 @@
done
relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $host in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}.
+ *) wrapperdot=${wrapper}
+ esac
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
+ */* | *\\*) . ${wrapperdot}
+ *) . ./${wrapperdot}
esac
outputname=
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem [take 2]
2003-01-13 3:30 ` Alexandre Duret-Lutz
@ 2003-01-13 7:44 ` Charles Wilson
2003-01-13 14:28 ` Solving the "relink exe's" libtool problem [take 3] Charles Wilson
0 siblings, 1 reply; 22+ messages in thread
From: Charles Wilson @ 2003-01-13 7:44 UTC (permalink / raw)
To: Alexandre Duret-Lutz
Cc: automake-patches, libtool-patches, cygwin, mingw-users
Alexandre Duret-Lutz wrote:
> Any way lt-foo.c could go into .libs/? Or just be erased after
> foo.exe has been built? Maybe both?
I see no problems with either or both...but I'd rather keep lt-foo.c
around until 'make clean' (or libtool --mode=clean) time.
> Also I if you don't move `foo' to `.libs/' I think you
> should ensure that `libtool --mode=clean rm -f foo.exe'
> erases `foo'.
Good point. "libtool --mode=clean" won't currently get both of them.
But automake's 'make clean' will (see below).
> (Or does Cygwin's `rm' erase both at once?)
No, it doesn't.
> Right now Automake doesn't use `--mode=clean'. Maybe Automake
> 1.8 could start doing this so we don't have to hardcode this
> sort of knowledge.
Yeah, I think this has come up before...
However, current automake "make clean" will at least attempt to delete
all four of the following, whether they exist or not:
foo
foo.exe
.libs/foo (*)
.libs/foo.exe (*)
(*) by virtue of rm -rf'ing .libs
So, there's really no worry about cleaning up the shell wrapper or the
"real" executable -- or the binary wrapper -- with present automake.
But cleaning up the lt-foo.c file is an issue. I'd prefer to move it
into .libs, but NOT erase it; automake's make clean will "get it" if
it's in .libs (see rm -rf, above)
'Course, transitioning to libtool --mode=clean will mess that up, unless
the problems you mention are addressed...
--Chuck
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem [take 3]
2003-01-13 7:44 ` Charles Wilson
@ 2003-01-13 14:28 ` Charles Wilson
2003-01-20 21:02 ` [Mingw-users] " Earnie Boyd
0 siblings, 1 reply; 22+ messages in thread
From: Charles Wilson @ 2003-01-13 14:28 UTC (permalink / raw)
To: Charles Wilson
Cc: Alexandre Duret-Lutz, automake-patches, libtool-patches, cygwin,
mingw-users
[-- Attachment #1: Type: text/plain, Size: 584 bytes --]
Okay, this version
1) puts lt-foo.c into .libs
2) "libtool --mode=clean" does the right thing --- cleans up foo,
foo.exe, .libs/foo.exe, .libs/lt-foo.c, plus whatever else it already
took care of.
3) lt-foo.c actually passes its own arguments to the shell wrapper -- it
didn't, before. (Oops)
libtool regression tests: no new failures (on cygwin)
briefly tested on another project; worked fine.
Binary packages for cygwin (libtool-devel-20030103-4,
libltdl3-20030103-4) available by pointing setup.exe at
http://www.neuro.gatech.edu/users/cwilson/cygutils/testing/
--Chuck
[-- Attachment #2: libtool-relinkexe3.patch --]
[-- Type: text/plain, Size: 8003 bytes --]
Index: ltmain.in
===================================================================
RCS file: /cvsroot/libtool/libtool/ltmain.in,v
retrieving revision 1.318
diff -u -r1.318 ltmain.in
--- ltmain.in 1 Jan 2003 01:57:47 -0000 1.318
+++ ltmain.in 13 Jan 2003 04:48:39 -0000
@@ -4284,6 +4284,207 @@
outputname=`echo $outputname|${SED} 's,.exe$,,'` ;;
*) exeext= ;;
esac
+ case $host in
+ *cygwin* | *mingw* )
+ cwrappersource=`echo ${objdir}/lt-${output}.c`
+ cwrapper=`echo ${output}.exe`
+ $rm $cwrappersource $cwrapper
+ trap "$rm $cwrappersource $cwrapper; exit 1" 1 2 15
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+#define HAVE_DOS_BASED_FILE_SYSTEM
+#ifndef DIR_SEPARATOR_2
+#define DIR_SEPARATOR_2 '\\'
+#endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+char * basename (const char *name);
+char * fnqualify(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup ((char *) basename (argv[0]));
+ newargz = XMALLOC(char *, argc+2);
+ newargz[0] = xstrdup("/bin/sh");
+ newargz[1] = fnqualify(argv[0]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+ execv("/bin/sh",newargz);
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+char *
+basename (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha (name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return (char *) base;
+}
+
+char *
+fnqualify(const char *path)
+{
+ size_t size;
+ char *p;
+ char tmp[LT_PATHMAX + 1];
+
+ assert(path != NULL);
+
+ /* Is it qualified already? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha (path[0]) && path[1] == ':')
+ return xstrdup (path);
+#endif
+ if (IS_DIR_SEPARATOR (path[0]))
+ return xstrdup (path);
+
+ /* prepend the current directory */
+ /* doesn't handle '~' */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */
+ p = XMALLOC(char, size);
+ sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path);
+ return p;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert(str != NULL);
+ assert(pat != NULL);
+
+ len = strlen(str);
+ patlen = strlen(pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp(str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC -s -o $cwrapper $cwrappersource
+ ;;
+ esac
$rm $output
trap "$rm $output; exit 1" 1 2 15
@@ -5064,10 +5265,17 @@
notinst_deplibs=
relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $host in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $wrapper ;;
- *) . ./$wrapper ;;
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
esac
# Check the variables that should have been set.
@@ -5095,10 +5303,17 @@
done
relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $host in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
esac
outputname=
@@ -5541,15 +5756,31 @@
;;
*)
- # Do a test to see if this is a libtool program.
- if test "$mode" = clean &&
- (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- relink_command=
- . $dir/$file
-
- rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
- if test "$fast_install" = yes && test -n "$relink_command"; then
- rmfiles="$rmfiles $objdir/lt-$name"
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`echo $file|${SED} 's,.exe$,,'`
+ noexename=`echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$file
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
fi
fi
;;
[-- Attachment #3: libtool-relinkexe3.changelog --]
[-- Type: text/plain, Size: 349 bytes --]
2003-01-12 Charles Wilson <cwilson@ece.gatech.edu>
* ltmain.in: add code for a binary wrapper
to use with uninstalled executables on cygwin/mingw.
Make sure that --mode=clean gets shell wrapper and
binary wrapper. When sourcing the shell wrapper,
invoke using a terminal `.' on cygwin/mingw to
avoid the automatic append-.exe behavior.
[-- Attachment #4: Type: text/plain, Size: 214 bytes --]
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 3]
2003-01-13 14:28 ` Solving the "relink exe's" libtool problem [take 3] Charles Wilson
@ 2003-01-20 21:02 ` Earnie Boyd
2003-01-20 21:02 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem[take 3] Bruce Korb
0 siblings, 1 reply; 22+ messages in thread
From: Earnie Boyd @ 2003-01-20 21:02 UTC (permalink / raw)
To: Charles Wilson
Cc: Alexandre Duret-Lutz, automake-patches, libtool-patches, cygwin,
mingw-users, libtool
This patch passes my test. What do we need to do to get this accepted
into libtool cvs HEAD?
Earnie.
Charles Wilson wrote:
> Okay, this version
>
> 1) puts lt-foo.c into .libs
>
> 2) "libtool --mode=clean" does the right thing --- cleans up foo,
> foo.exe, .libs/foo.exe, .libs/lt-foo.c, plus whatever else it already
> took care of.
>
> 3) lt-foo.c actually passes its own arguments to the shell wrapper -- it
> didn't, before. (Oops)
>
> libtool regression tests: no new failures (on cygwin)
> briefly tested on another project; worked fine.
>
> Binary packages for cygwin (libtool-devel-20030103-4,
> libltdl3-20030103-4) available by pointing setup.exe at
> http://www.neuro.gatech.edu/users/cwilson/cygutils/testing/
>
> --Chuck
>
>
> ------------------------------------------------------------------------
>
> Index: ltmain.in
> ===================================================================
> RCS file: /cvsroot/libtool/libtool/ltmain.in,v
> retrieving revision 1.318
> diff -u -r1.318 ltmain.in
> --- ltmain.in 1 Jan 2003 01:57:47 -0000 1.318
> +++ ltmain.in 13 Jan 2003 04:48:39 -0000
> @@ -4284,6 +4284,207 @@
> outputname=`echo $outputname|${SED} 's,.exe$,,'` ;;
> *) exeext= ;;
> esac
> + case $host in
> + *cygwin* | *mingw* )
> + cwrappersource=`echo ${objdir}/lt-${output}.c`
> + cwrapper=`echo ${output}.exe`
> + $rm $cwrappersource $cwrapper
> + trap "$rm $cwrappersource $cwrapper; exit 1" 1 2 15
> +
> + cat > $cwrappersource <<EOF
> +
> +/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
> + Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
> +
> + The $output program cannot be directly executed until all the libtool
> + libraries that it depends on are installed.
> +
> + This wrapper executable should never be moved out of the build directory.
> + If it is, it will not operate correctly.
> +
> + Currently, it simply execs the wrapper *script* "/bin/sh $output",
> + but could eventually absorb all of the scripts functionality and
> + exec $objdir/$outputname directly.
> +*/
> +EOF
> + cat >> $cwrappersource<<"EOF"
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <malloc.h>
> +#include <stdarg.h>
> +#include <assert.h>
> +
> +#if defined(PATH_MAX)
> +# define LT_PATHMAX PATH_MAX
> +#elif defined(MAXPATHLEN)
> +# define LT_PATHMAX MAXPATHLEN
> +#else
> +# define LT_PATHMAX 1024
> +#endif
> +
> +#ifndef DIR_SEPARATOR
> +#define DIR_SEPARATOR '/'
> +#endif
> +
> +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
> + defined (__OS2__)
> +#define HAVE_DOS_BASED_FILE_SYSTEM
> +#ifndef DIR_SEPARATOR_2
> +#define DIR_SEPARATOR_2 '\\'
> +#endif
> +#endif
> +
> +#ifndef DIR_SEPARATOR_2
> +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
> +#else /* DIR_SEPARATOR_2 */
> +# define IS_DIR_SEPARATOR(ch) \
> + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
> +#endif /* DIR_SEPARATOR_2 */
> +
> +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
> +#define XFREE(stale) do { \
> + if (stale) { free ((void *) stale); stale = 0; } \
> +} while (0)
> +
> +const char *program_name = NULL;
> +
> +void * xmalloc (size_t num);
> +char * xstrdup (const char *string);
> +char * basename (const char *name);
> +char * fnqualify(const char *path);
> +char * strendzap(char *str, const char *pat);
> +void lt_fatal (const char *message, ...);
> +
> +int
> +main (int argc, char *argv[])
> +{
> + char **newargz;
> + int i;
> +
> + program_name = (char *) xstrdup ((char *) basename (argv[0]));
> + newargz = XMALLOC(char *, argc+2);
> + newargz[0] = xstrdup("/bin/sh");
> + newargz[1] = fnqualify(argv[0]);
> + /* we know the script has the same name, without the .exe */
> + /* so make sure newargz[1] doesn't end in .exe */
> + strendzap(newargz[1],".exe");
> + for (i = 1; i < argc; i++)
> + newargz[i+1] = xstrdup(argv[i]);
> + newargz[argc+1] = NULL;
> + execv("/bin/sh",newargz);
> +}
> +
> +void *
> +xmalloc (size_t num)
> +{
> + void * p = (void *) malloc (num);
> + if (!p)
> + lt_fatal ("Memory exhausted");
> +
> + return p;
> +}
> +
> +char *
> +xstrdup (const char *string)
> +{
> + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
> +;
> +}
> +
> +char *
> +basename (const char *name)
> +{
> + const char *base;
> +
> +#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
> + /* Skip over the disk name in MSDOS pathnames. */
> + if (isalpha (name[0]) && name[1] == ':')
> + name += 2;
> +#endif
> +
> + for (base = name; *name; name++)
> + if (IS_DIR_SEPARATOR (*name))
> + base = name + 1;
> + return (char *) base;
> +}
> +
> +char *
> +fnqualify(const char *path)
> +{
> + size_t size;
> + char *p;
> + char tmp[LT_PATHMAX + 1];
> +
> + assert(path != NULL);
> +
> + /* Is it qualified already? */
> +#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
> + if (isalpha (path[0]) && path[1] == ':')
> + return xstrdup (path);
> +#endif
> + if (IS_DIR_SEPARATOR (path[0]))
> + return xstrdup (path);
> +
> + /* prepend the current directory */
> + /* doesn't handle '~' */
> + if (getcwd (tmp, LT_PATHMAX) == NULL)
> + lt_fatal ("getcwd failed");
> + size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */
> + p = XMALLOC(char, size);
> + sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path);
> + return p;
> +}
> +
> +char *
> +strendzap(char *str, const char *pat)
> +{
> + size_t len, patlen;
> +
> + assert(str != NULL);
> + assert(pat != NULL);
> +
> + len = strlen(str);
> + patlen = strlen(pat);
> +
> + if (patlen <= len)
> + {
> + str += len - patlen;
> + if (strcmp(str, pat) == 0)
> + *str = '\0';
> + }
> + return str;
> +}
> +
> +static void
> +lt_error_core (int exit_status, const char * mode,
> + const char * message, va_list ap)
> +{
> + fprintf (stderr, "%s: %s: ", program_name, mode);
> + vfprintf (stderr, message, ap);
> + fprintf (stderr, ".\n");
> +
> + if (exit_status >= 0)
> + exit (exit_status);
> +}
> +
> +void
> +lt_fatal (const char *message, ...)
> +{
> + va_list ap;
> + va_start (ap, message);
> + lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
> + va_end (ap);
> +}
> +EOF
> + # we should really use a build-platform specific compiler
> + # here, but OTOH, the wrappers (shell script and this C one)
> + # are only useful if you want to execute the "real" binary.
> + # Since the "real" binary is built for $host, then this
> + # wrapper might as well be built for $host, too.
> + $run $LTCC -s -o $cwrapper $cwrappersource
> + ;;
> + esac
> $rm $output
> trap "$rm $output; exit 1" 1 2 15
>
> @@ -5064,10 +5265,17 @@
> notinst_deplibs=
> relink_command=
>
> + # To insure that "foo" is sourced, and not "foo.exe",
> + # finese the cygwin/MSYS system by explicitly sourcing "foo."
> + # which disallows the automatic-append-.exe behavior.
> + case $host in
> + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
> + *) wrapperdot=${wrapper} ;;
> + esac
> # If there is no directory component, then add one.
> case $file in
> - */* | *\\*) . $wrapper ;;
> - *) . ./$wrapper ;;
> + */* | *\\*) . ${wrapperdot} ;;
> + *) . ./${wrapperdot} ;;
> esac
>
> # Check the variables that should have been set.
> @@ -5095,10 +5303,17 @@
> done
>
> relink_command=
> + # To insure that "foo" is sourced, and not "foo.exe",
> + # finese the cygwin/MSYS system by explicitly sourcing "foo."
> + # which disallows the automatic-append-.exe behavior.
> + case $host in
> + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
> + *) wrapperdot=${wrapper} ;;
> + esac
> # If there is no directory component, then add one.
> case $file in
> - */* | *\\*) . $file ;;
> - *) . ./$file ;;
> + */* | *\\*) . ${wrapperdot} ;;
> + *) . ./${wrapperdot} ;;
> esac
>
> outputname=
> @@ -5541,15 +5756,31 @@
> ;;
>
> *)
> - # Do a test to see if this is a libtool program.
> - if test "$mode" = clean &&
> - (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
> - relink_command=
> - . $dir/$file
> -
> - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
> - if test "$fast_install" = yes && test -n "$relink_command"; then
> - rmfiles="$rmfiles $objdir/lt-$name"
> + if test "$mode" = clean ; then
> + noexename=$name
> + case $file in
> + *.exe)
> + file=`echo $file|${SED} 's,.exe$,,'`
> + noexename=`echo $name|${SED} 's,.exe$,,'`
> + # $file with .exe has already been added to rmfiles,
> + # add $file without .exe
> + rmfiles="$rmfiles $file"
> + ;;
> + esac
> + # Do a test to see if this is a libtool program.
> + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
> + relink_command=
> + . $dir/$file
> +
> + # note $name still contains .exe if it was in $file originally
> + # as does the version of $file that was added into $rmfiles
> + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
> + if test "$fast_install" = yes && test -n "$relink_command"; then
> + rmfiles="$rmfiles $objdir/lt-$name"
> + fi
> + if test "X$noexename" != "X$name" ; then
> + rmfiles="$rmfiles $objdir/lt-${noexename}.c"
> + fi
> fi
> fi
> ;;
>
>
> ------------------------------------------------------------------------
>
> 2003-01-12 Charles Wilson <cwilson@ece.gatech.edu>
>
> * ltmain.in: add code for a binary wrapper
> to use with uninstalled executables on cygwin/mingw.
> Make sure that --mode=clean gets shell wrapper and
> binary wrapper. When sourcing the shell wrapper,
> invoke using a terminal `.' on cygwin/mingw to
> avoid the automatic append-.exe behavior.
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem[take 3]
2003-01-20 21:02 ` [Mingw-users] " Earnie Boyd
@ 2003-01-20 21:02 ` Bruce Korb
2003-01-21 4:54 ` Charles Wilson
0 siblings, 1 reply; 22+ messages in thread
From: Bruce Korb @ 2003-01-20 21:02 UTC (permalink / raw)
To: Earnie Boyd
Cc: Charles Wilson, automake-patches, libtool-patches, mingw-users,
libtool, Alexandre Duret-Lutz, cygwin
Earnie Boyd wrote:
>
> This patch passes my test. What do we need to do to get this accepted
> into libtool cvs HEAD?
> > + newargz[0] = xstrdup("/bin/sh");
This may not be the shell and there is no point allocating it.
It is fine to use it from static memory.
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem[take 3]
2003-01-20 21:02 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem[take 3] Bruce Korb
@ 2003-01-21 4:54 ` Charles Wilson
2003-01-21 5:53 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem[take3] Bruce Korb
0 siblings, 1 reply; 22+ messages in thread
From: Charles Wilson @ 2003-01-21 4:54 UTC (permalink / raw)
To: Bruce Korb
Cc: Earnie Boyd, automake-patches, libtool-patches, mingw-users,
libtool, Alexandre Duret-Lutz, cygwin
Bruce Korb wrote:
> Earnie Boyd wrote:
>
>>This patch passes my test. What do we need to do to get this accepted
>>into libtool cvs HEAD?
>
>
>>>+ newargz[0] = xstrdup("/bin/sh");
>>
>
> This may not be the shell and there is no point allocating it.
> It is fine to use it from static memory.
Okay, the second comment (use static string, not allocated memory) is
easy enough. But what's the best way to use "the shell"? Do a unquoted
replacement (<<EOF, not <<"EOF") e.g.
...
newargz = XMALLOC(char *, argc+2);
EOF
$echo >> $cwrappersource <<EOF
newargz[0] = \"$SHELL\";
EOF
$echo >> $cwrappersource <<"EOF"
newargz[1] = fnqualify(argv[0]);
...
?
--Chuck
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem[take3]
2003-01-21 4:54 ` Charles Wilson
@ 2003-01-21 5:53 ` Bruce Korb
2003-01-21 8:26 ` Charles Wilson
0 siblings, 1 reply; 22+ messages in thread
From: Bruce Korb @ 2003-01-21 5:53 UTC (permalink / raw)
To: Charles Wilson
Cc: Bruce Korb, Earnie Boyd, automake-patches, libtool-patches,
mingw-users, libtool, Alexandre Duret-Lutz, cygwin
Charles Wilson wrote:
>
> Bruce Korb wrote:
> > Earnie Boyd wrote:
> >
> >>This patch passes my test. What do we need to do to get this accepted
> >>into libtool cvs HEAD?
> >
> >
> >>>+ newargz[0] = xstrdup("/bin/sh");
> >>
> >
> > This may not be the shell and there is no point allocating it.
> > It is fine to use it from static memory.
>
> Okay, the second comment (use static string, not allocated memory) is
I wouldn't have mentioned the static string by itself ;-)
> easy enough. But what's the best way to use "the shell"? Do a unquoted
> replacement (<<EOF, not <<"EOF") e.g.
Yes.
Somewhere, buried in the configury stuff is an environment
variable named something like, "CONFIG_SHELL". That's what
you want. If it is not available, then imitating the techniques
used to obtain it by configure should be used.
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Mingw-users] Re: Solving the "relink exe's" libtool problem[take3]
2003-01-21 5:53 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem[take3] Bruce Korb
@ 2003-01-21 8:26 ` Charles Wilson
2003-01-21 8:41 ` Solving the "relink exe's" libtool problem[take4] Charles Wilson
0 siblings, 1 reply; 22+ messages in thread
From: Charles Wilson @ 2003-01-21 8:26 UTC (permalink / raw)
To: bkorb; +Cc: automake-patches, libtool-patches, mingw-users, cygwin
>>easy enough. But what's the best way to use "the shell"? Do a unquoted
>>replacement (<<EOF, not <<"EOF") e.g.
>
> Yes.
>
> Somewhere, buried in the configury stuff is an environment
> variable named something like, "CONFIG_SHELL". That's what
> you want. If it is not available, then imitating the techniques
> used to obtain it by configure should be used.
But lt-foo.c is created by the libtool script itself -- and libtool
already knows that $SHELL == /bin/sh or /bin/bash or whatever. libtool
uses the same method I described when creating the shell wrapper:
$echo > $output "\
#! $SHELL
# $output - temporary wrapper script for $objdir/$outputname
...
So I really don't need to worry about $CONFIG_SHELL or imitating
configure, do I? I can just use $SHELL.
--Chuck
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem[take4]
2003-01-21 8:26 ` Charles Wilson
@ 2003-01-21 8:41 ` Charles Wilson
2003-01-28 23:29 ` Boehne, Robert
0 siblings, 1 reply; 22+ messages in thread
From: Charles Wilson @ 2003-01-21 8:41 UTC (permalink / raw)
Cc: libtool-patches, mingw-users, cygwin
[-- Attachment #1: Type: text/plain, Size: 865 bytes --]
[dropped automake-patches from the CC: list; this discuession has long
since ceased involving automake]
This version addresses the two issues raised by Bruce: using the shell
that is appropriate for the platform, as determined during configure
(since that is how the libtool variable $SHELL is assigned), and using a
static string constant instead of dynamically allocating storage --
since we know before compile time what the value of the string will be
(/bin/sh or /bin/bash or whatever).
I really feel like we're in nitpick mode here. If there are no
*substantive* objections, can we check THIS version in? And then clean
up the additional nitpicks, if any, as additional patches?
The only difference between this patch and the previous one is in the
main() function, and the patch as a whole has been regenerated against
current CVS.
--Chuck
[-- Attachment #2: libtool-relinkexe4.changelog --]
[-- Type: text/plain, Size: 348 bytes --]
2003-01-21 Charles Wilson <cwilson@ece.gatech.edu>
* ltmain.in: add code for a binary wrapper
to use with uninstalled executables on cygwin/mingw.
Make sure that --mode=clean gets shell wrapper and
binary wrapper. When sourcing the shell wrapper,
invoke using a terminal `.' on cygwin/mingw to
avoid the automatic append-.exe behavior.
[-- Attachment #3: libtool-relinkexe4.patch --]
[-- Type: text/plain, Size: 8169 bytes --]
Index: ltmain.in
===================================================================
RCS file: /cvsroot/libtool/libtool/ltmain.in,v
retrieving revision 1.320
diff -u -u -r1.320 ltmain.in
--- ltmain.in 15 Jan 2003 02:55:34 -0000 1.320
+++ ltmain.in 21 Jan 2003 04:01:39 -0000
@@ -4291,6 +4291,219 @@
outputname=`echo $outputname|${SED} 's,.exe$,,'` ;;
*) exeext= ;;
esac
+ case $host in
+ *cygwin* | *mingw* )
+ cwrappersource=`echo ${objdir}/lt-${output}.c`
+ cwrapper=`echo ${output}.exe`
+ $rm $cwrappersource $cwrapper
+ trap "$rm $cwrappersource $cwrapper; exit 1" 1 2 15
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+#define HAVE_DOS_BASED_FILE_SYSTEM
+#ifndef DIR_SEPARATOR_2
+#define DIR_SEPARATOR_2 '\\'
+#endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+char * basename (const char *name);
+char * fnqualify(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup ((char *) basename (argv[0]));
+ newargz = XMALLOC(char *, argc+2);
+EOF
+
+ cat >> $cwrappersource <<EOF
+ newargz[0] = "$SHELL";
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+ newargz[1] = fnqualify(argv[0]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+EOF
+
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",newargz);
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+char *
+basename (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha (name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return (char *) base;
+}
+
+char *
+fnqualify(const char *path)
+{
+ size_t size;
+ char *p;
+ char tmp[LT_PATHMAX + 1];
+
+ assert(path != NULL);
+
+ /* Is it qualified already? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha (path[0]) && path[1] == ':')
+ return xstrdup (path);
+#endif
+ if (IS_DIR_SEPARATOR (path[0]))
+ return xstrdup (path);
+
+ /* prepend the current directory */
+ /* doesn't handle '~' */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */
+ p = XMALLOC(char, size);
+ sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path);
+ return p;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert(str != NULL);
+ assert(pat != NULL);
+
+ len = strlen(str);
+ patlen = strlen(pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp(str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC -s -o $cwrapper $cwrappersource
+ ;;
+ esac
$rm $output
trap "$rm $output; exit 1" 1 2 15
@@ -5071,10 +5284,17 @@
notinst_deplibs=
relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $host in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $wrapper ;;
- *) . ./$wrapper ;;
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
esac
# Check the variables that should have been set.
@@ -5102,10 +5322,17 @@
done
relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $host in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
# If there is no directory component, then add one.
case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
esac
outputname=
@@ -5548,15 +5775,31 @@
;;
*)
- # Do a test to see if this is a libtool program.
- if test "$mode" = clean &&
- (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- relink_command=
- . $dir/$file
-
- rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
- if test "$fast_install" = yes && test -n "$relink_command"; then
- rmfiles="$rmfiles $objdir/lt-$name"
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`echo $file|${SED} 's,.exe$,,'`
+ noexename=`echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$file
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
fi
fi
;;
[-- Attachment #4: Type: text/plain, Size: 214 bytes --]
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem[take4]
2003-01-21 8:41 ` Solving the "relink exe's" libtool problem[take4] Charles Wilson
@ 2003-01-28 23:29 ` Boehne, Robert
2003-01-29 9:14 ` Charles Wilson
0 siblings, 1 reply; 22+ messages in thread
From: Boehne, Robert @ 2003-01-28 23:29 UTC (permalink / raw)
To: Charles Wilson; +Cc: libtool-patches, cygwin, mingw-users
Charles,
Since I haven't heard any complaints about this patch, I'll
assume the Cygwin people are OK with it, and check it in.
Thanks,
Robert
--
Robert Boehne Software Engineer
Ricardo Software Chicago Technical Center
TEL: (630)789-0003 x. 238
FAX: (630)789-0127
email: rboehne AT ricardo-us DOT com
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Solving the "relink exe's" libtool problem[take4]
2003-01-28 23:29 ` Boehne, Robert
@ 2003-01-29 9:14 ` Charles Wilson
0 siblings, 0 replies; 22+ messages in thread
From: Charles Wilson @ 2003-01-29 9:14 UTC (permalink / raw)
To: Boehne, Robert; +Cc: libtool-patches, cygwin, mingw-users
Boehne, Robert wrote:
> Charles,
>
> Since I haven't heard any complaints about this patch, I'll
> assume the Cygwin people are OK with it, and check it in.
Thanks. Looks good here (cygwin), causes no problems on non-windows
(linux), and Earnie is happy with it on mingw. So go for it.
--Chuck
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2003-01-28 23:52 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-01-13 3:04 Solving the "relink exe's" libtool problem Charles Wilson
2003-01-13 3:04 ` [Mingw-users] " Michael Bester
2003-01-13 3:30 ` Alexandre Duret-Lutz
2003-01-13 3:30 ` Charles Wilson
2003-01-13 3:30 ` [Mingw-users] " Earnie Boyd
2003-01-13 3:30 ` Alexandre Duret-Lutz
2003-01-13 3:30 ` Solving the "relink exe's" libtool problem [take 2] Charles Wilson
2003-01-13 3:30 ` Alexandre Duret-Lutz
2003-01-13 7:44 ` Charles Wilson
2003-01-13 14:28 ` Solving the "relink exe's" libtool problem [take 3] Charles Wilson
2003-01-20 21:02 ` [Mingw-users] " Earnie Boyd
2003-01-20 21:02 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem[take 3] Bruce Korb
2003-01-21 4:54 ` Charles Wilson
2003-01-21 5:53 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem[take3] Bruce Korb
2003-01-21 8:26 ` Charles Wilson
2003-01-21 8:41 ` Solving the "relink exe's" libtool problem[take4] Charles Wilson
2003-01-28 23:29 ` Boehne, Robert
2003-01-29 9:14 ` Charles Wilson
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Earnie Boyd
2003-01-13 3:30 ` Blue screen of death on cygwin+win98+./configure Bhiksha Raj
2003-01-13 3:30 ` Igor Pechtchanski
2003-01-13 3:30 ` [Mingw-users] Re: Solving the "relink exe's" libtool problem [take 2] Charles Wilson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).