From 9cb80f72d8b8b2f59562692d9385cd5a533e9b3f Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 21 Dec 2011 19:39:11 +0000 Subject: * configure.in (--enable-deterministic-archives): Grok new argument. Set DEFAULT_AR_DETERMINISTIC to 1 or 0 accordingly. * configure: Regenerated. * config.in: Regenerated. * ar.c (deterministic): Initialize to -1. (decode_options, ranlib_main): Grok U option. (usage, ranlib_usage): Mention U; say for D and U which is the default. (default_deterministic): New function. (ranlib_main): Call it. (main): Likewise. Make newer_only && deterministic error non-fatal if it was just DEFAULT_AR_DETERMINISTIC and not the D option. * doc/binutils.texi (ar cmdline, ranlib): Document U modifier and --enable-deterministic-archives behavior. --- binutils/ChangeLog | 16 +++++++++++++ binutils/ar.c | 57 ++++++++++++++++++++++++++++++++++++++++------ binutils/config.in | 3 +++ binutils/configure | 26 +++++++++++++++++++-- binutils/configure.in | 20 ++++++++++++---- binutils/doc/binutils.texi | 29 +++++++++++++++++++++++ 6 files changed, 138 insertions(+), 13 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 9c6b58f..d01c5eb 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,19 @@ +2011-12-20 Roland McGrath + + * configure.in (--enable-deterministic-archives): Grok new + argument. Set DEFAULT_AR_DETERMINISTIC to 1 or 0 accordingly. + * configure: Regenerated. + * config.in: Regenerated. + * ar.c (deterministic): Initialize to -1. + (decode_options, ranlib_main): Grok U option. + (usage, ranlib_usage): Mention U; say for D and U which is the default. + (default_deterministic): New function. + (ranlib_main): Call it. + (main): Likewise. Make newer_only && deterministic error + non-fatal if it was just DEFAULT_AR_DETERMINISTIC and not the D option. + * doc/binutils.texi (ar cmdline, ranlib): Document U modifier and + --enable-deterministic-archives behavior. + 2011-12-16 Tristan Gingold * od-macho.c: Include mach-o/codesign.h diff --git a/binutils/ar.c b/binutils/ar.c index 676e92c..0310b6f 100644 --- a/binutils/ar.c +++ b/binutils/ar.c @@ -97,7 +97,7 @@ int write_armap = 0; /* Operate in deterministic mode: write zero for timestamps, uids, and gids for archive members and the archive symbol table, and write consistent file modes. */ -int deterministic = 0; +int deterministic = -1; /* Determinism indeterminate. */ /* Nonzero means it's the name of an existing member; position new or moved files with respect to this one. */ @@ -276,7 +276,20 @@ usage (int help) fprintf (s, _(" command specific modifiers:\n")); fprintf (s, _(" [a] - put file(s) after [member-name]\n")); fprintf (s, _(" [b] - put file(s) before [member-name] (same as [i])\n")); - fprintf (s, _(" [D] - use zero for timestamps and uids/gids\n")); + if (DEFAULT_AR_DETERMINISTIC) + { + fprintf (s, _("\ + [D] - use zero for timestamps and uids/gids (default)\n")); + fprintf (s, _("\ + [U] - use actual timestamps and uids/gids\n")); + } + else + { + fprintf (s, _("\ + [D] - use zero for timestamps and uids/gids\n")); + fprintf (s, _("\ + [U] - use actual timestamps and uids/gids (default)\n")); + } fprintf (s, _(" [N] - use instance [count] of name\n")); fprintf (s, _(" [f] - truncate inserted file names\n")); fprintf (s, _(" [P] - use full path names when matching\n")); @@ -322,9 +335,16 @@ ranlib_usage (int help) fprintf (s, _("\ --plugin Load the specified plugin\n")); #endif + if (DEFAULT_AR_DETERMINISTIC) + fprintf (s, _("\ + -D Use zero for symbol map timestamp (default)\n\ + -U Use an actual symbol map timestamp\n")); + else + fprintf (s, _("\ + -D Use zero for symbol map timestamp\n\ + -U Use actual symbol map timestamp (default)\n")); fprintf (s, _("\ -t Update the archive's symbol map timestamp\n\ - -D Use zero for the symbol map timestamp\n\ -h --help Print this help message\n\ -v --version Print version information\n")); @@ -434,7 +454,7 @@ decode_options (int argc, char **argv) argv = new_argv; } - while ((c = getopt_long (argc, argv, "hdmpqrtxlcoVsSuvabiMNfPTD", + while ((c = getopt_long (argc, argv, "hdmpqrtxlcoVsSuvabiMNfPTDU", long_options, NULL)) != EOF) { switch (c) @@ -531,6 +551,9 @@ decode_options (int argc, char **argv) case 'D': deterministic = TRUE; break; + case 'U': + deterministic = FALSE; + break; case OPTION_PLUGIN: #if BFD_SUPPORTS_PLUGINS plugin_target = "plugin"; @@ -553,6 +576,15 @@ decode_options (int argc, char **argv) return &argv[optind]; } +/* If neither -D nor -U was not specified explicitly, + then use the configured default. */ +static void +default_deterministic (void) +{ + if (deterministic < 0) + deterministic = DEFAULT_AR_DETERMINISTIC; +} + static void ranlib_main (int argc, char **argv) { @@ -560,13 +592,16 @@ ranlib_main (int argc, char **argv) bfd_boolean touch = FALSE; int c; - while ((c = getopt_long (argc, argv, "DhHvVt", long_options, NULL)) != EOF) + while ((c = getopt_long (argc, argv, "DhHUvVt", long_options, NULL)) != EOF) { switch (c) { case 'D': deterministic = TRUE; break; + case 'U': + deterministic = FALSE; + break; case 'h': case 'H': show_help = 1; @@ -590,6 +625,8 @@ ranlib_main (int argc, char **argv) if (show_version) print_version ("ranlib"); + default_deterministic (); + arg_index = optind; while (arg_index < argc) @@ -699,8 +736,14 @@ main (int argc, char **argv) if (newer_only && operation != replace) fatal (_("`u' is only meaningful with the `r' option.")); - if (newer_only && deterministic) - fatal (_("`u' is not meaningful with the `D' option.")); + if (newer_only && deterministic > 0) + fatal (_("`u' is not meaningful with the `D' option.")); + + if (newer_only && deterministic < 0 && DEFAULT_AR_DETERMINISTIC) + non_fatal (_("\ +`u' modifier ignored since `D' is the default (see `U')")); + + default_deterministic (); if (postype != pos_default) posname = argv[arg_index++]; diff --git a/binutils/config.in b/binutils/config.in index 0cb7290..62bdfa1 100644 --- a/binutils/config.in +++ b/binutils/config.in @@ -8,6 +8,9 @@ /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA +/* Should ar and ranlib use -D behavior by default? */ +#undef DEFAULT_AR_DETERMINISTIC + /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS diff --git a/binutils/configure b/binutils/configure index b46a30b..028abb9 100755 --- a/binutils/configure +++ b/binutils/configure @@ -771,6 +771,7 @@ enable_fast_install with_gnu_ld enable_libtool_lock enable_targets +enable_deterministic_archives enable_werror enable_build_warnings enable_nls @@ -1417,6 +1418,8 @@ Optional Features: optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-targets alternative target configurations + --enable-deterministic-archives + ar and ranlib default to -D behavior --enable-werror treat compile warnings as errors --enable-build-warnings enable build-time compiler warnings --disable-nls do not use Native Language Support @@ -11199,7 +11202,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11202 "configure" +#line 11205 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11305,7 +11308,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11308 "configure" +#line 11311 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11553,6 +11556,25 @@ if test "${enable_targets+set}" = set; then : esac fi +# Check whether --enable-deterministic-archives was given. +if test "${enable_deterministic_archives+set}" = set; then : + enableval=$enable_deterministic_archives; +if test "${enableval}" = no; then + default_ar_deterministic=0 +else + default_ar_deterministic=1 +fi +else + default_ar_deterministic=0 +fi + + + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_AR_DETERMINISTIC $default_ar_deterministic +_ACEOF + + GCC_WARN_CFLAGS="-W -Wall -Wstrict-prototypes -Wmissing-prototypes" cat confdefs.h - <<_ACEOF >conftest.$ac_ext diff --git a/binutils/configure.in b/binutils/configure.in index 1f3b25d..d38b677 100644 --- a/binutils/configure.in +++ b/binutils/configure.in @@ -28,8 +28,20 @@ AC_ARG_ENABLE(targets, *) enable_targets=$enableval ;; esac])dnl +AC_ARG_ENABLE(deterministic-archives, +[AS_HELP_STRING([--enable-deterministic-archives], + [ar and ranlib default to -D behavior])], [ +if test "${enableval}" = no; then + default_ar_deterministic=0 +else + default_ar_deterministic=1 +fi], [default_ar_deterministic=0]) + +AC_DEFINE_UNQUOTED(DEFAULT_AR_DETERMINISTIC, $default_ar_deterministic, + [Should ar and ranlib use -D behavior by default?]) + AM_BINUTILS_WARNINGS - + AC_CONFIG_HEADERS(config.h:config.in) if test -z "$target" ; then @@ -203,7 +215,7 @@ do else case $targ in changequote(,)dnl - i[3-7]86*-*-netware*) + i[3-7]86*-*-netware*) changequote([,])dnl BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_I386" @@ -432,11 +444,11 @@ fi AC_DEFINE_UNQUOTED(TARGET_PREPENDS_UNDERSCORE, $UNDERSCORE, [Define to 1 if user symbol names have a leading underscore, 0 if not.]) -# Emulation +# Emulation targ=$target . ${srcdir}/configure.tgt EMULATION=$targ_emul -EMULATION_VECTOR=$targ_emul_vector +EMULATION_VECTOR=$targ_emul_vector AC_SUBST(EMULATION) AC_SUBST(EMULATION_VECTOR) diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 3217a1a..76998bc 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -418,6 +418,7 @@ using this modifier. @item D @cindex deterministic archives +@kindex --enable-deterministic-archives Operate in @emph{deterministic} mode. When adding files and the archive index use zero for UIDs, GIDs, timestamps, and use consistent file modes for all files. When this option is used, if @command{ar} is used with @@ -425,6 +426,10 @@ identical options and identical input files, multiple runs will create identical output files regardless of the input files' owners, groups, file modes, or modification times. +If @file{binutils} was configured with +@option{--enable-deterministic-archives}, then this mode is on by default. +It can be disabled with the @samp{U} modifier, below. + @item f Truncate names in the archive. @sc{gnu} @command{ar} will normally permit file names of any length. This will cause it to create archives which are @@ -493,6 +498,16 @@ operation @samp{r} (replace). In particular, the combination @samp{qu} is not allowed, since checking the timestamps would lose any speed advantage from the operation @samp{q}. +@item U +@cindex deterministic archives +@kindex --enable-deterministic-archives +Do @emph{not} operate in @emph{deterministic} mode. This is the inverse +of the @samp{D} modifier, above: added files and the archive index will +get their actual UID, GID, timestamp, and file mode values. + +This is the default unless @file{binutils} was configured with +@option{--enable-deterministic-archives}. + @item v This modifier requests the @emph{verbose} version of an operation. Many operations display additional information, such as filenames processed, @@ -2386,12 +2401,26 @@ Show the version number of @command{ranlib}. @item -D @cindex deterministic archives +@kindex --enable-deterministic-archives Operate in @emph{deterministic} mode. The symbol map archive member's header will show zero for the UID, GID, and timestamp. When this option is used, multiple runs will produce identical output files. +This is the default unless @file{binutils} was configured with +@option{--enable-deterministic-archives}. + @item -t Update the timestamp of the symbol map of an archive. + +@item -U +@cindex deterministic archives +@kindex --enable-deterministic-archives +Do @emph{not} operate in @emph{deterministic} mode. This is the +inverse of the @samp{-D} option, above: the archive index will get +actual UID, GID, timestamp, and file mode values. + +This is the default unless @file{binutils} was configured with +@option{--enable-deterministic-archives}. @end table @c man end -- cgit v1.1