瀏覽代碼

build: new configure option --enable-gcc-warnings

This has a similar meaning as in other GNU applications
such as coreutils and Emacs.
* NEWS: Document it.
* .gitignore: Remove redundant build-aux.
Remove gnu, since gnu/Makefile.am is now in git.
Add gnu/.gitignore, gnu/charset.alias, gnu/*.h, gnu/*/ to cover
autogenerated files.
* bootstrap.conf (gnulib_mk): Remove.
* configure.ac: Add support for --enable-gcc-warnings,
taken from coreutils and simplified.
* gnu/Makefile.am: New file.  Formerly this was autogenerated,
but the autogenerated file has been renamed to gnulib.mk,
its usual name when bootstrapping from gnulib.
This way, AM_CFLAGS can incorporate warning options.
* gnulib.modules: Add manywarnings.
* lib/Makefile.am, src/Makefile.am (AM_CFLAGS): New macro,
incorporating warning options.
* lib/attr-xattr.in.h (ENOATTR): New macro, if not already defined.
* src/buffer.c (magic): Don't rely on incomplete initializers.
* src/common.h (report_difference): Add printf format attribute.
* src/system.c (sys_exec_command, sys_exec_info_script)
(sys_exec_checkpoint_script):
* src/tar.c (update_argv):
Add casts to char * to pacify GCC warnings about using string
literals in a char * context.
* src/xattrs.c, src/xattrs.h (xattrs_clear_setup):
Declare parameters as (void), not ().
* src/xheader.c (xheader_format_name): Initialize pptr to null,
to pacify GCC.  Remove unnecessary test of nptr versus null.
Paul Eggert 12 年之前
父節點
當前提交
cbc51277aa
共有 16 個文件被更改,包括 124 次插入37 次删除
  1. 4 2
      .gitignore
  2. 4 4
      NEWS
  3. 0 1
      bootstrap.conf
  4. 80 0
      configure.ac
  5. 3 0
      gnu/Makefile.am
  6. 1 0
      gnulib.modules
  7. 3 2
      lib/Makefile.am
  8. 3 1
      lib/attr-xattr.in.h
  9. 1 0
      src/Makefile.am
  10. 2 2
      src/buffer.c
  11. 2 1
      src/common.h
  12. 6 6
      src/system.c
  13. 2 2
      src/tar.c
  14. 7 7
      src/xattrs.c
  15. 1 1
      src/xattrs.h
  16. 5 8
      src/xheader.c

+ 4 - 2
.gitignore

@@ -16,14 +16,16 @@ Makefile
 Makefile.in
 Makefile.in
 aclocal.m4
 aclocal.m4
 autom4te.cache
 autom4te.cache
-build-aux
 build-aux/
 build-aux/
 config.h
 config.h
 config.h.in
 config.h.in
 config.log
 config.log
 config.status
 config.status
 configure
 configure
-gnu
+gnu/.gitignore
+gnu/charset.alias
+gnu/*.h
+gnu/*/
 gnulib
 gnulib
 libtool
 libtool
 m4
 m4

+ 4 - 4
NEWS

@@ -1,4 +1,4 @@
-GNU tar NEWS - User visible changes. 2012-11-19
+GNU tar NEWS - User visible changes. 2012-12-18
 Please send GNU tar bug reports to <bug-tar@gnu.org>
 Please send GNU tar bug reports to <bug-tar@gnu.org>
 
 
 
 
@@ -11,9 +11,7 @@ adjusted to quote 'like this' (with apostrophes) instead of `like this'
 (with an accent grave character and an apostrophe).  This tracks
 (with an accent grave character and an apostrophe).  This tracks
 recent changes to the GNU coding standards.
 recent changes to the GNU coding standards.
 
 
-* New features
-
-** --owner and --group names and numbers
+* --owner and --group names and numbers
 
 
 The --owner and --group options now accept operands of the form
 The --owner and --group options now accept operands of the form
 NAME:NUM, so that you can specify both symbolic name and numeric ID
 NAME:NUM, so that you can specify both symbolic name and numeric ID
@@ -45,6 +43,8 @@ Additionally, the options --xattrs-include and --xattrs-exclude allow
 you to selectively control for which files to store (or extract) the
 you to selectively control for which files to store (or extract) the
 extended attributes.
 extended attributes.
 
 
+* New configure option --enable-gcc-warnings, intended for debugging.
+
 
 
 version 1.26 - Sergey Poznyakoff, 2011-03-12
 version 1.26 - Sergey Poznyakoff, 2011-03-12
 
 

+ 0 - 1
bootstrap.conf

@@ -19,7 +19,6 @@
 
 
 source_base=gnu
 source_base=gnu
 gnulib_name=libgnu
 gnulib_name=libgnu
-gnulib_mk=Makefile.am
 
 
 # We don't need these modules, even though gnulib-tool mistakenly
 # We don't need these modules, even though gnulib-tool mistakenly
 # includes them because of gettext dependencies.
 # includes them because of gettext dependencies.

+ 80 - 0
configure.ac

@@ -113,6 +113,86 @@ gl_INIT
 # paxutils modules
 # paxutils modules
 tar_PAXUTILS
 tar_PAXUTILS
 
 
+AC_ARG_ENABLE([gcc-warnings],
+  [AS_HELP_STRING([--enable-gcc-warnings],
+     [turn on many GCC warnings (for developers; best with GNU make)])],
+  [case $enableval in
+     yes|no) ;;
+     *)      AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;;
+   esac
+   gl_gcc_warnings=$enableval],
+  [if test -d "$srcdir"/.git; then
+     gl_gcc_warnings=yes
+   else
+     gl_gcc_warnings=no
+   fi]
+)
+
+if test "$gl_gcc_warnings" = yes; then
+  gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
+  AC_SUBST([WERROR_CFLAGS])
+
+  nw=
+  # This, $nw, is the list of warnings we disable.
+  nw="$nw -Wformat-nonliteral"      # warnings in Fedora 17 stdio.h
+  nw="$nw -Wvla"                    # warnings in gettext.h
+  nw="$nw -Wswitch-default"         # Too many warnings for now
+  nw="$nw -Wunsafe-loop-optimizations" # It's OK to omit unsafe optimizations.
+  nw="$nw -Winline"                 # It's OK to not inline.
+  nw="$nw -Wstrict-overflow"	    # It's OK to optimize strictly.
+  nw="$nw -Wsuggest-attribute=pure" # Too many warnings for now.
+
+  gl_MANYWARN_ALL_GCC([ws])
+  gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
+  for w in $ws; do
+    gl_WARN_ADD([$w])
+  done
+  gl_WARN_ADD([-Wno-sign-compare])     # Too many warnings for now
+  gl_WARN_ADD([-Wno-type-limits])      # It's OK to optimize based on types.
+  gl_WARN_ADD([-Wno-unused-parameter]) # Too many warnings for now
+  gl_WARN_ADD([-Wno-format-nonliteral])
+
+  gl_WARN_ADD([-fdiagnostics-show-option])
+  gl_WARN_ADD([-funit-at-a-time])
+
+  AC_SUBST([WARN_CFLAGS])
+
+  AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.])
+  AH_VERBATIM([FORTIFY_SOURCE],
+  [/* Enable compile-time and run-time bounds-checking, and some warnings,
+      without upsetting glibc 2.15+. */
+   #if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__
+   # define _FORTIFY_SOURCE 2
+   #endif
+  ])
+  AC_DEFINE([GNULIB_PORTCHECK], [1], [enable some gnulib portability checks])
+
+  # Use a slightly smaller set of warning options for lib/.
+  # Remove the following and save the result in GNULIB_WARN_CFLAGS.
+  nw=
+  nw="$nw -Wmissing-prototypes"
+  nw="$nw -Wunused-macros"
+  #
+  # These are for argp.
+  nw="$nw -Wmissing-field-initializers"
+  nw="$nw -Wshadow"
+  #
+  gl_MANYWARN_COMPLEMENT([GNULIB_WARN_CFLAGS], [$WARN_CFLAGS], [$nw])
+
+  # This is also for argp.
+  gl_WARN_ADD([-Wno-missing-field-initializers], [GNULIB_WARN_CFLAGS])
+
+  AC_SUBST([GNULIB_WARN_CFLAGS])
+
+  # For gnulib-tests, the set is slightly smaller still.
+  nw=
+  # It's not worth being this picky about test programs.
+  nw="$nw -Wsuggest-attribute=const"
+  gl_MANYWARN_COMPLEMENT([GNULIB_TEST_WARN_CFLAGS],
+                         [$GNULIB_WARN_CFLAGS], [$nw])
+  AC_SUBST([GNULIB_TEST_WARN_CFLAGS])
+fi
+
 TAR_HEADERS_ATTR_XATTR_H
 TAR_HEADERS_ATTR_XATTR_H
 
 
 AC_CHECK_FUNCS_ONCE([fchmod fchown fsync lstat mkfifo readlink symlink])
 AC_CHECK_FUNCS_ONCE([fchmod fchown fsync lstat mkfifo readlink symlink])

+ 3 - 0
gnu/Makefile.am

@@ -0,0 +1,3 @@
+# Make the subset of Gnulib that GNU tar needs.
+include gnulib.mk
+AM_CFLAGS += $(GNULIB_WARN_CFLAGS) $(WERROR_CFLAGS)

+ 1 - 0
gnulib.modules

@@ -34,6 +34,7 @@ inttypes
 lchown
 lchown
 linkat
 linkat
 localcharset
 localcharset
+manywarnings
 mkdtemp
 mkdtemp
 mkfifoat
 mkfifoat
 modechange
 modechange

+ 3 - 2
lib/Makefile.am

@@ -27,6 +27,7 @@ rmt-command.h : Makefile
 BUILT_SOURCES = rmt-command.h
 BUILT_SOURCES = rmt-command.h
 CLEANFILES = rmt-command.h rmt-command.h-t
 CLEANFILES = rmt-command.h rmt-command.h-t
 AM_CPPFLAGS = -I$(top_srcdir)/gnu -I../ -I../gnu
 AM_CPPFLAGS = -I$(top_srcdir)/gnu -I../ -I../gnu
+AM_CFLAGS = $(GNULIB_WARN_CFLAGS) $(WERROR_CFLAGS)
 
 
 noinst_HEADERS = system.h system-ioctl.h rmt.h paxlib.h stdopen.h xattr-at.h
 noinst_HEADERS = system.h system-ioctl.h rmt.h paxlib.h stdopen.h xattr-at.h
 libtar_a_SOURCES = \
 libtar_a_SOURCES = \
@@ -44,8 +45,8 @@ attr/xattr.h: attr-xattr.in.h $(top_builddir)/config.status
 	$(AM_V_at)$(MKDIR_P) attr
 	$(AM_V_at)$(MKDIR_P) attr
 	$(AM_V_GEN)rm -f $@-t $@ && \
 	$(AM_V_GEN)rm -f $@-t $@ && \
 	 cp $(srcdir)/attr-xattr.in.h attr/xattr.h
 	 cp $(srcdir)/attr-xattr.in.h attr/xattr.h
-
-MOSTLYCLEANFILES = attr/xattr.h attr/xattr.h
 endif
 endif
 
 
+MOSTLYCLEANFILES = attr/xattr.h
+
 EXTRA_DIST = attr-xattr.in.h
 EXTRA_DIST = attr-xattr.in.h

+ 3 - 1
lib/attr-xattr.in.h

@@ -17,6 +17,9 @@
 #ifndef TAR_ATTR_XATTR_H
 #ifndef TAR_ATTR_XATTR_H
 #define TAR_ATTR_XATTR_H
 #define TAR_ATTR_XATTR_H
 #include <errno.h>
 #include <errno.h>
+#ifndef ENOATTR
+# define ENOATTR ENODATA        /* No such attribute */
+#endif
 
 
 /* setting */
 /* setting */
 static inline int setxattr (const char *path, const char *name, const void
 static inline int setxattr (const char *path, const char *name, const void
@@ -55,4 +58,3 @@ static inline ssize_t flistxattr (int filedes, char *list, size_t size)
 { errno = ENOTSUP; return -1; }
 { errno = ENOTSUP; return -1; }
 
 
 #endif
 #endif
-

+ 1 - 0
src/Makefile.am

@@ -46,6 +46,7 @@ tar_SOURCES = \
  xattrs.c
  xattrs.c
 
 
 AM_CPPFLAGS = -I$(top_srcdir)/gnu -I../ -I../gnu -I$(top_srcdir)/lib -I../lib
 AM_CPPFLAGS = -I$(top_srcdir)/gnu -I../ -I../gnu -I$(top_srcdir)/lib -I../lib
+AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS)
 
 
 LDADD = ../lib/libtar.a ../gnu/libgnu.a $(LIBINTL) $(LIBICONV)
 LDADD = ../lib/libtar.a ../gnu/libgnu.a $(LIBINTL) $(LIBICONV)
 
 

+ 2 - 2
src/buffer.c

@@ -289,8 +289,8 @@ struct zip_program
 };
 };
 
 
 static struct zip_magic const magic[] = {
 static struct zip_magic const magic[] = {
-  { ct_none, },
-  { ct_tar },
+  { ct_none,     0, 0 },
+  { ct_tar,      0, 0 },
   { ct_compress, 2, "\037\235" },
   { ct_compress, 2, "\037\235" },
   { ct_gzip,     2, "\037\213" },
   { ct_gzip,     2, "\037\213" },
   { ct_bzip2,    3, "BZh" },
   { ct_bzip2,    3, "BZh" },

+ 2 - 1
src/common.h

@@ -781,7 +781,8 @@ void sys_exec_checkpoint_script (const char *script_name,
 				 int checkpoint_number);
 				 int checkpoint_number);
 
 
 /* Module compare.c */
 /* Module compare.c */
-void report_difference (struct tar_stat_info *st, const char *message, ...);
+void report_difference (struct tar_stat_info *st, const char *message, ...)
+  __attribute__ ((format (printf, 2, 3)));
 
 
 /* Module sparse.c */
 /* Module sparse.c */
 bool sparse_member_p (struct tar_stat_info *st);
 bool sparse_member_p (struct tar_stat_info *st);

+ 6 - 6
src/system.c

@@ -722,8 +722,8 @@ sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st)
 
 
   stat_to_env (file_name, typechar, st);
   stat_to_env (file_name, typechar, st);
 
 
-  argv[0] = "/bin/sh";
-  argv[1] = "-c";
+  argv[0] = (char *) "/bin/sh";
+  argv[1] = (char *) "-c";
   argv[2] = to_command_option;
   argv[2] = to_command_option;
   argv[3] = NULL;
   argv[3] = NULL;
 
 
@@ -837,8 +837,8 @@ sys_exec_info_script (const char **archive_name, int volume_number)
 
 
   xclose (p[PREAD]);
   xclose (p[PREAD]);
 
 
-  argv[0] = "/bin/sh";
-  argv[1] = "-c";
+  argv[0] = (char *) "/bin/sh";
+  argv[1] = (char *) "-c";
   argv[2] = (char *) info_script_option;
   argv[2] = (char *) info_script_option;
   argv[3] = NULL;
   argv[3] = NULL;
 
 
@@ -885,8 +885,8 @@ sys_exec_checkpoint_script (const char *script_name,
   setenv ("TAR_FORMAT",
   setenv ("TAR_FORMAT",
 	  archive_format_string (current_format == DEFAULT_FORMAT ?
 	  archive_format_string (current_format == DEFAULT_FORMAT ?
 				 archive_format : current_format), 1);
 				 archive_format : current_format), 1);
-  argv[0] = "/bin/sh";
-  argv[1] = "-c";
+  argv[0] = (char *) "/bin/sh";
+  argv[1] = (char *) "-c";
   argv[2] = (char *) script_name;
   argv[2] = (char *) script_name;
   argv[3] = NULL;
   argv[3] = NULL;
 
 

+ 2 - 2
src/tar.c

@@ -1287,7 +1287,7 @@ update_argv (const char *filename, struct argp_state *state)
   for (i = state->next, p = start; *p; p += strlen (p) + 1, i++)
   for (i = state->next, p = start; *p; p += strlen (p) + 1, i++)
     {
     {
       if (term == 0 && p[0] == '-')
       if (term == 0 && p[0] == '-')
-	state->argv[i++] = "--add-file";
+	state->argv[i++] = (char *) "--add-file";
       state->argv[i] = p;
       state->argv[i] = p;
     }
     }
 }
 }
@@ -2013,7 +2013,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case OLD_ARCHIVE_OPTION:
     case OLD_ARCHIVE_OPTION:
       set_archive_format ("v7");
       set_archive_format ("v7");
       break;
       break;
-      
+
     case OVERWRITE_DIR_OPTION:
     case OVERWRITE_DIR_OPTION:
       old_files_option = DEFAULT_OLD_FILES;
       old_files_option = DEFAULT_OLD_FILES;
       break;
       break;

+ 7 - 7
src/xattrs.c

@@ -137,7 +137,7 @@ static char *
 skip_to_ext_fields (char *ptr)
 skip_to_ext_fields (char *ptr)
 {
 {
   /* skip tag name (user/group/default/mask) */
   /* skip tag name (user/group/default/mask) */
-  ptr += strcspn (ptr, ":,\n"); 
+  ptr += strcspn (ptr, ":,\n");
 
 
   if (*ptr != ':')
   if (*ptr != ':')
     return ptr;
     return ptr;
@@ -192,7 +192,7 @@ static void
 xattrs__acls_set (struct tar_stat_info const *st,
 xattrs__acls_set (struct tar_stat_info const *st,
                   char const *file_name, int type,
                   char const *file_name, int type,
                   char *ptr, size_t len, bool def)
                   char *ptr, size_t len, bool def)
-{  
+{
   acl_t acl;
   acl_t acl;
 
 
   if (ptr)
   if (ptr)
@@ -229,7 +229,7 @@ static void
 xattrs__acls_get_a (int parentfd, const char *file_name,
 xattrs__acls_get_a (int parentfd, const char *file_name,
                     struct tar_stat_info *st,
                     struct tar_stat_info *st,
                     char **ret_ptr, size_t * ret_len)
                     char **ret_ptr, size_t * ret_len)
-{             
+{
   char *val = NULL;
   char *val = NULL;
   ssize_t len;
   ssize_t len;
   acl_t acl;
   acl_t acl;
@@ -261,7 +261,7 @@ static void
 xattrs__acls_get_d (int parentfd, char const *file_name,
 xattrs__acls_get_d (int parentfd, char const *file_name,
                     struct tar_stat_info *st,
                     struct tar_stat_info *st,
                     char **ret_ptr, size_t * ret_len)
                     char **ret_ptr, size_t * ret_len)
-{         
+{
   char *val = NULL;
   char *val = NULL;
   ssize_t len;
   ssize_t len;
   acl_t acl;
   acl_t acl;
@@ -407,7 +407,7 @@ clear_mask_map (struct xattrs_mask_map *mask_map)
 }
 }
 
 
 void
 void
-xattrs_clear_setup ()
+xattrs_clear_setup (void)
 {
 {
   clear_mask_map (&xattrs_setup.incl);
   clear_mask_map (&xattrs_setup.incl);
   clear_mask_map (&xattrs_setup.excl);
   clear_mask_map (&xattrs_setup.excl);
@@ -614,7 +614,7 @@ static bool
 xattrs_masked_out (const char *kw, bool archiving)
 xattrs_masked_out (const char *kw, bool archiving)
 {
 {
   return xattrs_kw_included (kw, archiving) ?
   return xattrs_kw_included (kw, archiving) ?
-    xattrs_kw_excluded (kw, archiving) : true; 
+    xattrs_kw_excluded (kw, archiving) : true;
 }
 }
 
 
 void
 void
@@ -720,7 +720,7 @@ xattrs_print (struct tar_stat_info const *st)
   if (xattrs_option && st->xattr_map_size)
   if (xattrs_option && st->xattr_map_size)
     {
     {
       int i;
       int i;
-      
+
       for (i = 0; i < st->xattr_map_size; ++i)
       for (i = 0; i < st->xattr_map_size; ++i)
         {
         {
           char *keyword = st->xattr_map[i].xkey + strlen ("SCHILY.xattr.");
           char *keyword = st->xattr_map[i].xkey + strlen ("SCHILY.xattr.");

+ 1 - 1
src/xattrs.h

@@ -28,7 +28,7 @@
 extern void xattrs_mask_add (const char *mask, bool incl);
 extern void xattrs_mask_add (const char *mask, bool incl);
 
 
 /* clear helping structures when tar finishes */
 /* clear helping structures when tar finishes */
-extern void xattrs_clear_setup ();
+extern void xattrs_clear_setup (void);
 
 
 extern void xattrs_acls_get (int parentfd, char const *file_name,
 extern void xattrs_acls_get (int parentfd, char const *file_name,
                              struct tar_stat_info *st, int fd, int xisfile);
                              struct tar_stat_info *st, int fd, int xisfile);

+ 5 - 8
src/xheader.c

@@ -262,7 +262,7 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n)
   char *dir = NULL;
   char *dir = NULL;
   char *base = NULL;
   char *base = NULL;
   char pidbuf[UINTMAX_STRSIZE_BOUND];
   char pidbuf[UINTMAX_STRSIZE_BOUND];
-  char const *pptr;
+  char const *pptr = NULL;
   char nbuf[UINTMAX_STRSIZE_BOUND];
   char nbuf[UINTMAX_STRSIZE_BOUND];
   char const *nptr = NULL;
   char const *nptr = NULL;
 
 
@@ -335,13 +335,10 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n)
 	      break;
 	      break;
 
 
 	    case 'n':
 	    case 'n':
-	      if (nptr)
-		{
-		  q = stpcpy (q, nptr);
-		  p += 2;
-		  break;
-		}
-	      /* else fall through */
+	      q = stpcpy (q, nptr);
+	      p += 2;
+	      break;
+
 
 
 	    default:
 	    default:
 	      *q++ = *p++;
 	      *q++ = *p++;