This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
Dear Youcheng Zhang, > Date: Sat, 04 May 1996 18:12:11 -0500 > From: Youcheng Zhang <address@hidden> > To: Russ Rew <address@hidden> > cc: address@hidden > Subject: Re: try netcdf-2.4.2 under Linux In the above message you wrote: > I send you the following as attachment > config1.log ------- config.log > config1.status ---- config.status > config1_out ------- the output by running configure > Makefile_1 -------- the top level Makefile > log_1 ------------- the output by make -n all > > note: the number 1 indicate all the files generated > by netcdf-2.4.1, the version I had compiled successfully > (before got "Segmentation fault" by "make clean") > > I use the following line to invoke configure: > CC=gcc CPPFLAGS= CXX=g++ FC="" XDR=/usr/lib/libc.a > ./configure --prefix=/usr/local. > > The linux version I have is Slackware 3.0 with > kernel 1.2.13 > gcc 2.70 It appears that GNU make(1) is unhappy with our master makefile, port/master.mk.in. I've modified this file and enclosed the new version. I suggest you try the following: 1. Go to the top-level, netCDF source directory. 2. Replace the file port/master.mk.in with the enclosed version. 3. Execute the command `./config.status'. 4. If the above succeeds, then execute the command `make install'. Trap all the output in case something goes wrong. 5. If the above succeeds, then execute the command `make clean'. Please let me know if this helps. -------- Steve Emmerson <address@hidden> --------Begin port/master.mk.in # This is the master makefile. It contains general rules. # # $Id: master.mk.in,v 1.31 1996/05/07 15:14:13 steve Exp $ .SUFFIXES: .SUFFIXES: .so .o .S .ln .i .c .fc .f .F .cc .l .y .cdl .nc .sh ############################################################################ # General Macros: ############################################################################ prefix = @prefix@ exec_prefix = @exec_prefix@ AR = @AR@ CC = @CC@ CPP = @CPP@ CC_MAKEDEPEND = @CC_MAKEDEPEND@ CXX = @CXX@ FC = @FC@ LINT = lint LINTFLAGS = -u MAKEINFO = @MAKEINFO@ NCDUMP = @NCDUMP@ NCGEN = @NCGEN@ NEQN = @NEQN@ OS = @OS@ SHELL = /bin/sh TBL = @TBL@ WHICH = @WHICH@ ############################################################################ # Recursive make(1)s in Subdirectories: ############################################################################ subdir_dummy_target $(SUBDIR_TARGETS): @echo "" @dir=`echo $@ | sed 's,/.*,,'`; \ target=`echo $@ | sed "s,$$dir/,,"`; \ cd $$dir && \ echo "making \`$$target' in directory `pwd`" && \ echo "" && \ $(MAKE) $(MFLAGS) \ prefix=$(prefix) exec_prefix=$(exec_prefix) \ $$target || exit 1 @echo "" @echo "returning to directory `pwd`" @echo "" subdirs/all \ subdirs/test \ subdirs/install \ subdirs/clean \ subdirs/distclean: FORCE @case "$(SUBDIRS)" in \ '') ;; \ *) filename=`echo $@ | sed 's:.*/::'`; \ targets=`echo $(SUBDIRS) | tr ' ' '\012' | \ sed 's:$$:/'$$filename':'`; \ $(MAKE) $$targets;; \ esac ############################################################################ # Compilation: ############################################################################ FORTC = @FORTC@ # Compile C++ code. .cc.o: $(CXX) -c $(CXXFLAGS) $(CXXCPPFLAGS) $< # Compile FORTRAN code. # .f.o: $(FC) -c $(FFLAGS) $< .F.o: ln -s $< $*.c && \ ($(CPP) -DUD_FORTRAN_SOURCE $(CPPFLAGS) $*.c >$*.i && \ sed '/^# *[0-9]/d' $*.i > $*.f) || \ (rm -f $*.f $*.i $*.c ; exit 1) && \ rm $*.i $(FC) -c $(FFLAGS) $*.f && rm $*.f $*.c .F.f: ln -s $< $*.c && \ ($(CPP) -DUD_FORTRAN_SOURCE $(CPPFLAGS) $*.c >$*.i && \ grep -v '^#' $*.i > $@) || \ (rm -f $@ $*.i $*.c; exit 1) && \ rm $*.i $*.c .F.i: ln -s $< $*.c && \ $(CPP) -DUD_FORTRAN_SOURCE $(CPPFLAGS) $*.c >$*.i # Generate FORTRAN-callable C code. # .fc.o: $(FORTC) -O $(OS) $< > $*.c \ || ( rm -f $*.c; exit 1) $(CC) -c $(CFLAGS) $(CPPFLAGS) $*.c .fc.c: $(FORTC) -O $(OS) $< > $@ \ || (rm -f $*.c; exit 1) # Compile assembler code. # .S.o: $(CC) -c $(CFLAGS) $(CPPFLAGS) $< # Compile C code. # .c.o: $(CC) -c $(CFLAGS) $(CPPFLAGS) $< # Compile lex(1) code. This rule is here to ensure the use of CPPFLAGS. # .l.o: rm -f $*.c $(LEX) -t $< > $*.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $*.c rm $*.c # C preprocess. # NB: # 1. Line numbering information is kept. # .c.i: $(CPP) $(CPPFLAGS) $< > $@ .cdl.nc: $(NCGEN) -o $*.nc $*.cdl .sh: cp $< $@; chmod +x $@ ############################################################################ # Lint: ############################################################################ .c.ln: $(LINT) -c $(LINTFLAGS) $(CPPFLAGS) $< ############################################################################ # Libraries: ############################################################################ RANLIB = @RANLIB@ LIBDIR = $(exec_prefix)/lib LIB_A = lib$(LIBRARY).a LIBFILE = dummy-libfile # to silence GNU make(1) library: $(LIB_A) remote_library: $(REMOTE_LIBRARY) # 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) $(LIBOBJS2) FORCE $(AR) rcuv $@ $(LIBOBJS) case "$(LIBOBJS2)" in \ '') ;; \ *) $(AR) rucv $@ $(LIBOBJS2);; \ esac $(RANLIB) $@ # The following rule is for those makefiles needing to install object # modules in a library in another directory. They need only define # REMOTE_LIBRARY and LIBOBJS. The rule is forced for the same reason as the # $(LIB_A) rule. # lib_dummy $(REMOTE_LIBRARY): $(LIBOBJS) FORCE $(AR) rcuv $@ $(LIBOBJS) $(RANLIB) $@ installed_libfiles: FORCE @if [ -n "$(LIBFILES)" ]; then \ libfiles="$(LIBFILES)"; \ for libfile in $$libfiles; do \ $(MAKE) $(MFLAGS) \ LIBDIR=$(LIBDIR) LIBFILE=$$libfile \ installed_libfile || exit 1; \ done; \ else \ :; \ fi installed_library: FORCE @$(MAKE) $(MFLAGS) \ LIBDIR=$(LIBDIR) LIBFILE=$(LIB_A) \ installed_libfile # The following target decouples the previous targets from the actual rule; # thus, eliminating extraneous make(1) messages. # installed_libfile: $(LIBDIR)/$(LIBFILE) $(LIBDIR)/dummy.a $(LIBDIR)/$(LIBFILE): $(LIBDIR) $(LIBFILE) cp $(LIBFILE) $@ dummy_libdir $(LIBDIR): 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) $(LIB_SO) \ # SO_OBJS="$$so_objs"; \ # fi # @if [ -z "$(SA_OBJS)" ]; then \ # :; \ # else \ # $(MAKE) $(MFLAGS) $(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) $(LIBDIR)/$(LIB_SA); \ # fi $(LIBDIR)/dummy.so $(LIBDIR)/$(LIB_SO): $(LIBDIR) $(LIB_SO) cp $(LIB_SO) $(LIBDIR)/$(LIB_SO) $(LIBDIR)/dummy.sa $(LIBDIR)/$(LIB_SA): $(LIBDIR) $(LIB_SA) cp $(LIB_SA) $(LIBDIR)/$(LIB_SA) ############################################################################ # Programs: ############################################################################ BINDIR = $(exec_prefix)/bin BINFILE = dummy-binfile programs: $(PROGRAMS) program: @if [ -z "$(PROGRAM)" ]; then \ : true; \ else \ $(MAKE) $(MFLAGS) $(PROGRAM); \ fi dummy_prog $(PROGRAM): $(OBJS) @if [ -r $@.f -o -r $@.F ]; then \ ld='$(FC) -o $@ $(FFLAGS)'; \ elif [ -r $@.cc -o -r $@.C ]; then \ ld='$(CXX) -o $@ $(CXXFLAGS)'; \ else \ ld='$(CC) -o $@ $(CFLAGS)'; \ fi; \ cmd="$$ld $(LDFLAGS) $(OBJS) $(LIBS)"; \ echo $$cmd; \ $$cmd \ || (rm -f $@; exit 1) installed_programs: FORCE @$(MAKE) $(MFLAGS) installed_binfiles \ BINDIR=$(BINDIR) BINFILES="$(PROGRAMS)" installed_binfiles: FORCE @if [ -n "$(BINFILES)" ]; then \ binfiles="$(BINFILES)"; \ for binfile in $$binfiles; do \ $(MAKE) $(MFLAGS) \ BINDIR=$(BINDIR) BINFILE=$$binfile \ installed_binfile || exit 1; \ done; \ else \ :; \ fi installed_program: FORCE @$(MAKE) $(MFLAGS) \ BINDIR=$(BINDIR) BINFILE=$(PROGRAM) \ installed_binfile # The following target decouples the previous targets from the actual rule; # thus, eliminating extraneous make(1) messages. # installed_binfile: $(BINDIR)/$(BINFILE) $(BINDIR)/dummy $(BINDIR)/$(BINFILE): $(BINDIR) $(BINFILE) cp $(BINFILE) $@ dummy_bindir $(BINDIR): mkdir -p $@ chmod u+rwx,g+rws,o=rx $@ $(PROGRAM).pure: $(OBJS) purify -best-effort $(PURIFYFLAGS) $(CC) -o $@ \ $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) pure: purify purify: $(PROGRAM).pure FORCE $(MAKE) $(MFLAGS) PROGRAM=$(PROGRAM).pure test.pure.out ############################################################################ # Header files: ############################################################################ INCDIR = $(prefix)/include HEADER = dummy-header # to silence GNU make(1) installed_headers: FORCE @if [ -n "$(HEADERS)" ]; then \ headers="$(HEADERS)"; \ for header in $$headers; do \ $(MAKE) $(MFLAGS) \ INCDIR=$(INCDIR) HEADER=$$header \ installed_header || exit 1; \ done; \ else \ :; \ fi # The following target decouples the previous targets from the actual rule; # thus, eliminating extraneous make(1) messages. # installed_header: $(INCDIR)/$(HEADER) $(INCDIR)/dummy.h $(INCDIR)/$(HEADER): $(INCDIR) $(HEADER) cp $(HEADER) $@ dummy_incdir $(INCDIR): mkdir -p $@ chmod u+rwx,g+rws,o=rx $@ ############################################################################ # `etc/' files: ############################################################################ ETCDIR = $(prefix)/etc ETCFILE = dummy-etcfile # to silence GNU make(1) installed_etcfiles: @if [ -n "$(ETCFILES)" ]; then \ etcfiles="$(ETCFILES)"; \ for etcfile in $$etcfiles; do \ $(MAKE) $(MFLAGS) \ ETCDIR=$(ETCDIR) ETCFILE=$$etcfile \ installed_etcfile || exit 1; \ done; \ else \ :; \ fi # The following target decouples the previous targets from the actual rule; # thus, eliminating extraneous make(1) messages. # installed_etcfile: $(ETCDIR)/$(ETCFILE) $(ETCDIR)/dummy $(ETCDIR)/$(ETCFILE): $(ETCDIR) $(ETCFILE) cp $(ETCFILE) $@ dummy_etcdir $(ETCDIR): mkdir -p $@ chmod u+rwx,g+rws,o=rx $@ ############################################################################ # Manual Pages: ############################################################################ MANDIR = $(prefix)/man CATMAN = @CATMAN@ MANUAL = dummy-manual # to slience GNU make installed_manuals: FORCE @if [ -n "$(MANUALS)" ]; then \ manuals="$(MANUALS)"; \ for manual in $$manuals; do \ extension=`echo $$manual | sed 's/[^.]*\.//'`; \ chapter=`echo $$extension | sed 's/\(.\).*/\1/'`; \ subchapter=`echo $$extension | sed 's/.//'`; \ mandir=$(MANDIR)/man$$chapter; \ $(MAKE) $(MFLAGS) \ MANDIR=$$mandir MANUAL=$$manual \ installed_manual || exit 1; \ done; \ case `uname -s` in \ AIX);; \ HP-UX);; \ IRIX*);; \ ULTRIX);; \ UNICOS|sn*);; \ *) $(MAKE) $(MFLAGS) $(MANDIR)/whatis;; \ esac; \ else \ :; \ fi # The following target decouples the previous targets from the actual rule; # thus, eliminating extraneous make(1) messages. # installed_manual: $(MANDIR)/$(MANUAL) # The first sed(1) editing command in the following replaces the expanded # RCS keyword `$Date ...' in the `.TH' macro line with something more # appropriate to a manual page. # # We don't preprocess the manual page with tbl(1) and neqn(1) on OSF1 # and IRIX systems because their man(1) always does that. # # NB: Manual pages like `man3/udunits.3f' cause the subdirectory man3f/ # to be created as a symbolic link to man3/. This accomodates # operating-systems like SunOS 5.4 which require files like *.3f to be in # their own man3f/ subdirectory. # $(MANDIR)/dummy.man $(MANDIR)/$(MANUAL): $(MANDIR) $(MANUAL) case `uname -s` in \ OSF1*|IRIX*) \ sed \ -e '/^\.TH/s/$$D\ate: \([0-9]*\)\/\([0-9]*\)\/\([0-9]*\).*\$$/\1-\2-\3/'\ $(MANUAL) > $@;; \ *) \ sed \ -e '/^\.TH/s/$$D\ate: \([0-9]*\)\/\([0-9]*\)\/\([0-9]*\).*\$$/\1-\2-\3/'\ $(MANUAL) | $(TBL) | $(NEQN) > $@;; \ esac extension=`echo $(MANUAL) | sed 's/[^.]*\.//'`; \ subchapter=`echo $$extension | sed 's/.//'`; \ case "$$subchapter" in \ '') ;; \ *) chapter=`echo $$extension | sed 's/\(.\).*/\1/'`; \ if test -d $(MANDIR)$$subchapter; then \ : true; \ else \ mkdir $(MANDIR)$$subchapter; \ ln -s ../`basename $(MANDIR)`/$(MANUAL) \ $(MANDIR)$$subchapter/$(MANUAL); \ fi; \ ;; \ esac dummy_mandir $(MANDIR): mkdir -p $@ chmod u+rwx,g+rws,o=rx $@ $(MANDIR)/whatis: FORCE case "$(CATMAN)" in \ '') : true ;; \ *) $(CATMAN) -w -M $(MANDIR);; \ esac ############################################################################ # Documents: ############################################################################ DOCDIR = $(prefix)/doc DOCUMENT = dummy-document # to silence GNU make(1) installed_documents: FORCE case "$(DOCUMENTS)" in \ '') : true \ ;; \ *) documents="$(DOCUMENTS)"; \ for document in $$documents; do \ $(MAKE) $(MFLAGS) \ DOCUMENT=$$document installed_document || exit 1; \ done \ ;; \ esac # The following target decouples the previous targets from the actual rule; # thus, eliminating extraneous make(1) messages. # installed_document: $(DOCDIR)/$(DOCUMENT) $(DOCDIR)/dummy.doc $(DOCDIR)/$(DOCUMENT): $(DOCDIR) $(DOCUMENT) cp $(DOCUMENT) $(DOCDIR) dummy_docdir $(DOCDIR): mkdir -p $@ chmod u+rwx,g+rws,o=rx $@ ############################################################################ # TeX-Info Pages: ############################################################################ INFODIR = $(prefix)/info INFO = dummy-info # to silence GNU make(1) installed_infos: FORCE if [ -z "$(MAKEINFO)" ]; then \ echo 1>&2 "GNU info-pages won't be installed" \ "because makeinfo program doesn't exist"; \ else \ if [ -n "$(INFOS)" ]; then \ infos="$(INFOS)"; \ for info in $$infos; do \ $(MAKE) $(MFLAGS) \ INFODIR=$(INFODIR) INFO=$$info \ installed_info || exit 1; \ done; \ else \ :; \ fi; \ fi; # The following target decouples the previous targets from the actual rule; # thus, eliminating extraneous make(1) messages. # installed_info: $(INFODIR)/$(INFO) $(INFODIR)/dummy.info $(INFODIR)/$(INFO): $(INFODIR) $(INFO) cp $(INFO) $@ dummy_infodir $(INFODIR): mkdir -p $@ chmod u+rwx,g+rws,o=rx $@ # Rules for generating info pages: # .SUFFIXES: .info .texi .texinfo .txn .texi.info: @if [ -z "$(MAKEINFO)" ]; then \ echo 1>&2 "Can't create $@ because no makeinfo(1)"; \ else \ $(MAKEINFO) $< --no-split --output=$@; \ fi .texinfo.info: @if [ -z "$(MAKEINFO)" ]; then \ echo 1>&2 "Can't create $@ because no makeinfo(1)"; \ else \ $(MAKEINFO) $< --no-split --output=$@; \ fi .txn.info: @if [ -z "$(MAKEINFO)" ]; then \ echo 1>&2 "Can't create $@ because no makeinfo(1)"; \ else \ $(MAKEINFO) $< --no-split --output=$@; \ fi # Ensure that info page depends on canonical TeX-Info macros. # dummy_info $(INFO): texinfo.tex ############################################################################ # Cleanup: ############################################################################ clean: default_clean distclean: realclean 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* \ test.out test.pure.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* \ test.out \ *.aux *.toc *.dvi \ config.cache *.Z *.log tags TAGS MANIFEST *~ \ Makefile config.status cc_id ############################################################################ # Configuration: ############################################################################ # The following target is touched because config.status won't update it if # it hasn't changed. # # The following is commented-out because the HPUX make(1) goes into a loop. # #Makefile: config.status # ./config.status # touch $@ config.status: cc_id configure ./configure --no-create cc_id: FORCE if test -r $@ && test "`cat $@`" = "$(CC)"; then \ :; \ else \ echo "$(CC)" > $@; \ fi # The following is commented-out because autoconf is currently only # available on Zero. # #configure: configure.in # autoconf ############################################################################ # Dependency maintenance: ############################################################################ .PRECIOUS: depend # # Note: The following rule will only work if the C compiler behaves correctly # when given the `-M' option. AIX's cc(1) and SunOS's acc(1) behave # incorrectly. --Steve Emmerson 1992-09-24 # # Furthermore, we do not attempt to maintain dependencies on installed # header files (e.g. those in $(INCDIR)) for two reasons: 1) the dependency # list generated at Unidata mightn't correspond to the situation at a client # site; and 2) clients using broken compilers (c.f. previous note) can't # regenerate the dependency list. # # We try to ensure that all C files exist in a distribution that # includes fortc(1), yacc(1), or lex(1) sources. # depend: FORCE # csrcs=`echo $(MANIFEST) | tr ' ' '\012' | egrep -s '\.fc|\.y|\.l'`; \ if [ "$$csrcs" ]; then \ echo 1>&2 "Ensuring that all C files exist for target depend"; \ echo 1>&2 "csrcs = $$csrcs"; \ $(MAKE) $(MFLAGS) $$csrcs; \ fi -incdir=`echo $(INCDIR) | sed s',/,\\\/,g'`; \ (case $(OS) in \ aix*) \ $(CC) -M -E $(CPPFLAGS) *.c > /dev/null; \ cat *.u; \ ;; \ *) \ $(CC_MAKEDEPEND) $(CPPFLAGS) *.c *.S 2> /dev/null; \ ;; \ esac) | awk '{ \ if ($$0 ~ /:/) { \ target = $$1; \ if (target ~ /:/) { \ target = substr(target,1,length(target)-1); \ start = 2; \ } else { \ start = 3; \ } \ } else { \ start = 1; \ } \ for (i = start; i <= NF; ++i) { \ if ($$i !~ /^\\/ && \ $$i !~ /port\// && \ $$i !~ /^\//) \ { \ if ($$i ~ /^\.\//) \ $$i = substr($$i, 3, 99); \ print target ": " $$i \ } \ } \ }' >>$@ sort -u -o $@ $@ tag='### DO NOT DELETE THIS LINE. make depend DEPENDS ON IT ###'; \ sed -e "/^$$tag$$/r depend" \ -e "/^$$tag$$/q" Makefile > Makefile.new mv Makefile.new Makefile ############################################################################ # Distributions: ############################################################################ FTPDIR = @FTPDIR@ FTPBINDIR = @FTPBINDIR@ VERSION = @VERSION@ TARFLAGS = @TARFLAGS@ zip: FORCE version=`cat VERSION | sed 's/\.//g;s/-//g`; \ $(MAKE) $(MFLAGS) $(PACKAGE)$$version.zip VERSION=$$version $(PACKAGE)$(VERSION).zip: MANIFEST id=$(PACKAGE)$(VERSION) \ && rm -rf $$id \ && mkdir $$id \ && ln -s .. $$id/src \ && sed "s|^|$$id/src/|" MANIFEST | zip -@ $@ \ && rm -r $$id tar.Z: FORCE version=`cat VERSION`; \ $(MAKE) $(MFLAGS) $(PACKAGE)-$$version.tar.Z VERSION=$$version $(FTPDIR)/$(PACKAGE)-$(VERSION).tar.Z: $(PACKAGE)-$(VERSION).tar.Z cp $(PACKAGE)-$(VERSION).tar.Z $@ chmod u+rw,g+rw,o=r $@ ftp: FORCE version=`cat VERSION`; \ $(MAKE) $(MFLAGS) $(FTPDIR)/$(PACKAGE)-$$version.tar.Z \ VERSION=$$version; \ test -r $(FTPDIR)/$(PACKAGE).tar.Z || exit 0; \ cd $(FTPDIR) || exit 1; \ rm $(PACKAGE).tar.Z || exit 1; \ ln -s $(PACKAGE)-$$version.tar.Z $(PACKAGE).tar.Z; $(PACKAGE)-$(VERSION).tar.Z: MANIFEST id=$(PACKAGE)-$(VERSION) \ && rm -rf $$id \ && mkdir $$id \ && ln -s .. $$id/src \ && tar $(TARFLAGS) - `sed "s|^|$$id/src/|" MANIFEST` | compress > $@ \ && rm -r $$id binftp: FORCE version=`cat VERSION`; \ $(MAKE) $(MFLAGS) $(FTPBINDIR)/$(PACKAGE)-$$version.tar.Z \ VERSION=$$version ftpbin: binftp $(FTPBINDIR)/$(PACKAGE)-$(VERSION).tar.Z: id=$(PACKAGE)-$(VERSION) \ && rm -f $$id \ && ln -s $(prefix) $$id \ && tar $(TARFLAGS) - README $$id/bin $$id/doc $$id/etc $$id/include \ $$id/lib $$id/man | compress > $@ \ && rm $$id chmod u+rw,g+rw,o=r $@ test -r $(FTPBINDIR)/$(PACKAGE).tar.Z || exit 0; \ cd $(FTPBINDIR) || exit 1; \ rm $(PACKAGE).tar.Z || exit 1; \ ln -s $(PACKAGE)-$(VERSION).tar.Z $(PACKAGE).tar.Z; MANIFEST: FORCE @echo 1>&2 Creating MANIFEST @$(MAKE) -s $(MFLAGS) MANIFEST.echo > $@ MANIFEST.echo: FORCE @echo $(MANIFEST) | tr ' ' '\012' @if [ -n "$(SUBDIRS)" ]; then \ subdirs="$(SUBDIRS)"; \ for subdir in $$subdirs; do \ (cd $$subdir && \ echo 1>&2 Creating $@ in `pwd` && \ $(MAKE) $(MFLAGS) MANIFEST.echo | \ sed "s|^|$$subdir/|") || exit 1; \ done; \ else \ :; \ fi ensure_manifest: FORCE @$(MAKE) $(MFLAGS) \ `echo $(MANIFEST) | sed 's/MANIFEST//'` @if [ -n "$(SUBDIRS)" ]; then \ subdirs="$(SUBDIRS)"; \ for subdir in $$subdirs; do \ (cd $$subdir && \ echo 1>&2 Creating $@ in `pwd` && \ $(MAKE) $(MFLAGS) ensure_manifest ) || \ exit 1; \ done; \ else \ :; \ fi ############################################################################ # Miscellaneous: ############################################################################ # The following dummy target is useful as a dependency to ensure that a # rule is always executed. # FORCE: