Browse Source

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 years ago
parent
commit
cbc51277aa
16 changed files with 124 additions and 37 deletions
  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
 aclocal.m4
 autom4te.cache
-build-aux
 build-aux/
 config.h
 config.h.in
 config.log
 config.status
 configure
-gnu
+gnu/.gitignore
+gnu/charset.alias
+gnu/*.h
+gnu/*/
 gnulib
 libtool
 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>
 
 
@@ -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
 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
 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
 extended attributes.
 
+* New configure option --enable-gcc-warnings, intended for debugging.
+
 
 version 1.26 - Sergey Poznyakoff, 2011-03-12
 

+ 0 - 1
bootstrap.conf

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

+ 80 - 0
configure.ac

@@ -113,6 +113,86 @@ gl_INIT
 # paxutils modules
 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
 
 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
 linkat
 localcharset
+manywarnings
 mkdtemp
 mkfifoat
 modechange

+ 3 - 2
lib/Makefile.am

@@ -27,6 +27,7 @@ rmt-command.h : Makefile
 BUILT_SOURCES = rmt-command.h
 CLEANFILES = rmt-command.h rmt-command.h-t
 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
 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_GEN)rm -f $@-t $@ && \
 	 cp $(srcdir)/attr-xattr.in.h attr/xattr.h
-
-MOSTLYCLEANFILES = attr/xattr.h attr/xattr.h
 endif
 
+MOSTLYCLEANFILES = attr/xattr.h
+
 EXTRA_DIST = attr-xattr.in.h

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

@@ -17,6 +17,9 @@
 #ifndef TAR_ATTR_XATTR_H
 #define TAR_ATTR_XATTR_H
 #include <errno.h>
+#ifndef ENOATTR
+# define ENOATTR ENODATA        /* No such attribute */
+#endif
 
 /* setting */
 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; }
 
 #endif
-

+ 1 - 0
src/Makefile.am

@@ -46,6 +46,7 @@ tar_SOURCES = \
  xattrs.c
 
 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)
 

+ 2 - 2
src/buffer.c

@@ -289,8 +289,8 @@ struct zip_program
 };
 
 static struct zip_magic const magic[] = {
-  { ct_none, },
-  { ct_tar },
+  { ct_none,     0, 0 },
+  { ct_tar,      0, 0 },
   { ct_compress, 2, "\037\235" },
   { ct_gzip,     2, "\037\213" },
   { 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);
 
 /* 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 */
 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);
 
-  argv[0] = "/bin/sh";
-  argv[1] = "-c";
+  argv[0] = (char *) "/bin/sh";
+  argv[1] = (char *) "-c";
   argv[2] = to_command_option;
   argv[3] = NULL;
 
@@ -837,8 +837,8 @@ sys_exec_info_script (const char **archive_name, int volume_number)
 
   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[3] = NULL;
 
@@ -885,8 +885,8 @@ sys_exec_checkpoint_script (const char *script_name,
   setenv ("TAR_FORMAT",
 	  archive_format_string (current_format == DEFAULT_FORMAT ?
 				 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[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++)
     {
       if (term == 0 && p[0] == '-')
-	state->argv[i++] = "--add-file";
+	state->argv[i++] = (char *) "--add-file";
       state->argv[i] = p;
     }
 }
@@ -2013,7 +2013,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case OLD_ARCHIVE_OPTION:
       set_archive_format ("v7");
       break;
-      
+
     case OVERWRITE_DIR_OPTION:
       old_files_option = DEFAULT_OLD_FILES;
       break;

+ 7 - 7
src/xattrs.c

@@ -137,7 +137,7 @@ static char *
 skip_to_ext_fields (char *ptr)
 {
   /* skip tag name (user/group/default/mask) */
-  ptr += strcspn (ptr, ":,\n"); 
+  ptr += strcspn (ptr, ":,\n");
 
   if (*ptr != ':')
     return ptr;
@@ -192,7 +192,7 @@ static void
 xattrs__acls_set (struct tar_stat_info const *st,
                   char const *file_name, int type,
                   char *ptr, size_t len, bool def)
-{  
+{
   acl_t acl;
 
   if (ptr)
@@ -229,7 +229,7 @@ static void
 xattrs__acls_get_a (int parentfd, const char *file_name,
                     struct tar_stat_info *st,
                     char **ret_ptr, size_t * ret_len)
-{             
+{
   char *val = NULL;
   ssize_t len;
   acl_t acl;
@@ -261,7 +261,7 @@ static void
 xattrs__acls_get_d (int parentfd, char const *file_name,
                     struct tar_stat_info *st,
                     char **ret_ptr, size_t * ret_len)
-{         
+{
   char *val = NULL;
   ssize_t len;
   acl_t acl;
@@ -407,7 +407,7 @@ clear_mask_map (struct xattrs_mask_map *mask_map)
 }
 
 void
-xattrs_clear_setup ()
+xattrs_clear_setup (void)
 {
   clear_mask_map (&xattrs_setup.incl);
   clear_mask_map (&xattrs_setup.excl);
@@ -614,7 +614,7 @@ static bool
 xattrs_masked_out (const char *kw, bool archiving)
 {
   return xattrs_kw_included (kw, archiving) ?
-    xattrs_kw_excluded (kw, archiving) : true; 
+    xattrs_kw_excluded (kw, archiving) : true;
 }
 
 void
@@ -720,7 +720,7 @@ xattrs_print (struct tar_stat_info const *st)
   if (xattrs_option && st->xattr_map_size)
     {
       int i;
-      
+
       for (i = 0; i < st->xattr_map_size; ++i)
         {
           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);
 
 /* 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,
                              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 *base = NULL;
   char pidbuf[UINTMAX_STRSIZE_BOUND];
-  char const *pptr;
+  char const *pptr = NULL;
   char nbuf[UINTMAX_STRSIZE_BOUND];
   char const *nptr = NULL;
 
@@ -335,13 +335,10 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n)
 	      break;
 
 	    case 'n':
-	      if (nptr)
-		{
-		  q = stpcpy (q, nptr);
-		  p += 2;
-		  break;
-		}
-	      /* else fall through */
+	      q = stpcpy (q, nptr);
+	      p += 2;
+	      break;
+
 
 	    default:
 	      *q++ = *p++;