#*====================================================================* #- Copyright (C) 2001 Leptonica. All rights reserved. #- This software is distributed in the hope that it will be #- useful, but with NO WARRANTY OF ANY KIND. #- No author or distributor accepts responsibility to anyone for the #- consequences of using this software, or for whether it serves any #- particular purpose or works at all, unless he or she says so in #- writing. Everyone is granted permission to copy, modify and #- redistribute this source code, for commercial or non-commercial #- purposes, with the following restrictions: (1) the origin of this #- source code must not be misrepresented; (2) modified versions must #- be plainly marked as such; and (3) this notice may not be removed #- or altered from any source or modified source distribution. #*====================================================================*/ # makefile (for linux) # # Hand-built -- editable -- simple -- makefile # # For a nodebug version: make # For a debug version: make DEBUG=yes debug # For a shared library version: make SHARED=yes shared # For all versions: make all # With nonstandard header directories # make EXTRAINCLUDES="-I<nonstandard-incl-dir>" # # To remove object files in src: make clean # To remove object files and executables in prog: make clean # # Customization for endianness of machine hardware: # When using the gnu compiler, endianness is automatically # determined and set properly. Otherwise, set the $CPPFLAGS variable: # On little-endian machines (e.g., i386, x86-64): # CPPFLAGS = $(INCLUDES) -DL_LITTLE_ENDIAN # On big-endian machines (e.g., Mac Power PC, Sun Sparc): # CPPFLAGS = $(INCLUDES) -DL_BIG_ENDIAN # # Customization for I/O with external libraries (jpeg, png, tiff, gif): # Set flags in environ.h. The default is to have libjpeg, libpng, # libtiff and libz, but not libgif. # # Customization for non-POSIX-compliant GNU functions # fmemopen() and open_memstream(). # The default is not to use, because they only work on linux. # To use these, #define HAVE_FMEMOPEN to 1 in environ.h. # # Customization for cygwin: # (1) Use the appropriate $CC # (2) For the leptprotos target, the executable that has been # built is xtractprotos.exe. (add the ".exe") # # Customization for Microsoft compilers # (1) None required for recent versions (e.g., VC++9, VC++ Express). # Use the project files supplied: # leptonlib.sln # leptonlib.vcproj # (2) You can also substitute arrayaccess.h.vc for arrayaccess.h, to # use the inline macros rather than function calls which are slower. # # To generate function prototypes, you need a program called # xtractprotos. Build it with this command: # make xtractprotos # Then use it with 'make allprotos' ### Stuff used by Makefile RM = rm -f TEST = test MKDIRHIER = mkdir -p LIBRARIAN = ar cq RANLIB = ranlib # Libraries are built into a binary tree. By default, the root # is in the parent directory. ROOT_DIR = .. BASE_OBJ = $(ROOT_DIR)/obj OBJ_NODEBUG = $(ROOT_DIR)/obj/nodebug OBJ_DEBUG = $(ROOT_DIR)/obj/debug OBJ_SHARED = $(ROOT_DIR)/obj/shared BASE_LIB = $(ROOT_DIR)/lib LIB_NODEBUG = $(ROOT_DIR)/lib/nodebug LIB_DEBUG = $(ROOT_DIR)/lib/debug LIB_SHARED = $(ROOT_DIR)/lib/shared # Include files INCLUDES = -I. $(EXTRAINCLUDES) PROTOTYPE_DIR = . # Which flags to use? # use -Werror to verify there are no serious warnings # use g++ to apply stricter rules. Libraries made with g++ may not # link to programs compiled with gcc (depends on the glibc version). # use -Wunused to identify unused varables # use -DNO_CONSOLE_IO to remove all L_INFO, L_WARNING, L_ERROR and # ERROR_* logging, and to remove all DEBUG information dependent # on whether or not NO_CONSOLE_IO has been defined. # use -D_CYGWIN_ENVIRON (and without -fPIC) for cygwin CC = gcc -ansi -Werror -D_BSD_SOURCE -DANSI -fPIC #CC = gcc -ansi -Werror -D_CYGWIN_ENVIRON -DANSI #CC = gcc -ansi -Werror -DNO_CONSOLE_IO -D_BSD_SOURCE -DANSI -fPIC #CC = g++ -Werror -D_BSD_SOURCE -fPIC #CC = g++ -Wunused -D_BSD_SOURCE -fPIC #CC = gcc -ansi -D_BSD_SOURCE -DANSI # Test for processor endianness (valid with gnu make only) ENDIANNESS := $(shell $(CC) -o endiantest endiantest.c; ./endiantest; rm -f endiantest) # Conditional compilation (depending on processor endianness) CPPFLAGS = $(INCLUDES) -D$(ENDIANNESS) #CPPFLAGS = $(INCLUDES) -DL_LITTLE_ENDIAN #CPPFLAGS = $(INCLUDES) -DL_BIG_ENDIAN # Shared library linker options SONAME_OPTION = -Wl,-h, ifdef SHARED OPTIMIZE = -O2 -fPIC else ifdef DEBUG OPTIMIZE = -g else OPTIMIZE = -O2 endif endif OPTIONS = CFLAGS = $(OPTIMIZE) $(OPTIONS) LIBRARIAN_SHARED = gcc -shared # Libraries differing only in their minor revision numbers # are required to have the same interface. By using # "-h" in the ld, the "soname" is <libname>.X, where X is # the major revision number. # Links are created among the files <libname>.X.Y, # <libname>.X, and <libname>, where Y is the minor revision number. MAJOR_REV = 1 MINOR_REV = 62 ######################################################### # Libraries LEPTLIB = liblept.a LEPTLIB_SHARED = liblept.so ######################################################### LEPTLIB_C = adaptmap.c affine.c affinecompose.c \ arithlow.c arrayaccess.c \ bardecode.c baseline.c bbuffer.c \ bilinear.c binarize.c \ binexpand.c binexpandlow.c \ binreduce.c binreducelow.c \ blend.c bmf.c bmpio.c bmpiostub.c \ boxbasic.c boxfunc1.c boxfunc2.c boxfunc3.c \ ccbord.c ccthin.c classapp.c \ colorcontent.c colormap.c colormorph.c \ colorquant1.c colorquant2.c colorseg.c \ compare.c conncomp.c \ convolve.c convolvelow.c correlscore.c \ dwacomb.2.c dwacomblow.2.c \ edge.c enhance.c \ fhmtauto.c fhmtgen.1.c fhmtgenlow.1.c \ flipdetect.c fliphmtgen.c \ fmorphauto.c fmorphgen.1.c fmorphgenlow.1.c \ fpix1.c fpix2.c \ gifio.c gifiostub.c gplot.c graphics.c \ graymorph.c graymorphlow.c \ grayquant.c grayquantlow.c heap.c \ jbclass.c jpegio.c jpegiostub.c \ kernel.c list.c maze.c \ morph.c morphapp.c morphdwa.c morphseq.c \ numabasic.c numafunc1.c numafunc2.c \ pageseg.c paintcmap.c \ parseprotos.c partition.c \ pix1.c pix2.c pix3.c pix4.c \ pixabasic.c pixacc.c \ pixafunc1.c pixafunc2.c \ pixalloc.c pixarith.c \ pixconv.c pixtiling.c \ pngio.c pngiostub.c pnmio.c pnmiostub.c \ projective.c psio.c psiostub.c \ ptra.c pts.c queue.c rank.c \ readbarcode.c readfile.c \ rop.c ropiplow.c roplow.c \ rotate.c rotateam.c rotateamlow.c \ rotateorth.c rotateorthlow.c rotateshear.c \ runlength.c sarray.c \ scale.c scalelow.c \ seedfill.c seedfilllow.c \ sel1.c sel2.c selgen.c \ shear.c skew.c stack.c \ textops.c tiffio.c tiffiostub.c \ utils.c viewfiles.c \ warper.c watershed.c writefile.c \ zlibmem.c zlibmemstub.c LEPTLIB_H = allheaders.h alltypes.h \ array.h arrayaccess.h bbuffer.h \ bmf.h bmp.h ccbord.h \ environ.h gplot.h \ heap.h imageio.h \ jbclass.h jpeglib.h \ leptprotos.h list.h \ morph.h pix.h ptra.h queue.h \ readbarcode.h stack.h \ watershed.h ################################################################## # Main targets nodebug: dirs $(LEPTLIB:%=$(LIB_NODEBUG)/%) all: make -f makefile TARGET=$(TARGET) nodebug make -f makefile TARGET=$(TARGET) DEBUG=true debug make -f makefile TARGET=$(TARGET) SHARED=true shared DEBUG_LIBS = $(LEPTLIB:%=$(LIB_DEBUG)/%) SHARED_LIBS = $(LEPTLIB_SHARED:%=$(LIB_SHARED)/%) debug: dirs $(DEBUG_LIBS) shared: dirs $(SHARED_LIBS) ################################################################## # Proto target # # Note: To make the prototype file leptprotos.h requires the existence # of the xtractprotos executable. However, we don't let the allprotos # target depend explicitly on xtractprotos because of a dependency loop # back on leptprotos.h, which causes an extra library compilation # when you 'make allprotos'. Before making allprotos the first # time, 'make xtractprotos' (Also, see the comments near the top # of this Makefile.) # # Note for cygwin: change the leptprotos target to: # - test for xtractprotos.exe # - run ./xtractprotos.exe ... allprotos: leptprotos leptprotos: $(LEPTLIB_C) @$(TEST) -f xtractprotos || echo "First run 'make xtractprotos'" ./xtractprotos -prestring=LEPT_DLL $(LEPTLIB_C) > tempprotos.h mv tempprotos.h $(PROTOTYPE_DIR)/$@.h ################################################################## # xtractprotos # xtractprotos: dirs leptlib xtractprotos.o $(CC) -o xtractprotos xtractprotos.o $(LIB_NODEBUG)/liblept.a xtractprotos.o: xtractprotos.c ################################################################## # Rule to make optimized library $(LIB_NODEBUG)/%.a: $(RM) $@ $(LIBRARIAN) $@ $< $(RANLIB) $@ # Rule to make debuggable library $(LIB_DEBUG)/%.a: $(RM) $@ $(LIBRARIAN) $@ $< $(RANLIB) $@ # Rule to make shared library $(LIB_SHARED)/%.so: $(RM) $@ $(LIBRARIAN_SHARED) $(SONAME_OPTION)$(notdir $@).$(MAJOR_REV) -o $@ $< mv $@ $@.$(MAJOR_REV).$(MINOR_REV) cd $(LIB_SHARED); rm $(notdir $@).$(MAJOR_REV); \ ln -s $(notdir $@).$(MAJOR_REV).$(MINOR_REV) $(notdir $@).$(MAJOR_REV) cd $(LIB_SHARED); rm $(notdir $@); \ ln -s $(notdir $@).$(MAJOR_REV) $(notdir $@) ################################################################## # No-debug library dependencies and rules leptlib: $(LIB_NODEBUG)/$(LEPTLIB) $(LIB_NODEBUG)/$(LEPTLIB): $(LEPTLIB_C:%.c=$(OBJ_NODEBUG)/%.o) $(RM) $@ $(LIBRARIAN) $@ $(LEPTLIB_C:%.c=$(OBJ_NODEBUG)/%.o) $(RANLIB) $@ # Debug library dependencies and rules leptlibd: $(LIB_DEBUG)/$(LEPTLIB) $(LIB_DEBUG)/$(LEPTLIB): $(LEPTLIB_C:%.c=$(OBJ_DEBUG)/%.o) $(RM) $@ $(LIBRARIAN) $@ $(LEPTLIB_C:%.c=$(OBJ_DEBUG)/%.o) $(RANLIB) $@ # Shared library dependencies, rules and links leptlibs: $(LIB_SHARED)/$(LEPTLIB_SHARED) $(LIB_SHARED)/$(LEPTLIB_SHARED): $(LEPTLIB_C:%.c=$(OBJ_SHARED)/%.o) $(RM) $@ $(LIBRARIAN_SHARED) $(SONAME_OPTION)$(notdir $@).$(MAJOR_REV) -o $@ $(LEPTLIB_C:%.c=$(OBJ_SHARED)/%.o) mv $@ $@.$(MAJOR_REV).$(MINOR_REV) cd $(LIB_SHARED); rm $(notdir $@).$(MAJOR_REV); \ ln -s $(notdir $@).$(MAJOR_REV).$(MINOR_REV) $(notdir $@).$(MAJOR_REV) cd $(LIB_SHARED); rm $(notdir $@); \ ln -s $(notdir $@).$(MAJOR_REV) $(notdir $@) ######################################################### # Rules for compiling source $(OBJ_NODEBUG)/%.o: %.c $(LEPTLIB_H) @$(TEST) -d $(OBJ_NODEBUG) || $(MKDIRHIER) $(OBJ_NODEBUG) $(COMPILE.c) -o $@ $< $(OBJ_DEBUG)/%.o: %.c $(LEPTLIB_H) @$(TEST) -d $(OBJ_DEBUG) || $(MKDIRHIER) $(OBJ_DEBUG) $(COMPILE.c) -o $@ $< $(OBJ_SHARED)/%.o: %.c $(LEPTLIB_H) @$(TEST) -d $(OBJ_SHARED) || $(MKDIRHIER) $(OBJ_SHARED) $(COMPILE.c) -o $@ $< ########################################################### # Prepare a local environment dirs: @$(TEST) -d $(BASE_OBJ) || $(MKDIRHIER) $(BASE_OBJ) @$(TEST) -d $(OBJ_NODEBUG) || $(MKDIRHIER) $(OBJ_NODEBUG) @$(TEST) -d $(OBJ_DEBUG) || $(MKDIRHIER) $(OBJ_DEBUG) @$(TEST) -d $(OBJ_SHARED) || $(MKDIRHIER) $(OBJ_SHARED) @$(TEST) -d $(BASE_LIB) || $(MKDIRHIER) $(BASE_LIB) @$(TEST) -d $(LIB_NODEBUG) || $(MKDIRHIER) $(LIB_NODEBUG) @$(TEST) -d $(LIB_DEBUG) || $(MKDIRHIER) $(LIB_DEBUG) @$(TEST) -d $(LIB_SHARED) || $(MKDIRHIER) $(LIB_SHARED) ########################################################### clean: $(RM) $(OBJ_NODEBUG)/*.o $(OBJ_DEBUG)/*.o \ $(OBJ_SHARED)/*.o \ $(LIB_NODEBUG)/*.a $(LIB_DEBUG)/*.a \ $(LIB_SHARED)/*.so $(LIB_SHARED)/*.so.? \ $(LIB_SHARED)/*.so.?.* \ xtractprotos.o xtractprotos ########################################################### depend: /usr/bin/makedepend -DNO_PROTOS $(CPPFLAGS) $(LEPTLIB_C) ########################################################### # DO NOT DELETE THIS LINE -- make depend depends on it.