From eb2083998d18265a001e6bd8bf08d56d27ed8061 Mon Sep 17 00:00:00 2001 From: Craig Silverstein Date: Wed, 15 Aug 2007 19:44:54 +0000 Subject: [PATCH] Wed Aug 15 07:35:51 2007 Google Inc. * google-gflags: version 0.6 * Deal correctly with case that libpthread is not linked in (csilvers) * Update Makefile/tests so we pass "make distcheck" (csilvers) * Document and test that last assignment to a flag wins (wan) git-svn-id: https://gflags.googlecode.com/svn/trunk@17 6586e3c6-dcc4-952a-343f-ff74eb82781d --- ChangeLog | 51 +++++++++------- Makefile.am | 10 +++- Makefile.in | 54 +++++++++++++---- autogen.sh | 2 +- configure | 59 +++++++++++------- configure.ac | 11 +++- m4/acx_pthread.m4 | 21 ++++--- packages/deb/changelog | 13 ++++ python/setup.py | 2 +- src/gflags.cc | 24 ++++---- src/gflags_unittest.cc | 112 ++++++++++++++++++++++++++++++++++- src/gflags_unittest.sh | 8 ++- src/gflags_unittest_flagfile | 2 + src/google/gflags.h.in | 18 +++--- 14 files changed, 292 insertions(+), 95 deletions(-) create mode 100644 src/gflags_unittest_flagfile diff --git a/ChangeLog b/ChangeLog index 48f6cb5..7efd7ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,24 @@ -Wed Dec 13 12:37:19 2006 Google Inc. +Wed Aug 15 07:35:51 2007 Google Inc. - * google-gflags: initial release: - The gflags package contains a library that implements commandline - flags processing. As such it's a replacement for getopt(). It - has increased flexibility, including built-in support for C++ - types like string, and the ability to define flags in the source - file in which they're used. + * google-gflags: version 0.6 + * Deal correctly with case that libpthread is not linked in (csilvers) + * Update Makefile/tests so we pass "make distcheck" (csilvers) + * Document and test that last assignment to a flag wins (wan) -Mon Jan 22 15:33:06 2007 Google Inc. +Tue Jun 12 15:23:42 2007 Google Inc. - * google-gflags: version 0.2 - * added support for python commandlineflags, as well as c++ - * gflags2man, a script to turn flags into a man page (dchristian) + * google-gflags: version 0.5 + * Include all m4 macros in the distribution (csilvers) + * Python: Fix broken data_files field in setup.py (sidlon) + * Python: better string serliaizing and unparsing (abo, csimmons) + * Fix checks for NaN and inf to work with Mac OS X (csilvers) + +Thu Apr 19 15:15:07 2007 Google Inc. + + * google-gflags: version 0.4 + * Remove is_default from GetCommandLineFlagInfo (csilvers) + * Portability fixes: includes, strtoll, gcc4.3 errors (csilvers) + * A few doc typo cleanups (csilvers) Wed Mar 28 12:15:56 2007 Google Inc. @@ -21,17 +28,17 @@ Wed Mar 28 12:15:56 2007 Google Inc. * Make docs a bit prettier (csilvers) * Actually include the python files in the distribution! :-/ (csilvers) -Thu Apr 19 15:15:07 2007 Google Inc. +Mon Jan 22 15:33:06 2007 Google Inc. - * google-gflags: version 0.4 - * Remove is_default from GetCommandLineFlagInfo (csilvers) - * Portability fixes: includes, strtoll, gcc4.3 errors (csilvers) - * A few doc typo cleanups (csilvers) + * google-gflags: version 0.2 + * added support for python commandlineflags, as well as c++ + * gflags2man, a script to turn flags into a man page (dchristian) -Tue Jun 12 15:23:42 2007 Google Inc. +Wed Dec 13 12:37:19 2006 Google Inc. - * google-gflags: version 0.5 - * Include all m4 macros in the distribution (csilvers) - * Python: Fix broken data_files field in setup.py (sidlon) - * Python: better string serliaizing and unparsing (abo, csimmons) - * Fix checks for NaN and inf to work with Mac OS X (csilvers) + * google-gflags: initial release: + The gflags package contains a library that implements commandline + flags processing. As such it's a replacement for getopt(). It + has increased flexibility, including built-in support for C++ + types like string, and the ability to define flags in the source + file in which they're used. diff --git a/Makefile.am b/Makefile.am index 75249fc..577e9ee 100644 --- a/Makefile.am +++ b/Makefile.am @@ -31,7 +31,7 @@ lib_LTLIBRARIES = ## TESTS_ENVIRONMENT sets environment variables for when you run unittest, ## but it only seems to take effect for *binary* unittests (argh!) TESTS = -TESTS_ENVIRONMENT = +TESTS_ENVIRONMENT = SRCDIR="$(top_srcdir)" check_SCRIPTS = # Every time you add a unittest to check_SCRIPTS, add it here too noinst_SCRIPTS = @@ -53,10 +53,16 @@ gflags_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) gflags_unittest_LDFLAGS = $(PTHREAD_CFLAGS) gflags_unittest_LDADD = libgflags.la $(PTHREAD_LIBS) +# Also make sure this works when we don't link in pthreads +TESTS += gflags_nothreads_unittest +gflags_nothreads_unittest_SOURCES = $(gflags_unittest_SOURCES) +gflags_nothreads_unittest_LDADD = libgflags.la + check_SCRIPTS += gflags_unittest_sh noinst_SCRIPTS += src/gflags_unittest.sh +dist_noinst_DATA = $(top_srcdir)/src/gflags_unittest_flagfile gflags_unittest_sh: gflags_unittest - $(top_srcdir)/src/gflags_unittest.sh $(PWD)/$< + $(top_srcdir)/src/gflags_unittest.sh $(PWD)/$< $(top_srcdir) # These aren't part of the c++ source, but we want them to be distributed PYTHON = python/setup.py \ diff --git a/Makefile.in b/Makefile.in index ac7b793..e3af0ec 100644 --- a/Makefile.in +++ b/Makefile.in @@ -42,9 +42,9 @@ build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_1) DIST_COMMON = README $(am__configure_deps) $(dist_doc_DATA) \ - $(googleinclude_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/configure \ - $(top_srcdir)/src/config.h.in \ + $(dist_noinst_DATA) $(googleinclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/configure $(top_srcdir)/src/config.h.in \ $(top_srcdir)/src/google/gflags.h.in AUTHORS COPYING ChangeLog \ INSTALL NEWS compile config.guess config.sub depcomp \ install-sh ltmain.sh missing mkinstalldirs @@ -78,8 +78,14 @@ am__objects_1 = am_libgflags_la_OBJECTS = $(am__objects_1) libgflags_la-gflags.lo \ libgflags_la-gflags_reporting.lo libgflags_la_OBJECTS = $(am_libgflags_la_OBJECTS) -am__EXEEXT_1 = gflags_unittest$(EXEEXT) +am__EXEEXT_1 = gflags_unittest$(EXEEXT) \ + gflags_nothreads_unittest$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) +am__objects_2 = $(am__objects_1) gflags_unittest.$(OBJEXT) +am_gflags_nothreads_unittest_OBJECTS = $(am__objects_2) +gflags_nothreads_unittest_OBJECTS = \ + $(am_gflags_nothreads_unittest_OBJECTS) +gflags_nothreads_unittest_DEPENDENCIES = libgflags.la am_gflags_unittest_OBJECTS = $(am__objects_1) \ gflags_unittest-gflags_unittest.$(OBJEXT) gflags_unittest_OBJECTS = $(am_gflags_unittest_OBJECTS) @@ -104,10 +110,13 @@ LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libgflags_la_SOURCES) $(gflags_unittest_SOURCES) -DIST_SOURCES = $(libgflags_la_SOURCES) $(gflags_unittest_SOURCES) +SOURCES = $(libgflags_la_SOURCES) $(gflags_nothreads_unittest_SOURCES) \ + $(gflags_unittest_SOURCES) +DIST_SOURCES = $(libgflags_la_SOURCES) \ + $(gflags_nothreads_unittest_SOURCES) \ + $(gflags_unittest_SOURCES) dist_docDATA_INSTALL = $(INSTALL_DATA) -DATA = $(dist_doc_DATA) +DATA = $(dist_doc_DATA) $(dist_noinst_DATA) googleincludeHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(googleinclude_HEADERS) ETAGS = etags @@ -186,7 +195,7 @@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ -ac_cv___attribute__ = @ac_cv___attribute__@ +ac_cv___attribute__unused = @ac_cv___attribute__unused@ ac_cv_have___uint16 = @ac_cv_have___uint16@ ac_cv_have_inttypes_h = @ac_cv_have_inttypes_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ @@ -247,8 +256,10 @@ dist_doc_DATA = AUTHORS COPYING ChangeLog INSTALL NEWS README \ doc/designstyle.css doc/gflags.html lib_LTLIBRARIES = libgflags.la -TESTS = gflags_unittest -TESTS_ENVIRONMENT = + +# Also make sure this works when we don't link in pthreads +TESTS = gflags_unittest gflags_nothreads_unittest +TESTS_ENVIRONMENT = SRCDIR="$(top_srcdir)" check_SCRIPTS = gflags_unittest_sh # Every time you add a unittest to check_SCRIPTS, add it here too noinst_SCRIPTS = src/gflags_unittest.sh @@ -264,6 +275,9 @@ gflags_unittest_SOURCES = $(googleinclude_HEADERS) src/config.h \ gflags_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) gflags_unittest_LDFLAGS = $(PTHREAD_CFLAGS) gflags_unittest_LDADD = libgflags.la $(PTHREAD_LIBS) +gflags_nothreads_unittest_SOURCES = $(gflags_unittest_SOURCES) +gflags_nothreads_unittest_LDADD = libgflags.la +dist_noinst_DATA = $(top_srcdir)/src/gflags_unittest_flagfile # These aren't part of the c++ source, but we want them to be distributed PYTHON = python/setup.py \ @@ -366,6 +380,9 @@ clean-noinstPROGRAMS: echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done +gflags_nothreads_unittest$(EXEEXT): $(gflags_nothreads_unittest_OBJECTS) $(gflags_nothreads_unittest_DEPENDENCIES) + @rm -f gflags_nothreads_unittest$(EXEEXT) + $(CXXLINK) $(gflags_nothreads_unittest_LDFLAGS) $(gflags_nothreads_unittest_OBJECTS) $(gflags_nothreads_unittest_LDADD) $(LIBS) gflags_unittest$(EXEEXT): $(gflags_unittest_OBJECTS) $(gflags_unittest_DEPENDENCIES) @rm -f gflags_unittest$(EXEEXT) $(CXXLINK) $(gflags_unittest_LDFLAGS) $(gflags_unittest_OBJECTS) $(gflags_unittest_LDADD) $(LIBS) @@ -377,6 +394,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gflags_unittest-gflags_unittest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gflags_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgflags_la-gflags.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgflags_la-gflags_reporting.Plo@am__quote@ @@ -415,6 +433,20 @@ libgflags_la-gflags_reporting.lo: src/gflags_reporting.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgflags_la_CXXFLAGS) $(CXXFLAGS) -c -o libgflags_la-gflags_reporting.lo `test -f 'src/gflags_reporting.cc' || echo '$(srcdir)/'`src/gflags_reporting.cc +gflags_unittest.o: src/gflags_unittest.cc +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gflags_unittest.o -MD -MP -MF "$(DEPDIR)/gflags_unittest.Tpo" -c -o gflags_unittest.o `test -f 'src/gflags_unittest.cc' || echo '$(srcdir)/'`src/gflags_unittest.cc; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/gflags_unittest.Tpo" "$(DEPDIR)/gflags_unittest.Po"; else rm -f "$(DEPDIR)/gflags_unittest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/gflags_unittest.cc' object='gflags_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gflags_unittest.o `test -f 'src/gflags_unittest.cc' || echo '$(srcdir)/'`src/gflags_unittest.cc + +gflags_unittest.obj: src/gflags_unittest.cc +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gflags_unittest.obj -MD -MP -MF "$(DEPDIR)/gflags_unittest.Tpo" -c -o gflags_unittest.obj `if test -f 'src/gflags_unittest.cc'; then $(CYGPATH_W) 'src/gflags_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/gflags_unittest.cc'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/gflags_unittest.Tpo" "$(DEPDIR)/gflags_unittest.Po"; else rm -f "$(DEPDIR)/gflags_unittest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/gflags_unittest.cc' object='gflags_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gflags_unittest.obj `if test -f 'src/gflags_unittest.cc'; then $(CYGPATH_W) 'src/gflags_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/gflags_unittest.cc'; fi` + gflags_unittest-gflags_unittest.o: src/gflags_unittest.cc @am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gflags_unittest_CXXFLAGS) $(CXXFLAGS) -MT gflags_unittest-gflags_unittest.o -MD -MP -MF "$(DEPDIR)/gflags_unittest-gflags_unittest.Tpo" -c -o gflags_unittest-gflags_unittest.o `test -f 'src/gflags_unittest.cc' || echo '$(srcdir)/'`src/gflags_unittest.cc; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/gflags_unittest-gflags_unittest.Tpo" "$(DEPDIR)/gflags_unittest-gflags_unittest.Po"; else rm -f "$(DEPDIR)/gflags_unittest-gflags_unittest.Tpo"; exit 1; fi @@ -829,7 +861,7 @@ uninstall-am: uninstall-dist_docDATA uninstall-googleincludeHEADERS \ uninstall-libLTLIBRARIES gflags_unittest_sh: gflags_unittest - $(top_srcdir)/src/gflags_unittest.sh $(PWD)/$< + $(top_srcdir)/src/gflags_unittest.sh $(PWD)/$< $(top_srcdir) rpm: dist-gzip packages/rpm.sh packages/rpm/rpm.spec @cd packages && ./rpm.sh ${PACKAGE} ${VERSION} diff --git a/autogen.sh b/autogen.sh index 4d53592..bae2dd0 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,7 +1,7 @@ #!/bin/sh # Before using, you should figure out all the .m4 macros that your -# configure.m4 script needs and make sure they exist in the autoconf/ +# configure.m4 script needs and make sure they exist in the m4/ # directory. # # These are the files that this script might edit: diff --git a/configure b/configure index b129282..7f7da2a 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for gflags 0.5. +# Generated by GNU Autoconf 2.59 for gflags 0.6. # # Report bugs to . # @@ -423,8 +423,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='gflags' PACKAGE_TARNAME='gflags' -PACKAGE_VERSION='0.5' -PACKAGE_STRING='gflags 0.5' +PACKAGE_VERSION='0.6' +PACKAGE_STRING='gflags 0.6' PACKAGE_BUGREPORT='opensource@google.com' ac_unique_file="README" @@ -465,7 +465,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBTOOL_DEPS acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS ac_google_start_namespace ac_google_end_namespace ac_google_namespace ac_cv___attribute__ ac_cv_have_stdint_h ac_cv_have_systypes_h ac_cv_have_inttypes_h ac_cv_have_uint16_t ac_cv_have_u_int16_t ac_cv_have___uint16 LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBTOOL_DEPS acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS ac_google_start_namespace ac_google_end_namespace ac_google_namespace ac_cv___attribute__unused ac_cv_have_stdint_h ac_cv_have_systypes_h ac_cv_have_inttypes_h ac_cv_have_uint16_t ac_cv_have_u_int16_t ac_cv_have___uint16 LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -954,7 +954,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures gflags 0.5 to adapt to many kinds of systems. +\`configure' configures gflags 0.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1020,7 +1020,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of gflags 0.5:";; + short | recursive ) echo "Configuration of gflags 0.6:";; esac cat <<\_ACEOF @@ -1163,7 +1163,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -gflags configure 0.5 +gflags configure 0.6 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. @@ -1177,7 +1177,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by gflags $as_me 0.5, which was +It was created by gflags $as_me 0.6, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1823,7 +1823,7 @@ fi # Define the identity of the package. PACKAGE='gflags' - VERSION='0.5' + VERSION='0.6' cat >>confdefs.h <<_ACEOF @@ -19630,6 +19630,13 @@ _ACEOF echo "$as_me:$LINENO: result: $ac_cv___attribute__" >&5 echo "${ECHO_T}$ac_cv___attribute__" >&6 +# We only care about __attribute__ ((unused)) +if test x"$ac_cv___attribute__" = x"yes"; then + ac_cv___attribute__unused="__attribute__ ((unused))" +else + ac_cv___attribute__unused= +fi + @@ -19985,10 +19992,12 @@ echo "${ECHO_T}${flag}" >&6 LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" - - # More AIX lossage: must compile with cc_r - # Extract the first word of "cc_r", so it can be a program name with args. -set dummy cc_r; ac_word=$2 + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + for ac_prog in xlc_r cc_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then @@ -20004,14 +20013,13 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PTHREAD_CC="cc_r" + ac_cv_prog_PTHREAD_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done - test -z "$ac_cv_prog_PTHREAD_CC" && ac_cv_prog_PTHREAD_CC="${CC}" fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC @@ -20023,17 +20031,26 @@ else echo "${ECHO_T}no" >&6 fi + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" + + else + PTHREAD_CC=$CC + fi # The next part tries to detect GCC inconsistency with -shared on some # architectures and systems. The problem is that in certain # configurations, when -shared is specified, GCC "forgets" to # internally use various flags which are still necessary. - # First, check whether caller wants us to skip -shared checks - # this is useful echo "$as_me:$LINENO: checking whether to check for GCC pthread/shared inconsistencies" >&5 echo $ECHO_N "checking whether to check for GCC pthread/shared inconsistencies... $ECHO_C" >&6 - if test x"$GCC" != xyes; then + check_inconsistencies=yes + case "${host_cpu}-${host_os}" in + *-darwin*) check_inconsistencies=no ;; + esac + if test x"$GCC" != xyes -o "x$check_inconsistencies" != xyes ; then echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 else @@ -20926,7 +20943,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by gflags $as_me 0.5, which was +This file was extended by gflags $as_me 0.6, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20989,7 +21006,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -gflags config.status 0.5 +gflags config.status 0.6 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" @@ -21261,7 +21278,7 @@ s,@PTHREAD_CFLAGS@,$PTHREAD_CFLAGS,;t t s,@ac_google_start_namespace@,$ac_google_start_namespace,;t t s,@ac_google_end_namespace@,$ac_google_end_namespace,;t t s,@ac_google_namespace@,$ac_google_namespace,;t t -s,@ac_cv___attribute__@,$ac_cv___attribute__,;t t +s,@ac_cv___attribute__unused@,$ac_cv___attribute__unused,;t t s,@ac_cv_have_stdint_h@,$ac_cv_have_stdint_h,;t t s,@ac_cv_have_systypes_h@,$ac_cv_have_systypes_h,;t t s,@ac_cv_have_inttypes_h@,$ac_cv_have_inttypes_h,;t t diff --git a/configure.ac b/configure.ac index d6326b6..0e363a6 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ # make sure we're interpreted by some minimal autoconf AC_PREREQ(2.57) -AC_INIT(gflags, 0.5, opensource@google.com) +AC_INIT(gflags, 0.6, opensource@google.com) # The argument here is just something that should be in the current directory # (for sanity checking) AC_CONFIG_SRCDIR(README) @@ -38,6 +38,13 @@ AC_CHECK_FUNCS(strtoll) AC_CHECK_FUNCS(strtoq) AX_C___ATTRIBUTE__ +# We only care about __attribute__ ((unused)) +if test x"$ac_cv___attribute__" = x"yes"; then + ac_cv___attribute__unused="__attribute__ ((unused))" +else + ac_cv___attribute__unused= +fi + ACX_PTHREAD # Find out what namespace 'normal' STL code lives in, and also what namespace @@ -49,7 +56,7 @@ AC_DEFINE_GOOGLE_NAMESPACE(google) AC_SUBST(ac_google_start_namespace) AC_SUBST(ac_google_end_namespace) AC_SUBST(ac_google_namespace) -AC_SUBST(ac_cv___attribute__) +AC_SUBST(ac_cv___attribute__unused) AC_SUBST(ac_cv_have_stdint_h) AC_SUBST(ac_cv_have_systypes_h) AC_SUBST(ac_cv_have_inttypes_h) diff --git a/m4/acx_pthread.m4 b/m4/acx_pthread.m4 index 919b912..f5db4f0 100644 --- a/m4/acx_pthread.m4 +++ b/m4/acx_pthread.m4 @@ -1,5 +1,5 @@ # This was retrieved from -# http://0pointer.de/cgi-bin/viewcvs.cgi/trunk/common/acx_pthread.m4?rev=1220 +# http://0pointer.de/cgi-bin/viewcvs.cgi/trunk/common/acx_pthread.m4?rev=1227 # See also (perhaps for new versions?) # http://0pointer.de/cgi-bin/viewcvs.cgi/trunk/common/acx_pthread.m4 @@ -48,7 +48,7 @@ dnl We are also grateful for the helpful feedback of numerous users. dnl dnl @category InstalledPackages dnl @author Steven G. Johnson -dnl @version 2005-06-15 +dnl @version 2006-05-29 dnl @license GPLWithACException dnl dnl Checks for GCC shared/pthread inconsistency based on work by @@ -224,19 +224,24 @@ if test "x$acx_pthread_ok" = xyes; then LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" - - # More AIX lossage: must compile with cc_r - AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi # The next part tries to detect GCC inconsistency with -shared on some # architectures and systems. The problem is that in certain # configurations, when -shared is specified, GCC "forgets" to # internally use various flags which are still necessary. - # First, check whether caller wants us to skip -shared checks - # this is useful AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) - if test x"$GCC" != xyes; then + check_inconsistencies=yes + case "${host_cpu}-${host_os}" in + *-darwin*) check_inconsistencies=no ;; + esac + if test x"$GCC" != xyes -o "x$check_inconsistencies" != xyes ; then AC_MSG_RESULT([no]) else AC_MSG_RESULT([yes]) diff --git a/packages/deb/changelog b/packages/deb/changelog index 571c73b..da02a1e 100644 --- a/packages/deb/changelog +++ b/packages/deb/changelog @@ -1,3 +1,16 @@ +google-gflags (0.6-2) unstable; urgency=low + + * Somehow 0.6-1 was missing the lib* control files, so the .deb produced + was empty. Fix that to get an actual valid .deb file. + + -- Google Inc. Wed, 15 Aug 2007 12:32:01 -0700 + +google-gflags (0.6-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Wed, 15 Aug 2007 07:35:51 -0700 + google-gflags (0.5-1) unstable; urgency=low * New upstream release. diff --git a/python/setup.py b/python/setup.py index 25660d0..8af83a2 100755 --- a/python/setup.py +++ b/python/setup.py @@ -32,7 +32,7 @@ from distutils.core import setup setup(name='gflags', - version='0.5', + version='0.6', description='Google Commandline Flags Module', license='BSD', author='Google Inc.', diff --git a/src/gflags.cc b/src/gflags.cc index 54956a3..1210434 100644 --- a/src/gflags.cc +++ b/src/gflags.cc @@ -367,27 +367,20 @@ CommandLineFlag::~CommandLineFlag() { const char* CommandLineFlag::CleanFileName() const { // Compute top-level directory & file that this appears in - // search full path backwards. Set kMaxSlashes = 5, - // as the current code has <= 4 levels of dirs. - // E.g. .../froogle/wrapping/autowrap/clustering/*.cc - // Also, stop going backwards at "/google3/"; and skip by the first slash. + // search full path backwards. + // Stop going backwards at kGoogle; and skip by the first slash. // E.g. // filename_where_defined = "froogle/wrapping/autowrap/clustering/**.cc" // filename_where_defined = "file/util/fileutil.cc" - static const int kMaxSlashes = 5; // one more than max dir levels static const char kGoogle[] = ""; // can set this to whatever if (sizeof(kGoogle)-1 == 0) // no prefix to strip return filename(); const char* clean_name = filename() + strlen(filename()) - 1; - int slashes = 0; while ( clean_name > filename() ) { if (*clean_name == PATH_SEPARATOR) { - ++slashes; - if (slashes == kMaxSlashes) { - break; // no dirs now are deeper than this - } else if (strncmp(clean_name, kGoogle, sizeof(kGoogle)-1) == 0) { + if (strncmp(clean_name, kGoogle, sizeof(kGoogle)-1) == 0) { // ".../google/base/logging.cc" ==> "base/logging.cc" clean_name += sizeof(kGoogle)-1; // past "/google/" break; @@ -486,6 +479,7 @@ class FlagRegistry { pthread_mutex_t lock_; static FlagRegistry* global_registry_; // a singleton registry static pthread_once_t global_registry_once_; + static int global_registry_once_nothreads_; // when we don't link pthreads static void InitGlobalRegistry(); @@ -636,13 +630,21 @@ bool FlagRegistry::SetFlagLocked(CommandLineFlag* flag, // Get the singleton FlagRegistry object FlagRegistry* FlagRegistry::global_registry_ = NULL; pthread_once_t FlagRegistry::global_registry_once_ = PTHREAD_ONCE_INIT; +int FlagRegistry::global_registry_once_nothreads_ = 0; void FlagRegistry::InitGlobalRegistry() { global_registry_ = new FlagRegistry; } +// We want to use pthread_once here, for safety, but have to worry about +// whether libpthread is linked in or not. FlagRegistry* FlagRegistry::GlobalRegistry() { - pthread_once(&global_registry_once_, &FlagRegistry::InitGlobalRegistry); + if (pthread_once) { // means we're running with pthreads + pthread_once(&global_registry_once_, &FlagRegistry::InitGlobalRegistry); + } else { // not running with pthreads: we're the only thread + if (global_registry_once_nothreads_++ == 0) + InitGlobalRegistry(); + } return global_registry_; } diff --git a/src/gflags_unittest.cc b/src/gflags_unittest.cc index b594581..3ec0333 100644 --- a/src/gflags_unittest.cc +++ b/src/gflags_unittest.cc @@ -46,9 +46,16 @@ using std::vector; using std::string; +// Returns the number of elements in an array. We don't use the safer +// version in base/basictypes.h as commandlineflags is open-sourced. +#define GET_ARRAY_SIZE(arr) (sizeof(arr)/sizeof(*(arr))) + DECLARE_string(tryfromenv); // in commandlineflags.cc DEFINE_string(test_tmpdir, "/tmp/gflags_unittest", "Dir we use for temp files"); +DEFINE_string(srcdir, google::StringFromEnv("SRCDIR", "."), + "Source-dir root, needed to find gflags_unittest_flagfile"); + DEFINE_bool(test_bool, false, "tests bool-ness"); DEFINE_int32(test_int32, -1, ""); @@ -964,7 +971,7 @@ TEST(DeprecatedFunctionsTest, ReadFromFlagsFile) { r = ReadFromFlagsFile(filename, GetArgv0(), true); EXPECT_EQ(true, r); EXPECT_EQ(-10, FLAGS_test_int32); -} // unnamed namespace +} TEST(DeprecatedFunctionsTest, ReadFromFlagsFileFailure) { FLAGS_test_int32 = -20; @@ -985,13 +992,114 @@ TEST(FlagsSetBeforeInitGoogleTest, TryFromEnv) { EXPECT_EQ("pre-set", FLAGS_test_tryfromenv); } +// The following test case verifies that ParseCommandLineFlags() and +// ParseCommandLineNonHelpFlags() uses the last definition of a flag +// in case it's defined more than once. + +DEFINE_int32(test_flag, -1, "used for testing commandlineflags.cc"); + +// Returns the definition of the --flagfile flag to be used in the tests. +const char* GetFlagFileFlag() { + static const string flagfile_flag = string("--flagfile=") + + FLAGS_srcdir + "/src/gflags_unittest_flagfile"; + + return flagfile_flag.c_str(); +} + +// Parses and returns the --test_flag flag. +// If with_help is true, calls ParseCommandLineFlags; otherwise calls +// ParseCommandLineNonHelpFlags. +int32 ParseTestFlag(bool with_help, int argc, const char** const_argv) { + FlagSaver fs; // Restores the flags before returning. + + // Makes a copy of the input array s.t. it can be reused + // (ParseCommandLineFlags() will alter the array). + char** const argv_save = new char*[argc + 1]; + char** argv = argv_save; + memcpy(argv, const_argv, sizeof(*argv)*(argc + 1)); + + if (with_help) { + ParseCommandLineFlags(&argc, &argv, true); + } else { + ParseCommandLineNonHelpFlags(&argc, &argv, true); + } + + delete[] argv_save; + return FLAGS_test_flag; +} + +TEST(ParseCommandLineFlagsUsesLastDefinitionTest, + WhenFlagIsDefinedTwiceOnCommandLine) { + const char* argv[] = { + "my_test", + "--test_flag=1", + "--test_flag=2", + NULL, + }; + + EXPECT_EQ(2, ParseTestFlag(true, GET_ARRAY_SIZE(argv) - 1, argv)); + EXPECT_EQ(2, ParseTestFlag(false, GET_ARRAY_SIZE(argv) - 1, argv)); +} + +TEST(ParseCommandLineFlagsUsesLastDefinitionTest, + WhenFlagIsDefinedTwiceInFlagFile) { + const char* argv[] = { + "my_test", + GetFlagFileFlag(), + NULL, + }; + + EXPECT_EQ(2, ParseTestFlag(true, GET_ARRAY_SIZE(argv) - 1, argv)); + EXPECT_EQ(2, ParseTestFlag(false, GET_ARRAY_SIZE(argv) - 1, argv)); +} + +TEST(ParseCommandLineFlagsUsesLastDefinitionTest, + WhenFlagIsDefinedInCommandLineAndThenFlagFile) { + const char* argv[] = { + "my_test", + "--test_flag=0", + GetFlagFileFlag(), + NULL, + }; + + EXPECT_EQ(2, ParseTestFlag(true, GET_ARRAY_SIZE(argv) - 1, argv)); + EXPECT_EQ(2, ParseTestFlag(false, GET_ARRAY_SIZE(argv) - 1, argv)); +} + +TEST(ParseCommandLineFlagsUsesLastDefinitionTest, + WhenFlagIsDefinedInFlagFileAndThenCommandLine) { + const char* argv[] = { + "my_test", + GetFlagFileFlag(), + "--test_flag=3", + NULL, + }; + + EXPECT_EQ(3, ParseTestFlag(true, GET_ARRAY_SIZE(argv) - 1, argv)); + EXPECT_EQ(3, ParseTestFlag(false, GET_ARRAY_SIZE(argv) - 1, argv)); +} + +TEST(ParseCommandLineFlagsUsesLastDefinitionTest, + WhenFlagIsDefinedInCommandLineAndFlagFileAndThenCommandLine) { + const char* argv[] = { + "my_test", + "--test_flag=0", + GetFlagFileFlag(), + "--test_flag=3", + NULL, + }; + + EXPECT_EQ(3, ParseTestFlag(true, GET_ARRAY_SIZE(argv) - 1, argv)); + EXPECT_EQ(3, ParseTestFlag(false, GET_ARRAY_SIZE(argv) - 1, argv)); +} + static int Main(int argc, char **argv) { // We need to call SetArgv before InitGoogle, so our "test" argv will // win out over this executable's real argv. That makes running this // test with a real --help flag kinda annoying, unfortunately. const char* test_argv[] = { "/test/argv/for/gflags_unittest", "argv 2", "3rd argv", "argv #4" }; - SetArgv(sizeof(test_argv)/sizeof(*test_argv), test_argv); + SetArgv(GET_ARRAY_SIZE(test_argv), test_argv); // The first arg is the usage message, also important for testing. string usage_message = (string(GetArgv0()) + diff --git a/src/gflags_unittest.sh b/src/gflags_unittest.sh index 68dc353..76d63b3 100755 --- a/src/gflags_unittest.sh +++ b/src/gflags_unittest.sh @@ -38,12 +38,13 @@ if [ -z "$1" ] then - echo "USAGE: $0 [tmpdir]" + echo "USAGE: $0 [top_srcdir] [tmpdir]" exit 1 fi EXE=$1 -TMPDIR=${2:-/tmp/gflags} +SRCDIR=${2:-./} +TMPDIR=${3:-/tmp/gflags} # $1: line-number $2: expected return code. $3: substring of expected output. # $4: a substring you *don't* expect to find in the output. $5+ flags @@ -57,7 +58,8 @@ Expect() { local unexpected_output="$1" shift - $EXE "$@" > "$TMPDIR/test.$line_number" 2>&1 + # We always add --srcdir=$SRCDIR because it's needed for correctness + $EXE --srcdir="$SRCDIR" "$@" > "$TMPDIR/test.$line_number" 2>&1 local actual_rc=$? if [ $actual_rc != $expected_rc ]; then echo "Test on line $line_number failed:" \ diff --git a/src/gflags_unittest_flagfile b/src/gflags_unittest_flagfile new file mode 100644 index 0000000..f4fa0c4 --- /dev/null +++ b/src/gflags_unittest_flagfile @@ -0,0 +1,2 @@ +--test_flag=1 +--test_flag=2 diff --git a/src/google/gflags.h.in b/src/google/gflags.h.in index 5b9519e..8dc257a 100644 --- a/src/google/gflags.h.in +++ b/src/google/gflags.h.in @@ -197,9 +197,6 @@ extern std::string SetCommandLineOptionWithMode(const char* name, const char* va // usage example above, the compiler would complain that it's an // unused variable. -// This is a trick to work with autoconf, which sets a var to "yes" or "no" -#define HAVE___ATTRIBUTE__yes 1 // will only be referenced if autoconf says yes - class FlagSaver { public: FlagSaver(); @@ -210,19 +207,14 @@ class FlagSaver { FlagSaver(const FlagSaver&); // no copying! void operator=(const FlagSaver&); -} -// swig seems to have trouble with __attribute__ for some reason -#if !defined SWIG && defined HAVE___ATTRIBUTE__@ac_cv___attribute__@ -__attribute__ ((unused)) -#endif -; +} @ac_cv___attribute__unused@; // -------------------------------------------------------------------- // Some deprecated or hopefully-soon-to-be-deprecated functions. // This is often used for logging. TODO(csilvers): figure out a better way extern std::string CommandlineFlagsIntoString(); -// DEPRECATED. Usually where this is used, a FlagSaver should be used instead. +// Usually where this is used, a FlagSaver should be used instead. extern bool ReadFlagsFromString(const std::string& flagfilecontents, const char* prog_name, bool errors_are_fatal); // uses SET_FLAGS_VALUE @@ -263,6 +255,8 @@ extern void SetUsageMessage(const std::string& usage); // Looks for flags in argv and parses them. Rearranges argv to put // flags first, or removes them entirely if remove_flags is true. +// If a flag is defined more than once in the command line or flag +// file, the last definition is used. // See top-of-file for more details on this function. #ifndef SWIG // In swig, use ParseCommandLineFlagsScript() instead. extern uint32 ParseCommandLineFlags(int *argc, char*** argv, @@ -277,6 +271,8 @@ extern uint32 ParseCommandLineFlags(int *argc, char*** argv, // e.g. SetCommandLineOptionWithMode calls) between the time of // command line parsing and the time of dumping help information for // the flags as a result of command line parsing. +// If a flag is defined more than once in the command line or flag +// file, the last definition is used. extern uint32 ParseCommandLineNonHelpFlags(int *argc, char*** argv, bool remove_flags); // This is actually defined in commandlineflags_reporting.cc. @@ -360,7 +356,7 @@ class FlagRegisterer { new (dfl_##name.store) namespc type(value)); \ namespc type& FLAGS_##name = \ *(reinterpret_cast(cur_##name.store)); \ - char FLAGS_no##name; \ + char FLAGS_no##name @ac_cv___attribute__unused@; \ } \ using Flag_Names_##type::FLAGS_##name