Dear netCDf-users,
there was another question concerning netCDF and Linux - and since
I'm using netCDF's on various platforms including Linux I thought
someone might be interested in the following...
First, I had no difficulties at all to compile netCDF 2.4 beta 6
on Linux (Slackware 3.0 with ELF), and the binaries pass all tests
provided with the distribution.
Then, to include Fortran support, it is sufficient to add a symbolic link
linux.m4 -> f2c.m4
in the `src/fortran' subdirectory before starting the compiling. A script
named `f77' should be available that drives f2c (there is one in the
standard Slackware). As far as I remember the `f2c.m4' file was provided
by myself a year ago or so, and it still works without problems. I actually
worked with an older version (2.3.2) for a long time on both Linux and
Solaris (with f2c instead of a real Fortran compiler), and I never
experienced any problems with the fortran interface.
A note concerning g77: Currently, g77 does not support the byte type, so
I have not yet written an m4-file for this compiler; however, since it
uses the same naming conventions as f2c, they probably will not differ
too much. I might look into this as soon as g77 supports byte and
integer*2...
Finally, Linux now uses the ELF library format (which is available with
Slackware 3.0), providing a simple way to build and use shared libraries.
This reduces the disk space needed by binaries; especially large sets of
programs like GMT will benefit from their availability. I therefore build
a set of ELF shared libraries and patched the Makefiles (or better the
`Makefile.in' and `master.mk.in' files in the distribution of netCDF 2.4b6)
in order to build shared and static libraries. I'll append the diffs at the
end of this mail.
To apply these:
- Untar the netCDF 2.4 beta 6 source code tree from the tar-file;
- apply the patches _without_ cd'ing into the netCDF tree with
patch < file_with_diffs ;
- cd to netcdf-2.4-beta6/src/fortran and add the necessary link
for the fortran interface with the command
ln -s f2c.m4 linux.m4 ;
- run `configure' in the netcdf-2.4-beta6/src subdirectory;
- run `make' and `make test' and `make install'.
Some (now really final) remarks:
c++: I don't know too much about c++, so I just can state that all tests
during `make test' are passed succesfully;
IEEE: For some reason, configure does not detect the correct options to
enable IEEE arithmetic under Linux. It can be enabled using the
`-lieee' option at linktime (i.e., by linking with the `libieee.a'
library). This (and the compilation with 486 optimizations) can be
enforced by calling configure with
CCFLAGS='-m486 -lieee' configure
which will, however, give rise to a warning message during the
compilation of each individual source code file (which can be ignored).
For those who do not like to compile their own version I have prepared
a tar file containing the libraries (static and shared), the ncdump and
ncgen progs, include files and documentation (man pages and info files)
which can easily be installed with Slackware's `installpkg'. They have been
build with `-m486', and they support IEEE arithmatic. Currently, they can
be obtained via anonymous ftp from
strat06.met.fu-berlin.de (160.45.75.6)
^
|
a `zero'
in the pub/netcdf directory. Along with the binary distribution you'll
find the appended diffs, a copy of this mail and another package with
a few contributed programs (nccat, gennet, ncrename, and ncks) which are
linked against the shared libraries.
I do not know how much interest there is in Linux binaries, but I could
continue to provide binary versions of the current netCDF release in static
and shared versions. If enough people think this would be useful, I would
be really thankful if someone could provide an anonymous ftp server;
strat06 is just my (slow) working PC at the university, and it is switched
off sometimes...
I would be happy to receive comments and tips for the patches to make them
more stable and useful.
Regards from Berlin,
Chris Marquardt (marq@xxxxxxxxxxxxxxxxxxxxxxxx)
And here are the diff's...
-------- snip, snip ---------------------------------------------------------
diff -r -C3 netcdf-2.4-beta6.orig/src/Makefile.in
netcdf-2.4-beta6/src/Makefile.in
*** netcdf-2.4-beta6.orig/src/Makefile.in Mon Nov 13 21:46:03 1995
--- netcdf-2.4-beta6/src/Makefile.in Wed Jan 31 22:10:48 1996
***************
*** 18,28 ****
ncdump/all ncdump/test ncdump/install ncdump/clean ncdump/distclean \
ncgen/all ncgen/test ncgen/install ncgen/clean ncgen/distclean \
nctest/all nctest/test nctest/clean nctest/distclean \
! libsrc/all libsrc/test libsrc/install libsrc/clean libsrc/distclean \
xdr/all xdr/test xdr/install xdr/clean xdr/distclean \
c++/all c++/test c++/install c++/clean c++/distclean
! all: port/all xdr/all libsrc/all @FORTRAN_TARGET_ALL@ ncdump/all \
ncgen/all nctest/all \
@CXX_TARGET_ALL@ doc/all
test: xdr/test libsrc/test nctest/test @FORTRAN_TARGET_TEST@ \
--- 18,28 ----
ncdump/all ncdump/test ncdump/install ncdump/clean ncdump/distclean \
ncgen/all ncgen/test ncgen/install ncgen/clean ncgen/distclean \
nctest/all nctest/test nctest/clean nctest/distclean \
! libsrc/all libsrc/library_so libsrc/test libsrc/install libsrc/clean
libsrc/distclean \
xdr/all xdr/test xdr/install xdr/clean xdr/distclean \
c++/all c++/test c++/install c++/clean c++/distclean
! all: port/all xdr/all libsrc/all @FORTRAN_TARGET_ALL@
libsrc/library_so ncdump/all \
ncgen/all nctest/all \
@CXX_TARGET_ALL@ doc/all
test: xdr/test libsrc/test nctest/test @FORTRAN_TARGET_TEST@ \
diff -r -C3 netcdf-2.4-beta6.orig/src/c++/Makefile.in
netcdf-2.4-beta6/src/c++/Makefile.in
*** netcdf-2.4-beta6.orig/src/c++/Makefile.in Thu Jan 4 04:08:38 1996
--- netcdf-2.4-beta6/src/c++/Makefile.in Wed Jan 31 22:14:07 1996
***************
*** 29,42 ****
PROG_OBJS = nctst.o
GARBAGE = $(PROG) $(PROG_OBJS) $(LIBOBJS) test.out example.nc
! all: library $(PROG)
test: expected $(PROG)
./$(PROG) > test.out
@cmp expected test.out && \
echo "*** C++ test successful ***" ;
! install: installed_library installed_headers
clean: default_clean
-rm -f $(PROG_OBJS) $(PROG) $(LIBOBJS) example.nc test.out
--- 29,48 ----
PROG_OBJS = nctst.o
GARBAGE = $(PROG) $(PROG_OBJS) $(LIBOBJS) test.out example.nc
! #
! # Uncomment the following line if you have buildt shared libraries under Linux
! # and want to test ncdump without havin installed them.
! #
! export LD_LIBRARY_PATH := .:../libsrc:$(LD_LIBRARY_PATH)
!
! all: library library_so $(PROG)
test: expected $(PROG)
./$(PROG) > test.out
@cmp expected test.out && \
echo "*** C++ test successful ***" ;
! install: installed_library installed_headers library library_so
clean: default_clean
-rm -f $(PROG_OBJS) $(PROG) $(LIBOBJS) example.nc test.out
diff -r -C3 netcdf-2.4-beta6.orig/src/fortran/Makefile.in
netcdf-2.4-beta6/src/fortran/Makefile.in
*** netcdf-2.4-beta6.orig/src/fortran/Makefile.in Fri Oct 13 21:58:26 1995
--- netcdf-2.4-beta6/src/fortran/Makefile.in Wed Jan 31 18:05:34 1996
***************
*** 29,41 ****
LIBOBJS = jackets.o
LIBNAME = netcdf
REMOTE_LIBRARY = ../libsrc/lib$(LIBNAME).a
OBJS = $(PROGRAM).o
LD_XDR = @LD_XDR@
! LD_NETCDF = -L../libsrc -lnetcdf
! LIBS = $(LD_NETCDF) $(LD_XDR)
prefix = ../../..
! all: netcdf.inc remote_library
test: $(PROGRAM) FORCE
./$(PROGRAM)
--- 29,48 ----
LIBOBJS = jackets.o
LIBNAME = netcdf
REMOTE_LIBRARY = ../libsrc/lib$(LIBNAME).a
+ REMOTE_LIB_SO = ../libsrc/lib$(LIBNAME).shared.archive
OBJS = $(PROGRAM).o
LD_XDR = @LD_XDR@
! LD_NETCDF = ../libsrc/lib$(LIBNAME).a
! LIBS = -L../libsrc -l$(LIBNAME) $(LD_XDR)
prefix = ../../..
! #
! # Uncomment the following line if you have buildt shared libraries under Linux
! # and want to test ncdump without havin installed them.
! #
! export LD_LIBRARY_PATH := .:../libsrc:$(LD_LIBRARY_PATH)
!
! all: netcdf.inc remote_library remote_lib_so
test: $(PROGRAM) FORCE
./$(PROGRAM)
diff -r -C3 netcdf-2.4-beta6.orig/src/ncdump/Makefile.in
netcdf-2.4-beta6/src/ncdump/Makefile.in
*** netcdf-2.4-beta6.orig/src/ncdump/Makefile.in Sat Jan 6 15:47:32 1996
--- netcdf-2.4-beta6/src/ncdump/Makefile.in Wed Jan 31 17:08:24 1996
***************
*** 18,27 ****
OBJS = ncdump.o vardata.o dumplib.o
PROGRAM_SRCS = ncdump.c vardata.c dumplib.c
LD_XDR = @LD_XDR@
! LIBS = $(LD_NETCDF) $(LD_XDR)
prefix = ../../..
GARBAGE = $(PROGRAM) test0.nc test1.nc test1.cdl test2.cdl
all: $(PROGRAM)
$(PROGRAM): $(LD_NETCDF)
--- 18,33 ----
OBJS = ncdump.o vardata.o dumplib.o
PROGRAM_SRCS = ncdump.c vardata.c dumplib.c
LD_XDR = @LD_XDR@
! LIBS = -L../libsrc -l$(LIBNAME) $(LD_XDR)
prefix = ../../..
GARBAGE = $(PROGRAM) test0.nc test1.nc test1.cdl test2.cdl
+ #
+ # Uncomment the following line if you have buildt shared libraries under Linux
+ # and want to test ncdump without havin installed them.
+ #
+ export LD_LIBRARY_PATH := .:../libsrc:$(LD_LIBRARY_PATH)
+
all: $(PROGRAM)
$(PROGRAM): $(LD_NETCDF)
***************
*** 38,44 ****
$(PROGRAM)_oc : $(PROGRAM_SRCS)
#setopt primary_language C
! #load -C $(CPPFLAGS) $(PROGRAM_SRCS)
#load -C $(LIBS)
#setopt program_name $(PROGRAM)
--- 44,50 ----
$(PROGRAM)_oc : $(PROGRAM_SRCS)
#setopt primary_language C
! oad -C $(CPPFLAGS) $(PROGRAM_SRCS)
#load -C $(LIBS)
#setopt program_name $(PROGRAM)
diff -r -C3 netcdf-2.4-beta6.orig/src/ncgen/Makefile.in
netcdf-2.4-beta6/src/ncgen/Makefile.in
*** netcdf-2.4-beta6.orig/src/ncgen/Makefile.in Mon Nov 13 21:47:27 1995
--- netcdf-2.4-beta6/src/ncgen/Makefile.in Wed Jan 31 17:13:08 1996
***************
*** 30,39 ****
OBJS = main.o load.o ncgentab.o escapes.o \
getfill.o init.o close.o genlib.o
LD_XDR = @LD_XDR@
! LIBS = $(LD_NETCDF) $(LD_XDR)
LEX = @LEX@
YACC = @YACC@
prefix = ../../..
all: $(PROGRAM)
--- 30,45 ----
OBJS = main.o load.o ncgentab.o escapes.o \
getfill.o init.o close.o genlib.o
LD_XDR = @LD_XDR@
! LIBS = -L../libsrc -l$(LIBNAME) $(LD_XDR)
LEX = @LEX@
YACC = @YACC@
prefix = ../../..
+
+ #
+ # Uncomment the following line if you have buildt shared libraries under Linux
+ # and want to test ncdump without havin installed them.
+ #
+ export LD_LIBRARY_PATH := .:../libsrc:$(LD_LIBRARY_PATH)
all: $(PROGRAM)
diff -r -C3 netcdf-2.4-beta6.orig/src/nctest/Makefile.in
netcdf-2.4-beta6/src/nctest/Makefile.in
*** netcdf-2.4-beta6.orig/src/nctest/Makefile.in Fri Oct 13 22:01:40 1995
--- netcdf-2.4-beta6/src/nctest/Makefile.in Wed Jan 31 17:14:31 1996
***************
*** 22,29 ****
vputget.o vputgetg.o driver.o cdftests.o dimtests.o rec.o \
atttests.o misctest.o add.o error.o emalloc.o val.o slabs.o
LD_XDR = @LD_XDR@
! LIBS = $(LD_NETCDF) $(LD_XDR)
GARBAGE = $(PROGRAM) lint.out *.cdf *.log test.nc test2.nc
all: program
--- 22,35 ----
vputget.o vputgetg.o driver.o cdftests.o dimtests.o rec.o \
atttests.o misctest.o add.o error.o emalloc.o val.o slabs.o
LD_XDR = @LD_XDR@
! LIBS = -L../libsrc -l$(LIBNAME) $(LD_XDR)
GARBAGE = $(PROGRAM) lint.out *.cdf *.log test.nc test2.nc
+
+ #
+ # Uncomment the following line if you have buildt shared libraries under Linux
+ # and want to test ncdump without havin installed them.
+ #
+ export LD_LIBRARY_PATH := .:../libsrc:$(LD_LIBRARY_PATH)
all: program
diff -r -C3 netcdf-2.4-beta6.orig/src/port/master.mk.in
netcdf-2.4-beta6/src/port/master.mk.in
*** netcdf-2.4-beta6.orig/src/port/master.mk.in Fri Oct 13 20:13:08 1995
--- netcdf-2.4-beta6/src/port/master.mk.in Wed Jan 31 22:26:16 1996
***************
*** 29,34 ****
--- 29,36 ----
TBL = @TBL@
WHICH = @WHICH@
+ MAJOR_NO = 2
+ MINOR_NO = 4
############################################################################
# Recursive Macros (command-line changes to others aren't supported):
***************
*** 167,173 ****
# The following rule is forced because the library can be created by a
# makefile in another directory prior to the execution of the following rule.
#
! $(LIB_A): $(LIBOBJS) FORCE
$(AR) rcuv $@ $(LIBOBJS)
$(RANLIB) $@
--- 169,175 ----
# The following rule is forced because the library can be created by a
# makefile in another directory prior to the execution of the following rule.
#
! $(LIB_A): $(LIBOBJS) FORCE
$(AR) rcuv $@ $(LIBOBJS)
$(RANLIB) $@
***************
*** 209,256 ****
mkdir -p $@
chmod u+rwx,g+rws,o=rx $@
! LIB_SO = lib$(LIBRARY).so.$(MAJOR_NO).$(MINOR_NO)
! LIB_SA = lib$(LIBRARY).sa.$(MAJOR_NO).$(MINOR_NO)
! #library: FORCE
! # @so_objs=`echo $(LIBOBJS) | sed 's/\.o/.so/g'`; \
! # if [ -z "$$so_objs" ]; then \
! # :; \
! # else \
! # $(MAKE) $(MFLAGS) $(LOCAL_MACROS) $(LIB_SO) \
! # SO_OBJS="$$so_objs"; \
! # fi
! # @if [ -z "$(SA_OBJS)" ]; then \
! # :; \
! # else \
! # $(MAKE) $(MFLAGS) $(LOCAL_MACROS) $(LIB_SA); \
! # fi
$(LIB_SO): $(SO_OBJS)
! ld -assert pure-text $(SO_OBJS) -o $@
$(LIB_SA): $(SA_OBJS) FORCE
$(AR) rcuv $@ $(SA_OBJS)
.fc.so:
! $(FORTC) -O $(OS) $< > $*.c \
! || (rm -f $*.c; exit 1)
! $(CC) -c -o $$$$.o -pic $(CFLAGS) $(CPPFLAGS) $*.c \
! || (rm -f $$$$.o; exit 1)
! mv $$$$.o $@
.c.so:
! $(CC) -c -o $$$$.o -pic $(CFLAGS) $(CPPFLAGS) $< \
! || (rm -f $$$$.o; exit 1)
! mv $$$$.o $@
!
! #installed_library: $(LIBDIR)/$(LIB_SO)
! # @if [ -z "$(SA_OBJS)" ]; then \
! # :; \
! # else \
! # $(MAKE) $(MFLAGS) $(LOCAL_MACROS) $(LIBDIR)/$(LIB_SA); \
! # fi
$(LIBDIR)/$(LIB_SO): $(LIBDIR) $(LIB_SO)
cp $(LIB_SO) $(LIBDIR)/$(LIB_SO)
$(LIBDIR)/$(LIB_SA): $(LIBDIR) $(LIB_SA)
cp $(LIB_SA) $(LIBDIR)/$(LIB_SA)
--- 211,358 ----
mkdir -p $@
chmod u+rwx,g+rws,o=rx $@
! #
! # Shared libraries (tested for Linux only)
! #
!
! LIB_SO = lib$(LIBRARY).so.$(MAJOR_NO).$(MINOR_NO)
! LIB_SO_NAME = lib$(LIBRARY).so.$(MAJOR_NO)
! LIB_SO_ARCH = lib$(LIBRARY).shared.archive
! LIB_SA = lib$(LIBRARY).sa.$(MAJOR_NO).$(MINOR_NO)
!
! library: FORCE
! @so_objs=`echo $(LIBOBJS) | sed 's/\.o/.so/g'`; \
! if [ -z "$$so_objs" ]; then \
! :; \
! else \
! case `uname -s` in \
! Linux) \
! $(MAKE) $(MFLAGS) $(LOCAL_MACROS) $(LIB_SO_ARCH) \
! SO_OBJS="$$so_objs";; \
! *) \
! $(MAKE) $(MFLAGS) $(LOCAL_MACROS) $(LIB_SO) \
! SO_OBJS="$$so_objs";; \
! esac ; \
! fi
! @if [ -z "$(SA_OBJS)" ]; then \
! :; \
! else \
! $(MAKE) $(MFLAGS) $(LOCAL_MACROS) $(LIB_SA); \
! fi
!
!
! # A problem under Linux: to make a lib<something>.so with gcc's -shared option
! # _all_ sharable objects must be available. Therefore, all objects compiled
with
! # -fPIC are collected in LIB_SO_ARCH first (via the remote_lib_so_arch target
! # in case of remote libraries), and then the shared library is buildt. This is
! # done in a temporary subdirectory in order not to destroy the relocatables in
! # the current subdirectory.
!
! library_so: $(LIB_SO_ARCH) FORCE
! case `uname -s` in \
! Linux) mkdir -p ./tmp ; \
! cd ./tmp ; \
! ar -x ../$(LIB_SO_ARCH) ; \
! gcc -shared -Wl,-soname,$(LIB_SO_NAME) *.so -o ../$(LIB_SO)
; \
! rm -f *.so ; \
! cd .. ; \
! rmdir ./tmp ; \
! rm -f $(LIB_SO_NAME) ; \
! ln -s $(LIB_SO) $(LIB_SO_NAME) ; \
! ;; \
! *) ;; \
! esac
!
! $(LIB_SO_ARCH): $(SO_OBJS) FORCE
! @case `uname -s` in \
! Linux) $(AR) rcuv $@ $(SO_OBJS) ; \
! $(RANLIB) $@ ;; \
! *) ;; \
! esac
!
! remote_lib_so: FORCE
! @so_objs=`echo $(LIBOBJS) | sed 's/\.o/.so/g'`; \
! if [ -z "$$so_objs" ]; then \
! :; \
! else \
! case `uname -s` in \
! Linux) \
! $(MAKE) $(MFLAGS) $(LOCAL_MACROS) remote_lib_so_arch \
! SO_OBJS="$$so_objs";; \
! *) ;; \
! esac ; \
! fi
! remote_lib_so_arch: $(SO_OBJS) FORCE
! $(AR) rcuv $(REMOTE_LIB_SO) $(SO_OBJS)
! $(RANLIB) $(REMOTE_LIB_SO)
!
!
! # Shared libraries for other platforms
$(LIB_SO): $(SO_OBJS)
! @case `uname -s` in \
! Linux) ;; \
! *) ld -assert pure-text $(SO_OBJS) -o $@ ;; \
! esac
!
$(LIB_SA): $(SA_OBJS) FORCE
$(AR) rcuv $@ $(SA_OBJS)
+
+ # Compiling sharable (relocatable) objects
+
.fc.so:
! case `uname -s` in \
! Linux) \
! $(FORTC) -O $(OS) $< > $*.c \
! || (rm -f $*.c; exit 1); \
! $(CC) -c -o $@ -fPIC $(CFLAGS) $(CPPFLAGS) $*.c ;; \
! *) \
! $(FORTC) -O $(OS) $< > $*.c \
! || (rm -f $*.c; exit 1); \
! $(CC) -c -o $$$$.o -pic $(CFLAGS) $(CPPFLAGS) $*.c \
! || (rm -f $$$$.o; exit 1) ; \
! mv $$$$.o $@ ;; \
! esac
.c.so:
! case `uname -s` in \
! Linux) \
! $(CC) -c -o $@ -fPIC $(CFLAGS) $(CPPFLAGS) $< ;; \
! *) \
! $(CC) -c -o $$$$.o -pic $(CFLAGS) $(CPPFLAGS) $< \
! || (rm -f $$$$.o; exit 1) ; \
! mv $$$$.o $@ ;; \
! esac
!
! .cc.so:
! case `uname -s` in \
! Linux) \
! $(CXX) -c -o $@ -fPIC $(CXXFLAGS) $(CXXCPPFLAGS) $< ;; \
! *) \
! $(CXX) -c -o $@ -pic $(CXXFLAGS) $(CXXCPPFLAGS) $< ;; \
! esac
+ installed_library: $(LIBDIR)/$(LIB_SO) $(LIBDIR)/$(LIB_A)
+ @if [ -z "$(SA_OBJS)" ]; then \
+ :; \
+ else \
+ $(MAKE) $(MFLAGS) $(LOCAL_MACROS) $(LIBDIR)/$(LIB_SA); \
+ fi
+
+ $(LIBDIR)/$(LIB_A): $(LIBDIR) $(LIB_A)
+ cp $(LIB_A) $(LIBDIR)/$(LIB_A)
+ $(RANLIB) $(LIBDIR)/$(LIB_A)
$(LIBDIR)/$(LIB_SO): $(LIBDIR) $(LIB_SO)
cp $(LIB_SO) $(LIBDIR)/$(LIB_SO)
+ case `uname -s` in \
+ Linux) \
+ ( cd $(LIBDIR) ; rm -f $(LIB_SO_NAME) lib$(LIBRARY).so ; \
+ ln -s $(LIB_SO) $(LIB_SO_NAME) ; ln -s $(LIB_SO_NAME)
lib$(LIBRARY).so ) ;; \
+ *) ;; \
+ esac
+
+
$(LIBDIR)/$(LIB_SA): $(LIBDIR) $(LIB_SA)
cp $(LIB_SA) $(LIBDIR)/$(LIB_SA)
***************
*** 397,402 ****
--- 499,505 ----
AIX);; \
HP-UX);; \
IRIX*);; \
+ Linux);; \
ULTRIX);; \
UNICOS|sn*);; \
*) $(MAKE) $(MFLAGS) $(MANDIR)/whatis;; \
***************
*** 436,441 ****
--- 539,547 ----
$(MANDIR)/whatis: FORCE
catman -w -M $(MANDIR)
+ $(MANDIR)/makewhatis: FORCE
+ makewhatis -w $(MANDIR)
+
############################################################################
# TeX-Info Pages:
***************
*** 506,519 ****
realclean: default_realclean
default_clean: FORCE
rm -f $(GARBAGE) $(PROGRAM) a.out core *.o *.i *.a *.so.* *.sa.* \
! *.so *.u *.pure *.pure_hardlink *.pure_linkinfo conftest* \
*.nc test.out \
*.aux *.toc *.dvi \
config.cache *.Z *.log tags MANIFEST *~
default_distclean: default_realclean
default_realclean: FORCE
rm -f $(GARBAGE) $(PROGRAM) a.out core *.o *.i *.a *.so.* *.sa.* \
! *.so *.u *.pure *.pure_hardlink *.pure_linkinfo conftest* \
*.nc test.out \
*.aux *.toc *.dvi \
config.cache *.Z *.log tags TAGS MANIFEST *~ \
--- 612,625 ----
realclean: default_realclean
default_clean: FORCE
rm -f $(GARBAGE) $(PROGRAM) a.out core *.o *.i *.a *.so.* *.sa.* \
! *.so *.shared.* *.u *.pure *.pure_hardlink *.pure_linkinfo
conftest* \
*.nc test.out \
*.aux *.toc *.dvi \
config.cache *.Z *.log tags MANIFEST *~
default_distclean: default_realclean
default_realclean: FORCE
rm -f $(GARBAGE) $(PROGRAM) a.out core *.o *.i *.a *.so.* *.sa.* \
! *.so *.shared.* *.u *.pure *.pure_hardlink *.pure_linkinfo
conftest* \
*.nc test.out \
*.aux *.toc *.dvi \
config.cache *.Z *.log tags TAGS MANIFEST *~ \