Ralf Wildenhues wrote: > See above for the two cases. With them fixed, I think the patch looks > to be in fairly good shape, except that shell quoting bugs are really > hard to detect when reading the doubly-quoted code. So please fix > above, resend, and apply if you don't hear back after 72 hours.
Squashed together and reposted from: http://lists.gnu.org/archive/html/libtool-patches/2009-12/msg00015.html and followon http://lists.gnu.org/archive/html/libtool-patches/2010-01/msg00048.html with more additions arising from Ralf's further comments this week: * libltdl/config/ltmain.m4sh (func_emit_wrapper_impl): Renamed to... (func_emit_wrapper): This. Old version removed. (func_parse_lt_options, func_lt_dump_args, func_exec_program_core): Use $LINENO, not @@LINENO@@. (func_opts_contain_lt): Removed. (func_exec_program): Rewrite to avoid forks and requoting. This (combination) was the second of the two patches whose /first/ 72hour rule invocation was here: http://lists.gnu.org/archive/html/libtool-patches/2010-02/msg00003.html Starting a new clock. No regressions attributable to these changes, on cygwin or mingw. No test failures at all on linux. Consolidated changelog: 2010-02-18 Charles Wilson <...> Add --lt-* options to shell wrapper * libltdl/config/ltmain.m4sh (func_emit_wrapper): Call func_parse_lt_options early. Use func_exec_program. (func_emit_wrapper:func_parse_lt_options): New function. (func_emit_wrapper:func_lt_dump_args): New function. (func_emit_wrapper:func_exec_program_core): New function. (func_emit_wrapper:func_exec_program): New function. Test results: It does not appear that there were any regressions caused by THESE changes. There are a few items that need investigation, but...later. cygwin ====================================================================== All old tests passed. New tests: 48: deplib in subdir FAILED (deplib-in-subdir.at:140) 69: dlloader API FAILED (dlloader-api.at:416) 92: C++ exception handling FAILED (exceptions.at:254) 102: Run tests with low max_cmd_len FAILED (cmdline_wrap.at:43) 048: ---------------------------------- libtool: install: cp .libs/m3.exe .../tests/testsuite.dir/048/inst/bin/m3.exe ../../libtool/tests/deplib-in-subdir.at:140: $LIBTOOL --mode=clean rm -f sub1/liba1.la sub1/liba2.la sub1/liba3.la sub2/subsub/libb1.la sub2/subsub/libb2.la sub2/subsub/libb3.la sub3/subsub/m1$EXEEXT sub3/subsub/m2$EXEEXT sub3/subsub/m3$EXEEXT stderr: .../libtool: line 1693: sub3/subsub/sub3/subsub/.libs/m1_ltshwrapper: No such file or directory in func_mode_uninstall, func_ltwrapper_scriptname_result is wrong because objdir has been reset to be fullpathto, rather than just .libs, before call to func_ltwrapper_scriptname. So, when trying to source the script, it dies. 069: ---------------------------------- who knows, but it's somewhere in libltdl not libtool --- expout 2010-02-18 03:12:56.231600000 -0500 +++ .../tests/testsuite.dir/at-groups/69/stdout 2010-02-18 03:13:09.261600000 -0500 @@ -9,11 +9,7 @@ first_open denies a request result: module_symbol first_open denies a request -last_open ("last"): last_ctx -last_sym (last): last_ctx -result: last_symbol -first_open denies a request last_open denies a request +lt_dlopen failed: file not found first_exit: first_ctx -last_close (last): last_ctx last_exit: last_ctx 092: ---------------------------------- segfault in executable. Pretty sure this isn't a problem in ltmain.m4sh test "X$host" != "X$build" && test -x "$lt_exe" && exit 77; exit $lt_status; fi stderr: exceptions_in_prog caught: exception in program exceptions_in_lib caught inside lib: exception in library caught: exception from library exceptions_in_module caught inside module: exception in module caught: exception from module .../tests/testsuite.dir/at-groups/92/test-source: line 377: 5920 Segmentation fault (core dumped) $LIBTOOL --mode=execute -dlopen m/module.la "$lt_exe" stdout: ../../libtool/tests/exceptions.at:254: exit code was 139, expected 0 102: ---------------------------------- low max_cmd_len: repeat of above errs mingw: ====================================================================== FAIL: tests/tagdemo-make.test FAIL: tests/tagdemo-make.test FAIL: tests/tagdemo-make.test FAIL: tests/tagdemo-make.test 27: C++ convenience archives FAILED (convenience.at:99) 48: deplib in subdir FAILED (deplib-in-subdir.at:140) 62: C++ subdir-objects FAILED (am-subdir.at:148) 89: (C++ template tests):simple template test FAILED (template.at:89) 90: (C++ template tests):template test with subdirs FAILED (template.at:241) 91: C++ static constructors FAILED (ctor.at:62) 92: C++ exception handling FAILED (exceptions.at:242) 102: Run tests with low max_cmd_len FAILED (cmdline_wrap.at:43) Basically, it appears that C++ support is borked on MinGW, because all of the failures except #48 are c++ related. It has something to do with the new 4.4.0 compiler, which ships the import library for the C++ runtime as libstdc++_s.a, but the .la file shipped with gcc claims that library_names='libstdc++.dll.a'. This is really a packaging bug in MinGW's g++, but the fix is not simple. Unlike cygwin, in which the default linking behavior and default runtime usage agree (ld prefers .dll.a, and gcc prefers to link to dynamic runtimes) -- mingw-gcc and mingw-ld disagree on the proper default behavior with regards to the runtime libs. mingw-ld prefers .dll.a, but mingw-gcc defaults to -static-libstdc++. To make this work (in the absence of libtool), the import library is given a non-standard name (libstdc++_s.a). Cygwin shows (showed?) similar issues with you tried to mix -static-libstdc++ with libtool. Anyway, fixing that is beyond the scope of this patch. The only remaining test failure is the #48, which fails for the same reasons as described above. Linux: ====================================================================== All test passed, in both the old and new testsuites.
diff --git a/libltdl/config/ltmain.m4sh b/libltdl/config/ltmain.m4sh index 4549023..85cc110 100644 --- a/libltdl/config/ltmain.m4sh +++ b/libltdl/config/ltmain.m4sh @@ -2407,7 +2407,110 @@ func_fallback_echo () _LTECHO_EOF' } ECHO=\"$qECHO\" - fi\ + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\...@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\...@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\...@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\...@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\...@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done + func_exec_program_core \${1+\"\...@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\...@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` @@ -2520,24 +2623,7 @@ _LTECHO_EOF' $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - exec \"\$progdir\\\\\$program\" \${1+\"\...@\"} -" - ;; - - *) - $ECHO "\ - exec \"\$progdir/\$program\" \${1+\"\...@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 + func_exec_program \${1+\"\...@\"} fi else # The program doesn't exist.