Charles Wilson wrote: > Ralf Wildenhues wrote: >> * Charles Wilson wrote on Mon, Jun 22, 2009 at 03:50:42AM CEST: >>> * libltdl/config/ltmain.m4sh (func_emit_cwrapperexe_src) >>> [ltwrapper_debugprintf]: Renamed to... >> I think functions should still be put in (parens) in the ChangeLog >> entry, not in [brackets], according to GCS. [... other review comments ...]
Okay, here's a followon patch to "Enable runtime cwrapper debugging; add tests" http://lists.gnu.org/archive/html/libtool-patches/2009-12/msg00014.html The first patch, in addition to addressing various points raised in this thread, obsoletes the "extra" mingw fix: http://lists.gnu.org/archive/html/libtool-patches/2009-12/msg00017.html Assuming these two patches are approved, I'll squash them together into a single commit (and update the commit history) before pushing. I just figured it was easier to review, by presenting the response to the review comments separately. I haven't done a full test run; but I have tested a few of the old tests and the cwrapper.at tests individually, with this change. Full test run on both cygwin and linux in progress [*] This sequence doesn't address the issue with regards to the /shell/ wrapper failing to pass the cwrapper tests (for instance, on linux). I've got a followon patch to "Re: [PATCH] Add --lt-* options to shell wrapper" http://lists.gnu.org/archive/html/libtool-patches/2009-12/msg00015.html which addresses that issue and will post it shortly, but we should discuss that in the other thread. [*] Testing with these two patches, plus the two shell wrapper patches referenced above, plus the wrapper documentation patch: http://lists.gnu.org/archive/html/libtool-patches/2009-12/msg00016.html ... actually, the linux test already finished. Results: Old: All 94 tests passed New: Only two unexpected results (in particular, the cwrapper test passed) 21: passing CXX flags through libtool FAILED (flags.at:24) 100: Run tests with low max_cmd_len FAILED (cmdline_wrap.at:43) Err.. 21 should have been skipped, because I haven't installed g++ on the linux box yet. And 100 is just a repeat of 21. -- Chuck
Update cwrapper and tests per review comments * libltdl/config/ltmain.m4sh (func_emit_cwrapperexe_src): Update comments. Initialize program_name. Eliminate _LENGTH variables for string constants. In debug mode, print a banner with known content before any other output. (func_emit_cwrapperexe_src:main): Use strcmp rather than strncmp, where safe. (func_emit_cwrapperexe_src:lt_debugprintf): Modify signature and implementation to conform to GCS. (func_emit_cwrapperexe_src:lt_fatal): Ditto. (func_emit_cwrapperexe_src:lt_error_core): Ditto. (func_emit_cwrapperexe_src): Update all callers to lt_fatal and lt_debugprintf. * tests/cwrapper.at: Clarify comments. Avoid unnecessarily copying libtool. Adjust debug tests to search for wrapper script banner message.
diff --git a/libltdl/config/ltmain.m4sh b/libltdl/config/ltmain.m4sh index f09b323..4549023 100644 --- a/libltdl/config/ltmain.m4sh +++ b/libltdl/config/ltmain.m4sh @@ -2727,10 +2727,6 @@ func_emit_cwrapperexe_src () 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* "$SHELL $output", - but could eventually absorb all of the scripts functionality and - exec $objdir/$outputname directly. */ EOF cat <<"EOF" @@ -2861,7 +2857,7 @@ static int lt_debug = 1; static int lt_debug = 0; #endif -const char *program_name = NULL; +const char *program_name = "wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); @@ -2871,15 +2867,14 @@ char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *fmt, ...); -void lt_fatal (const char *message, ...); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); - EOF cat <<EOF @@ -2925,16 +2920,10 @@ EOF cat <<"EOF" #define LTWRAPPER_OPTION_PREFIX "--lt-" -#define LTWRAPPER_OPTION_PREFIX_LENGTH 5 -static const size_t opt_prefix_len = LTWRAPPER_OPTION_PREFIX_LENGTH; static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; - static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; -static const size_t dumpscript_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11; - static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; -static const size_t debug_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 5; int main (int argc, char *argv[]) @@ -2960,7 +2949,7 @@ main (int argc, char *argv[]) newargc=0; for (i = 1; i < argc; i++) { - if (strncmp (argv[i], dumpscript_opt, dumpscript_opt_len) == 0) + if (strcmp (argv[i], dumpscript_opt) == 0) { EOF case "$host" in @@ -2974,12 +2963,12 @@ EOF lt_dump_script (stdout); return 0; } - if (strncmp (argv[i], debug_opt, debug_opt_len) == 0) + if (strcmp (argv[i], debug_opt) == 0) { lt_debug = 1; continue; } - if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0) + if (strcmp (argv[i], ltwrapper_option_prefix) == 0) { /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX namespace, but it is not one of the ones we know about and @@ -2990,7 +2979,8 @@ EOF need to make LTWRAPPER_OPTION_PREFIX a configure-time option or a configure.ac-settable value. */ - lt_fatal ("Unrecognized option in %s namespace: '%s'", + lt_fatal (__FILE__, __LINE__, + "Unrecognized %s option: '%s'", ltwrapper_option_prefix, argv[i]); } /* otherwise ... */ @@ -2998,18 +2988,25 @@ EOF } newargz[++newargc] = NULL; +EOF + cat <<EOF /* first use of lt_debugprintf AFTER parsing options */ - lt_debugprintf ("(main) argv[0] : %s\n", argv[0]); - lt_debugprintf ("(main) program_name : %s\n", program_name); + lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n"); +EOF + cat <<"EOF" + lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); + lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); tmp_pathspec = find_executable (argv[0]); if (tmp_pathspec == NULL) - lt_fatal ("Couldn't find %s", argv[0]); - lt_debugprintf ("(main) found exe (before symlink chase) at : %s\n", + lt_fatal (__FILE__, __LINE__, "Couldn't find %s", argv[0]); + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (before symlink chase) at: %s\n", tmp_pathspec); actual_cwrapper_path = chase_symlinks (tmp_pathspec); - lt_debugprintf ("(main) found exe (after symlink chase) at : %s\n", + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (after symlink chase) at: %s\n", actual_cwrapper_path); XFREE (tmp_pathspec); @@ -3031,7 +3028,8 @@ EOF target_name = tmp_pathspec; tmp_pathspec = 0; - lt_debugprintf ("(main) libtool target name: %s\n", + lt_debugprintf (__FILE__, __LINE__, + "(main) libtool target name: %s\n", target_name); EOF @@ -3085,10 +3083,12 @@ EOF lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); - lt_debugprintf ("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")); + lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", + (lt_argv_zero ? lt_argv_zero : "<NULL>")); for (i = 0; i < newargc; i++) { - lt_debugprintf ("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")); + lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", + i, (newargz[i] ? newargz[i] : "<NULL>")); } EOF @@ -3102,7 +3102,9 @@ EOF if (rval == -1) { /* failed to start process */ - lt_debugprintf ("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno); + lt_debugprintf (__FILE__, __LINE__, + "(main) failed to launch target \"%s\": errno = %d\n", + lt_argv_zero, errno); return 127; } return rval; @@ -3124,7 +3126,7 @@ xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) - lt_fatal ("Memory exhausted"); + lt_fatal (__FILE__, __LINE__, "Memory exhausted"); return p; } @@ -3158,7 +3160,7 @@ check_executable (const char *path) { struct stat st; - lt_debugprintf ("(check_executable) : %s\n", + lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); if ((!path) || (!*path)) return 0; @@ -3176,7 +3178,7 @@ make_executable (const char *path) int rval = 0; struct stat st; - lt_debugprintf ("(make_executable) : %s\n", + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); if ((!path) || (!*path)) return 0; @@ -3203,7 +3205,7 @@ find_executable (const char *wrapper) int tmp_len; char *concat_name; - lt_debugprintf ("(find_executable) : %s\n", + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); if ((wrapper == NULL) || (*wrapper == '\0')) @@ -3257,7 +3259,7 @@ find_executable (const char *wrapper) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); + lt_fatal (__FILE__, __LINE__, "getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); @@ -3282,7 +3284,7 @@ find_executable (const char *wrapper) } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); + lt_fatal (__FILE__, __LINE__, "getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); @@ -3308,7 +3310,8 @@ chase_symlinks (const char *pathspec) int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { - lt_debugprintf ("checking path component for symlinks: %s\n", + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { @@ -3332,7 +3335,9 @@ chase_symlinks (const char *pathspec) else { char *errstr = strerror (errno); - lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + lt_fatal (__FILE__, __LINE__, + "Error accessing file %s (%s)", + tmp_pathspec, errstr); } } XFREE (tmp_pathspec); @@ -3345,7 +3350,8 @@ chase_symlinks (const char *pathspec) tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { - lt_fatal ("Could not follow symlinks for %s", pathspec); + lt_fatal (__FILE__, __LINE__, + "Could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif @@ -3372,11 +3378,12 @@ strendzap (char *str, const char *pat) } void -lt_debugprintf (const char *fmt, ...) +lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); @@ -3384,10 +3391,11 @@ lt_debugprintf (const char *fmt, ...) } static void -lt_error_core (int exit_status, const char *mode, +lt_error_core (int exit_status, const char *file, + int line, const char *mode, const char *message, va_list ap) { - fprintf (stderr, "%s: %s: ", program_name, mode); + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); @@ -3396,18 +3404,19 @@ lt_error_core (int exit_status, const char *mode, } void -lt_fatal (const char *message, ...) +lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); - lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } void lt_setenv (const char *name, const char *value) { - lt_debugprintf ("(lt_setenv) setting '%s' to '%s'\n", + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", (name ? name : "<NULL>"), (value ? value : "<NULL>")); { @@ -3457,7 +3466,8 @@ lt_extend_str (const char *orig_value, const char *add, int to_end) void lt_update_exe_path (const char *name, const char *value) { - lt_debugprintf ("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", (name ? name : "<NULL>"), (value ? value : "<NULL>")); @@ -3478,7 +3488,8 @@ lt_update_exe_path (const char *name, const char *value) void lt_update_lib_path (const char *name, const char *value) { - lt_debugprintf ("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", (name ? name : "<NULL>"), (value ? value : "<NULL>")); diff --git a/tests/cwrapper.at b/tests/cwrapper.at index 30a583c..66c9ce1 100644 --- a/tests/cwrapper.at +++ b/tests/cwrapper.at @@ -80,12 +80,11 @@ for restrictive_flags in '-Wall -Werror' '-std=c89 -Wall -Werror' '-std=c99 -Wal done -# Make sure wrapper debugging works, when activated at runtime +# Test RUN-TIME activation of wrapper debugging # This is not part of the loop above, because we # need to check, not ignore, the output. CFLAGS="$orig_CFLAGS" -cat "$orig_LIBTOOL" > ./libtool -LIBTOOL=./libtool +LIBTOOL=$orig_LIBTOOL AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c liba.c], [], [ignore], [ignore]) @@ -99,15 +98,16 @@ AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o usea$EXEEXT usea.$OBJEXT [], [ignore], [ignore]) LT_AT_EXEC_CHECK([./usea], [0], [ignore], [stderr], [--lt-debug]) LT_AT_UNIFY_NL([stderr]) -AT_CHECK([grep '^(main) argv\[[0\]][[ \t]]*: \./usea' stderr], [0], [ignore], [ignore]) +AT_CHECK([grep 'libtool wrapper' stderr], [0], [ignore], [ignore]) -# Make sure wrapper debugging works, when activated at compile time. +# Test COMPILE-TIME activation of wrapper debugging # We structure this test as a loop, so that we can 'break' out of it # if necessary -- even though the loop by design executes only once. for debugwrapper_flags in '-DLT_DEBUGWRAPPER'; do CFLAGS="$orig_CFLAGS $debugwrapper_flags" - sed "s/LTCFLAGS=.*/&' $debugwrapper_flags'/" < "$orig_LIBTOOL" > ./libtool + sed "s/LTCFLAGS=.*/&' $debugwrapper_flags'/" < "$orig_LIBTOOL" | + sed "s/^lt_option_debug=/lt_option_debug=1/" > ./libtool LIBTOOL=./libtool # make sure $debugwrapper_flags do not cause a failure @@ -127,7 +127,7 @@ for debugwrapper_flags in '-DLT_DEBUGWRAPPER'; do [], [ignore], [ignore]) LT_AT_EXEC_CHECK([./usea], [0], [ignore], [stderr], []) LT_AT_UNIFY_NL([stderr]) - AT_CHECK([grep '^(main) argv\[[0\]][[ \t]]*: \./usea' stderr], [0], [ignore], [ignore]) + AT_CHECK([grep 'libtool wrapper' stderr], [0], [ignore], [ignore]) done