On the advice of Bernard Li, I have posted the patch (and a copy of its 
associated walk-through) to the Ganglia Bugzilla:

    http://bugzilla.ganglia.info/cgi-bin/bugzilla/show_bug.cgi?id=112

Below is a full copy of the original post, sans patch, for completeness. 
(The original post has been cancelled out of the moderator queue.)


>From [EMAIL PROTECTED] Fri Aug 25 05:34:01 2006
Date: Sat, 12 Aug 2006 02:22:01 -0400
From: "Daniel Richard G." <[EMAIL PROTECTED]>
To: ganglia-developers@lists.sourceforge.net
Subject: [PATCH] General cleanup
Message-ID: <[EMAIL PROTECTED]>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Status: RO
Content-Length: 12329
Lines: 386

Hello all,

Attached is an omnibus patch (against SVN) that addresses numerous issues 
in the source tree, most notably those of portability. I was attempting to 
set up Ganglia on a compile farm of various Unices, and fixed each problem 
as I encountered it. Problems with the use of Autoconf/Automake are also 
addressed, along with some miscellany here and there.

Below follows a walkthrough of the patch...


monitor-core/configure.in:

* Enable --enable-maintainer-mode switch, so that we can use "if 
  MAINTAINER_MODE" in Makefile.am later on.

* Use --with-gmetad when running "make distcheck", for completeness.
  (Ganglia is now fairly close to passing "make distcheck")

* Don't invoke configure scripts directly. The correct way to handle these 
  is with AC_CONFIG_SUBDIRS(). (I would hardcode the --disable-nls setting 
  for srclib/confuse)

* All -Dxxx directives belong in CPPFLAGS, not CFLAGS.

* Check for the proper form of the "const" and "inline" keywords. (E.g. the
  latter could be "__inline" in some cases)

* Use the standard Autoconf-provided GCC variable to check for gcc.

* Removed the -Wall bit, as it's already added in the aforementioned GCC
  conditional.

* Specify -D_POSIX_C_SOURCE=... and -D_BSD_SOURCE feature test macros to 
  allow Linux ANSI builds to work.

* Always use -D__EXTENSIONS__ on Solaris, otherwise you miss out on a lot 
  of useful bits. Don't define __STDC__; the proper way is to use 
  -Xc/-ansi, but strict ANSI on Solaris is a bit much. (I've confirmed that 
  ganglia builds fine with both cc and gcc, using this setting.)

* Removed what looks like a redundant bit in the FreeBSD case (-pthread and 
  -D_REENTRANT are used no matter what)

* Output web/Makefile, since we're going to need it.

monitor-core/scripts/svn2cl.sh:

* Use $SVN if set in the environment. Not a big deal, but my default 
  Subversion install lacked SSL support, so this was a nice way to handle 
  that.

monitor-core/gmetric/Makefile.am:

* All -Ixxx flags should be assigned to AM_CPPFLAGS, not AM_CFLAGS.

* Use $(top_srcdir) instead of "..", so that out-of-source-tree builds 
  work.

monitor-core/gmetad/gmetad.c:

* Was missing the all-important include<config.h>.

monitor-core/gmetad/gmetad.h,
monitor-core/gmetad/rrd_helpers.c,
monitor-core/gmetad/conf.c:

* Minor stuff.

monitor-core/gmetad/cleanup.c:

* No need for the lib/ prefix there, as you already have 
  -I$(top_srcdir)/lib in the makefile

monitor-core/gmetad/Makefile.am:

* -Ixxx directives in AM_CPPFLAGS, not AM_CFLAGS

* Use -I$(top_srcdir)/... instead of -I$(top_builddir)/..., because the 
  required files are not generated.

* Don't specify -O0 in this file. That doesn't belong here.

* Conditionalize the gmetad build using Automake conditionals, instead of 
  tinkering with SUBDIRS in the parent makefile.

monitor-core/gmond/gstat/Makefile.am:

* Switched the -Ixxx directives to use $(top_srcdir) instead of 
  $(top_builddir), so that out-of-source-tree builds work

monitor-core/gmond/gmond.c:

* Don't use C++ comments in C code.

* Can't declare a variable-size array, so use good ol' malloc() instead.
  Swapped out "return" for "goto cleanup", so that the memory always gets 
  free()d at the end.

monitor-core/gmond/Makefile.am:

* Fixed up the -Ixxx directives for out-of-source-tree builds.

monitor-core/lib/protocol.x:

* Pull in config.h, as the source code made from this file is 
  platform-sensitive.

* Get rid of the register keyword, as it's pretty much useless nowadays 
  (and unavailable in ANSI mode)

monitor-core/lib/Makefile.am:

* Fixed up the include directives for out-of-source-tree builds.

* You can't use $< in a non-implicit rule. GNU Make allows it, but most 
  other make(1) programs don't.

* Specify libganglia's inter-library dependencies via libganglia_la_LIBADD. 
  This way, you can just link against -lganglia, and not have to worry 
  about the rest.

monitor-core/acinclude.m4:

* When you use AC_DEFUN(), you have to quote the name of the new macro or 
  else aclocal(1) complains.

monitor-core/Makefile.am:

* Do not conditionalize the value of SUBDIRS. This is messy and just asking 
  for trouble.

* Added the "web" subdirectory to SUBDIRS, as that is now handled in the 
  standard way.

* Specify EXTRA_DIST explicitly---don't say "mans", say "mans/gmetad.1 ..."

* Surrounded the Changelog double-colon rule with "if MAINTAINER_MODE", so 
  that non-GNU Makes are unlikely to see it.

* The dist-hook and distclean-local bits are no longer needed. Will get 
  back to this further down...

monitor-core/ganglia-config.in:

* Put in a dummy substitution for @datarootdir@, just to shut up 
  config.status when it runs.

monitor-core/web/Makefile.am:

* Distribute the files here using EXTRA_DIST. A bit more verbose, a lot 
  less trouble.

* Trimmed the width of the "install" target message a bit. (The ==== lines 
  were 81 characters long... not very neat-looking)

* Chucked the dist-hook rule. (Not even updated since ganglia lived in 
  CVS...)

monitor-core/bootstrap:

* Don't cd all over the place; just do "(cd subdir && whatever)". Much 
  easier to keep track of things that way.

* Don't put everything in a giant "&&" chain; just use "set -e".

monitor-core/srclib/expat/lib/Makefile.in:

* Don't pass -rpath to libtool when linking the library. This informs
  Libtool that the shared library won't be installed, and so when 
  libganglia links to it, it'll actually pull in the component object files 
  of libexpat instead of making reference to the library itself. This is 
  necessary because libexpat is never actually installed.

monitor-core/srclib/expat/lib/expat.h:

*** This file should not be in SVN ***, as it is produced from expat.h.in 
by config.status.

monitor-core/srclib/apr/configure.in:

* Don't pass -rpath to libtool.

monitor-core/srclib/confuse/m4/check.m4:

* More AC_DEFUN() argument quoting.

monitor-core/srclib/confuse/src/lexer.c:

* Not a good idea to have this file in SVN.

monitor-core/srclib/confuse/src/confuse.c:

* Need locale.h to build on... damn, forgot which Unix this was on now....

monitor-core/srclib/confuse/src/Makefile.am:

* Specify libconfuse.la as noinst. This is the clean way of preventing
  -rpath from being passed to libtool.

* Variable/rule tweaks to work with Automake's built-in lex know-how.

monitor-core/srclib/confuse/src/lexer.l:

* YY_PROTO() is not defined, and since K&R compilers probably don't need to
  be supported, good riddance.

monitor-core/srclib/confuse/configure.ac:

* Removed AC_DISABLE_SHARED, as this gets in the way of building a shared 
  libganglia. (Fails when libtool tries to pull in a static libconfuse.a 
  into a shared libganglia.so, although not on Linux/x86)

monitor-core/srclib/confuse/doc/listing5.c,
monitor-core/srclib/confuse/doc/listing8.c,
monitor-core/srclib/confuse/examples/ftpconf.c,
monitor-core/srclib/confuse/examples/reread.c,
monitor-core/srclib/confuse/examples/simple.c:

* I think it was Tru64 that didn't allow initializing an array of structs 
  unless the array was declared static. Sad, eh?

(I don't remember now which system needed the changes made to simple.c... 
I'll need to double-check that.)

monitor-core/srclib/confuse/doc/html/*:

* These files really shouldn't be in SVN.

monitor-core/srclib/confuse/doc/Makefile.am:

* Don't just "cp -pr" these directories, because that potentially copies
  over SVN version data and other random crud into the tarball.

monitor-core/srclib/confuse/Makefile.am:

* Is there any need for this dist-hook?

monitor-core/srclib/Makefile.am:

* Instead of using a dist-hook target to take care of putting apr and expat 
  into the tarball, just use a big EXTRA_DIST. It works fine. libmetrics 
  and confuse can be handled by the DIST_SUBDIRS mechanism.

* Defined some additional dummy targets that should not recurse. Prefixed 
  the echo(1) commands with @ for neatness.

monitor-core/srclib/libmetrics/libmetrics.h:

* Some general reorganization, so that things occur in the approximate 
  order that they usually do.

* The whole rpl_malloc hack is a bad idea. (Anything that re-#defines a 
  C library function is _evil_.) Instead, define lm_malloc() and 
  lm_realloc(), and have the metrics code use them exclusively. If we're 
  using glibc, then the two functions are straight aliases for malloc() and 
  realloc(). If not, then they go to wrapper functions that yield the 
  desired "GNU-compatible" behavior.

monitor-core/srclib/libmetrics/tests/test-metrics.c:

* You need _something_ for that third field....

monitor-core/srclib/libmetrics/tests/Makefile.am:

* Added -I$(top_srcdir) for libmetrics.h

* Removed the dependency on libganglia

monitor-core/srclib/libmetrics/freebsd/metrics.c:

* Tweaks to allow building on FreeBSD 4.0

* A slightly less awkward way of avoiding the conflicting "struct pmap" 
  definitions

* Use lm_malloc() instead of malloc()

monitor-core/srclib/libmetrics/solaris/metrics.c:

* No C++ comments in C code!

* Use lm_malloc() instead of malloc()

monitor-core/srclib/libmetrics/hpux/metrics.c:

* Give proper command line, with CPPFLAGS

* Fixed the signatures of cpu_aidle_func() and swap_free_func()

monitor-core/srclib/libmetrics/configure.in:

* Don't use AC_FUNC_MALLOC or AC_FUNC_REALLOC, as these do the evil 
  re-#define-itions.

* Use -D_BSD_SOURCE on Linux, as some bits need it when building in ANSI 
  mode.

* Use CPPFLAGS instead of CFLAGS for -Dxxx directives.

* Same deal with using one set of Solaris flags instead of two.

monitor-core/srclib/libmetrics/osf/metrics.c:

* No C++ comments in C code!

* Straightened out a string with an embedded newline. (Trimmed the trailing 
  whitespace too)

* My system (Digital UNIX V4.0G) doesn't have a "mhz" field in struct
  tbl_processor. You'll need to write the test that sets HAVE_CPUINFO_MHZ 
  when appropriate.

monitor-core/srclib/libmetrics/stamp-h1:

*** This file should not be in SVN ***

monitor-core/srclib/libmetrics/linux/metrics.c:

* Use lm_malloc(), fix C++ comments

monitor-core/srclib/libmetrics/file.c,
monitor-core/srclib/libmetrics/file.h:

* Imported from libganglia, to break the circular dependency

monitor-core/srclib/libmetrics/cygwin/metrics.c:

* Use lm_malloc()

monitor-core/srclib/libmetrics/get_ifi_info.c:

* Not all systems have SIOCGIFMTU.

monitor-core/srclib/libmetrics/Makefile.am:

* Reformatted for clarity.

monitor-core/srclib/libmetrics/libmetrics.c:

* Define lm_malloc()/lm_realloc() if needed


Some observations/comments:

* libmetrics is a bit awkwardly placed inside the srclib directory. Why not 
  move it up to the top-level directory, as a peer to gmond/gmetad/etc.? 
  Seems a bit odd to treat it as a third-party library, when it clearly is 
  not.

* There are a _lot_ of generated files in SVN (Makefile.in, configure, 
  config.h.in, Doxygen output et al.)... this is really annoying to work 
  with. (Spurious M-flagged files, lots of crud to trim from patches, etc.)

* libmetrics/Makefile.am shouldn't be assigning @OS@ to SUBDIRS; Automake 
  conditionals better solve the problem of which platform-specific library 
  to build. Felt too lazy to do this myself :]

* The top-level configure script shoud enable the gmetad build with 
  --enable-gmetad, not --with-gmetad. The --with-* options are 
  conventionally used for specifying the use of external 
  libraries/programs, whereas --enable-* typically toggles a self-contained 
  feature.

* It would be very good to get Ganglia to the point where "make distcheck" 
  passes, because then it will be straightforward to check that all the 
  Automake rules are in order. Mainly, it was weirdness with the XML 
  documentation tools that tripped me up; I'm not familiar with those. At 
  the very least, "make dist" works better now, and out-of-source-tree 
  builds are now possible.


I'll be happy to answer any questions concerning these changes. Thanks to 
everyone here for this most useful suite!


--Daniel


-- 
NAME   = Daniel Richard G.       ##  Remember, skunks       _\|/_  meef?
EMAIL1 = [EMAIL PROTECTED]        ##  don't smell bad---    (/o|o\) /
EMAIL2 = [EMAIL PROTECTED]      ##  it's the people who   < (^),>
WWW    = http://www.******.org/  ##  annoy them that do!    /   \
--
(****** = site not yet online)

Reply via email to