about summary refs log tree commit diff
path: root/GNUmakefile
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2006-08-19 03:12:28 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2006-08-19 03:12:28 +0000
commit1fd361a1ea06e44286c213ca1f814f49306fdc43 (patch)
tree64c8c96cf54d8718847339a403e5e67b922e8c3f /GNUmakefile
downloadnetpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.gz
netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.xz
netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.zip
Create Subversion repository
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'GNUmakefile')
-rw-r--r--GNUmakefile393
1 files changed, 393 insertions, 0 deletions
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 00000000..d26ddf50
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1,393 @@
+# Makefile for Netpbm
+ 
+# Configuration should normally be done in the included file Makefile.config.
+
+# Targets in this file:
+#
+#   nonmerge:     Build everything, in the source directory.
+#   merge:        Build everything as merged executables, in the source dir
+#   package:      Make a package of Netpbm files ready to install
+#   
+#   The default target is either "merge" or "nonmerge", as determined by
+#   the DEFAULT_TARGET variable set by Makefile.config.
+
+# About the "merge" target: Normally the Makefiles build separate
+# executables for each program.  However, on some systems (especially
+# those without shared libraries) this can mean a lot of space.  In
+# this case you might try building a "merge" instead.  The idea here
+# is to link all the programs together into one huge executable, along
+# with a tiny dispatch program that runs one of the programs based on
+# the command name with which it was invoked.  You install the merged
+# executable with a file system link for the name of each program it
+# includes.  This is much more important when you're statically
+# linking than when you're using shared libraries.  On a Sun3 under
+# SunOS 3.5, where shared libraries are not available, the space for
+# executables went from 2970K to 370K in an older Netpbm.  On a
+# GNU/Linux IA32 system with shared libraries in 2002, it went from
+# 2949K to 1663K.
+
+# To build a "merge" system, just set DEFAULT_TARGET to "merge" instead
+# of "nomerge" in Makefile.config.  In that case, you should probably also
+# set NETPBMLIBTYPE to "unixstatic", since a shared library doesn't do you 
+# much good.
+
+# The CURDIR variable presents a problem because it was introduced in
+# GNU Make 3.77.  We need the CURDIR variable in order for our 'make
+# -C xxx -f xxx' commands to work.  If we used the obvious alternative
+# ".", that wouldn't work because it would refer to the directory
+# named in -C, not the directory the make file you are reading is
+# running in.  The -f option is necessary in order to have separate
+# source and object directories.
+
+ifeq ($(CURDIR)x,x)
+all package install:
+	@echo "YOU NEED AT LEAST VERSION 3.77 OF GNU MAKE TO BUILD NETPBM."
+	@echo "Netpbm's makefiles need the CURDIR variable that was "
+	@echo "introduced in 3.77.  Your version does not have CURDIR."
+	@echo
+	@echo "You can get a current GNU Make via http://www.gnu.org/software"
+	@echo 
+	@echo "If upgrading is impossible, try modifying GNUMakefile and "
+	@echo "Makefile.common to replace \$(CURDIR) with \$(shell /bin/pwd) "
+else
+
+
+include Makefile.srcdir
+BUILDDIR = $(CURDIR)
+SUBDIR = 
+VPATH=.:$(SRCDIR)
+
+include $(BUILDDIR)/Makefile.config
+
+PRODUCT_SUBDIRS = lib converter analyzer editor generator other
+SUPPORT_SUBDIRS = urt buildtools
+
+SUBDIRS = $(PRODUCT_SUBDIRS) $(SUPPORT_SUBDIRS)
+
+SCRIPTS = manweb
+MANUALS1 = netpbm
+NOMERGEBINARIES = netpbm
+
+OBJECTS = netpbm.o
+
+default: $(DEFAULT_TARGET)
+	echo "EXISTENCE OF THIS FILE MEANS NETPBM HAS BEEN BUILT." \
+	  >build_complete
+	@echo ""
+	@echo "Netpbm is built.  The next step is normally to package it "
+	@echo "for installation by running "
+	@echo ""
+	@echo "    make package pkgdir=DIR"
+	@echo ""
+	@echo "to copy all the Netpbm files you need to install into the "
+	@echo "directory DIR.  Then you can proceed to install."
+
+all: nonmerge
+
+.PHONY: nonmerge
+nonmerge: $(PRODUCT_SUBDIRS:%=%/all)
+
+OMIT_CONFIG_RULE = 1
+OMIT_VERSION_H_RULE = 1
+OMIT_INTTYPES_RULE = 1
+include $(SRCDIR)/Makefile.common
+
+$(BUILDDIR)/Makefile.config: $(SRCDIR)/Makefile.config.in
+	$(SRCDIR)/configure $(SRCDIR)/Makefile.config.in
+
+
+# typegen is a utility program used by the make file below.
+TYPEGEN = $(BUILDDIR)/buildtools/typegen
+
+# endiangen is a utility program used by the make file below.
+ENDIANGEN = $(BUILDDIR)/buildtools/endiangen
+
+$(TYPEGEN): $(BUILDDIR)/buildtools
+	$(MAKE) -C $(dir $@) -f $(SRCDIR)/buildtools/Makefile \
+	    SRCDIR=$(SRCDIR) BUILDDIR=$(BUILDDIR) $(notdir $@) 
+
+DELETEIT = (rm -f $@ || false)
+
+$(BUILDDIR)/inttypes_netpbm.h: $(TYPEGEN)
+	$(TYPEGEN) >$@ || $(DELETEIT)
+
+# We run a couple of programs on the build machine in computing the
+# contents of pm_config.h.  We need to give the user a way not to do
+# that or to override the results, because it doesn't work if he's
+# cross compiling.
+
+$(BUILDDIR)/pm_config.h: \
+  $(SRCDIR)/pm_config.in.h Makefile.config inttypes_netpbm.h $(ENDIANGEN)
+	echo '/* pm_config.h GENERATED BY A MAKE RULE */' >$@ || $(DELETEIT)
+	echo '#ifndef PM_CONFIG_H' >>$@ || $(DELETEIT)
+	echo '#define PM_CONFIG_H' >>$@ || $(DELETEIT)
+ifeq ($(INTTYPES_H)x,x)
+	echo '/* Don't need to #include any inttypes.h-type thing */
+else
+  ifeq ($(INTTYPES_H),"inttypes_netpbm.h")
+	cat inttypes_netpbm.h >>$@ || $(DELETEIT)
+  else
+	echo '#include $(INTTYPES_H)' >>$@ || $(DELETEIT)
+  endif
+endif
+ifeq ($(HAVE_INT64),Y)
+	echo "#define HAVE_INT64 1" >>$@ || $(DELETEIT)
+else
+	echo "#define HAVE_INT64 0" >>$@ || $(DELETEIT)
+endif	
+	echo '/* pm_config.h.in FOLLOWS ... */' >>$@ || $(DELETEIT)
+	cat $(SRCDIR)/pm_config.in.h >>$@ || $(DELETEIT)
+	$(ENDIANGEN) >>$@ || $(DELETEIT)
+	echo '#endif' >>$@ || $(DELETEIT)
+
+
+MAJOR := $(NETPBM_MAJOR_RELEASE)
+MINOR := $(NETPBM_MINOR_RELEASE)
+POINT := $(NETPBM_POINT_RELEASE)
+$(BUILDDIR)/version.h:
+	@rm -f $@
+	@echo "/* Generated by make file rule */" >$@
+	@echo "#define NETPBM_VERSION" \
+	  \"Netpbm $(MAJOR).$(MINOR).$(POINT)"\"" >$@
+
+
+.PHONY: install
+install:
+	@echo "After doing a 'make', do "
+	@echo ""
+	@echo "  make package pkgdir=DIR"
+	@echo ""
+	@echo "to copy all the Netpbm files you need to install into the "
+	@echo "directory DIR."
+	@echo ""
+	@echo "Then, do "
+	@echo ""
+	@echo "  ./installnetpbm"
+	@echo
+	@echo "to install from there to your system via an interactive.  "
+	@echo "dialog.  Or do it manually using simple copy commands and "
+	@echo "following instructions in the file DIR/README"
+
+.PHONY: package package_build init_package advise_installnetpbm
+package: build_complete package_build advise_installnetpbm
+
+build_complete:
+# The regular build creates this file as its last act, so if it doesn't exist,
+# that means either the user skipping the build step, or the build failed.
+	@echo "You must build Netpbm before you can package Netpbm. "
+	@echo "The usual way to do this is to type 'make' with no arguments."
+	@echo "If you did that, then the build apparently failed.  There "
+	@echo "should have been error messages indicating why.  If you "
+	@echo "can't fix the build problem, you can do 'make --keep-going' "
+	@echo "to force the build to continue with other parts that "
+	@echo "it may be able to build successfully, then do "
+	@echo "'make package --keep-going' to package whatever was "
+	@echo "successfully built."
+	@echo
+	@false;
+
+package_build: init_package install-run install-dev 
+
+MAJOR=$(NETPBM_MAJOR_RELEASE)
+MINOR=$(NETPBM_MINOR_RELEASE)
+POINT=$(NETPBM_POINT_RELEASE)
+
+init_package:
+	@if [ -d $(PKGDIR) ]; then \
+	  echo "Directory $(PKGDIR) already exists.  Please specify a "; \
+	  echo "directory that can be created fresh, like this: "; \
+	  echo "  make package PKGDIR=/tmp/newnetpbm "; \
+	  false; \
+	  fi
+	mkdir $(PKGDIR)
+	echo "Netpbm install package made by 'make package'" \
+	    >$(PKGDIR)/pkginfo
+	date >>$(PKGDIR)/pkginfo
+	echo Netpbm $(MAJOR).$(MINOR).$(POINT) >$(PKGDIR)/VERSION
+	$(INSTALL) -c -m 664 $(SRCDIR)/buildtools/README.pkg $(PKGDIR)/README
+	$(INSTALL) -c -m 664 $(SRCDIR)/buildtools/config_template \
+	  $(PKGDIR)/config_template
+
+advise_installnetpbm:
+	@echo
+	@echo "Netpbm has been successfully packaged under directory"
+	@echo "$(PKGDIR).  Run 'installnetpbm' to install it on your system."
+
+.PHONY: install-run
+ifeq ($(DEFAULT_TARGET),merge)
+install-run: install-merge
+else
+install-run: install-nonmerge 
+endif
+
+.PHONY: install-merge install-nonmerge
+install-merge: install.merge install.lib install.data \
+	install.manweb install.man
+
+install-nonmerge: install.bin install.lib install.data \
+	install.manweb install.man
+
+.PHONY: merge
+merge: lib/all netpbm
+
+MERGELIBS = 
+ifneq ($(ZLIB),NONE)
+  MERGELIBS += $(ZLIB)
+endif
+ifneq ($(JPEGLIB),NONE)
+  MERGELIBS += $(JPEGLIB)
+endif
+ifneq ($(TIFFLIB),NONE)
+  MERGELIBS += $(TIFFLIB)
+endif
+ifneq ($(URTLIB),NONE)
+  MERGELIBS += $(URTLIB)
+endif
+ifneq ($(LINUXSVGALIB),NONE)
+  MERGELIBS += $(LINUXSVGALIB)
+endif
+ifneq ($(X11LIB),NONE)
+  MERGELIBS += $(X11LIB)
+endif
+
+ifeq ($(shell libpng-config --version),)
+  PNGLD = $(shell $(LIBOPT) $(LIBOPTR) $(PNGLIB) $(ZLIB))
+else
+  PNGLD = $(shell libpng-config --ldflags)
+endif
+
+ifeq ($(shell xml2-config --version),)
+  XML2LD=
+else
+  XML2LD=$(shell xml2-config --libs)
+endif
+
+
+# If URTLIB is BUNDLED_URTLIB, then we're responsible for building it, which
+# means it needs to be a dependency:
+ifeq ($(URTLIB),$(BUNDLED_URTLIB))
+  URTLIBDEP = $(URTLIB)
+endif
+
+# We have two different ways to do the merge build:
+#  
+#   1) Each directory produces an object file merge.o containing all the code
+#      in that directory and its descendants that needs to go into the 'netpbm'
+#      program.  The make files do this recursively, via a link command that
+#      combines multiple relocateable object files into one.  All we do here
+#      at the top level is make merge.o and link it with netpbm.o and the
+#      libraries.
+#
+#      This is the clean way, and we use it whenever we can.  But we don't
+#      know how to do the link on every platform.
+#
+#   2) Each directory produces a list of all the object files in that 
+#      directory and its descendants that need to go into the 'netpbm'
+#      program.  This list is in a file called 'mergelist'.  The make files
+#      do this recursively.  Here at the top level, we make mergelist and
+#      then do one large link of everything listed in it, plus netpbm.o and
+#      the libraries.
+#
+#      This doesn't require any special link command like (1), but is
+#      not very clean.  The dependencies don't work right.  And at least
+#      one linker (on DJGPP) can't handle that many input files.
+
+ifeq ($(LDRELOC),NONE)
+  OBJECT_DEP = mergelist
+  OBJECT_LIST = `cat mergelist`
+else
+  OBJECT_DEP = merge.o
+  OBJECT_LIST = merge.o
+endif
+
+netpbm:%:%.o $(OBJECT_DEP) $(NETPBMLIB) $(URTLIBDEP) $(LIBOPT)
+# Note that LDFLAGS might contain -L options, so order is important.
+	$(LD) -o $@ $< $(OBJECT_LIST) \
+          $(LDFLAGS) $(shell $(LIBOPT) $(NETPBMLIB) $(MERGELIBS)) \
+	  $(PNGLD) $(XML2LD) $(MATHLIB) $(NETWORKLD) $(LADD)
+
+netpbm.o: mergetrylist
+
+install.merge: local.install.merge
+.PHONY: local.install.merge
+local.install.merge:
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm pnmnoraw
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm gemtopbm
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm pnminterp
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm pgmoil
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm ppmtojpeg
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm bmptoppm
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm pgmnorm
+	cd $(PKGDIR)/bin; $(SYMLINKEXE) netpbm pnmfile
+
+ifneq ($(NETPBMLIBTYPE),unixstatic)
+install.lib: lib/install.lib
+else
+install.lib:
+endif
+
+.PHONY: install.manweb
+install.manweb: $(PKGDIR)/man/web/netpbm.url $(PKGDIR)/bin/doc.url
+
+$(PKGDIR)/man/web/netpbm.url: $(PKGDIR)/man/web
+	echo "$(NETPBM_DOCURL)" > $@
+	chmod $(INSTALL_PERM_MAN) $@
+
+$(PKGDIR)/bin/doc.url: $(PKGDIR)/bin
+	echo "$(NETPBM_DOCURL)" > $@
+	chmod $(INSTALL_PERM_MAN) $@
+
+.PHONY: install-dev
+# Note that you might install the development package and NOT the runtime
+# package.  If you have a special system for building stuff, maybe for 
+# multiple platforms, that's what you'd do.  Ergo, install.lib is here even
+# though it is also part of the runtime install.
+install-dev: install.hdr install.staticlib install.lib install.sharedlibstub
+
+.PHONY: install.hdr
+install.hdr: $(PKGDIR)/include
+	$(MAKE) -C lib -f $(SRCDIR)/lib/Makefile \
+	    SRCDIR=$(SRCDIR) BUILDDIR=$(BUILDDIR) install.hdr
+	$(INSTALL) -c -m $(INSTALL_PERM_HDR) \
+	    $(SRCDIR)/pm_config.h $(PKGDIR)/include
+
+ifeq ($(STATICLIB_TOO),y)
+BUILD_STATIC = y
+else
+  ifeq ($(NETPBMLIBTYPE),unixstatic)
+    BUILD_STATIC = y
+  else
+    BUILD_STATIC = n
+  endif
+endif
+
+.PHONY: install.staticlib
+install.staticlib: 
+ifeq ($(BUILD_STATIC),y)
+	$(MAKE) -C lib -f $(SRCDIR)/lib/Makefile \
+	SRCDIR=$(SRCDIR) BUILDDIR=$(BUILDDIR) install.staticlib 
+endif
+
+.PHONY: install.sharedlibstub
+install.sharedlibstub:
+	$(MAKE) -C lib -f $(SRCDIR)/lib/Makefile \
+	    SRCDIR=$(SRCDIR) BUILDDIR=$(BUILDDIR) install.sharedlibstub 
+
+clean: localclean
+
+.PHONY: localclean
+localclean:
+	rm -f netpbm build_started build_complete
+	rm -f pm_config.h inttypes_netpbm.h version.h
+
+# Note that removing Makefile.config must be the last thing we do,
+# because no other makes will work after that is done.
+distclean: localdistclean
+.PHONY: localdistclean
+localdistclean:
+	-rm -f `find -type l`
+	-rm -f Makefile.config
+
+# The following endif is for the else block that contains virtually the
+# whole file, for the test of the existence of CURDIR.
+endif