##############################################################################
##############################################################################
#                                                                            #
# This file is part of the SYMPHONY MILP Solver Framework.                   #
#                                                                            #
# SYMPHONY was jointly developed by Ted Ralphs (ted@lehigh.edu) and          #
# Laci Ladanyi (ladanyi@us.ibm.com).                                         #
#                                                                            #
# (c) Copyright 2000-2005  Ted Ralphs. All Rights Reserved.                  #
#                                                                            #
# This software is licensed under the Eclipse Public License. Please see     #
# accompanying file for terms.                                               #
#                                                                            #
##############################################################################
##############################################################################

##############################################################################
#-----------------------------------------------------------------------------
# 
# The variables, to be set by user, have been moved with SYMPHONY 5.1! Please 
# see the 'config' file for further information and available user variables. 
# The user should not need to modify this file. 
#
#-----------------------------------------------------------------------------
##############################################################################

CONFIG_FILE_DIR = $(PWD)
ifeq ($(USE_SYM_APPL), TRUE)
CONFIG_FILE_DIR = $(SYMPHONYROOT)
endif

CONFIG_FILE = config
UNAME = $(shell uname -a)

ifeq ($(findstring Linux,${UNAME}),Linux)
    ARCH = LINUX
else
ifeq ($(findstring alpha,${UNAME}),alpha)
    ARCH = ALPHA
else
ifeq ($(findstring AIX,${UNAME}),AIX)
    ARCH = RS6K
else
ifeq ($(findstring SunOS,${UNAME}),SunOS)
     ifeq ($(findstring i86pc,${UNAME}),i86pc)
           ARCH = X86SOL2
     else
     ifeq ($(findstring 5.,$(UNAME)),5.)
           ARCH = SUN4SOL2
           NP = $(shell mpstat | wc -l -gt -a)
                  ifeq ($(NP,ON)
                         ARCH = SUNMP
                  endif
     endif
     endif
else
ifeq ($(findstring CYGWIN,${UNAME}),CYGWIN)
    ARCH = CYGWIN
endif
ifeq ($(findstring Darwin,${UNAME}),Darwin)
    ARCH = DARWIN
endif
endif
endif
endif
endif

include $(CONFIG_FILE_DIR)/$(CONFIG_FILE)

##############################################################################
##############################################################################

ifeq ($(USE_CGL_CUTS),TRUE)
LPLIB += -lCgl
ifneq ($(LP_SOLVER),OSI)
LPINCDIR += $(COINROOT)/include
LPLIBPATHS += $(COINROOT)/lib
LPLIB += -lCoin -lOsi
endif
endif

##############################################################################
##############################################################################

ifeq ($(USE_OSI_INTERFACE),TRUE)
OSISYM_INCDIR     = $(COINROOT)/Osi/OsiSym/include
OSISYM_LIB        = -lOsiSym
ifneq ($(LP_SOLVER),OSI)
OSISYM_INCDIR     += $(COINROOT)/include
OSISYM_LIBPATH    += $(COINROOT)/lib      
OSISYM_LIB        += -lCoin -lOsi
endif
endif

##############################################################################
##############################################################################
# Determine if COIN is using lapack &/or zlib.
##############################################################################
##############################################################################

#include $(COINROOT)/Makefiles/Makefile.location
#ifneq ($(filter COIN_lapack,$(CoinLibsDefined)),)
#	LPINCDIR += lapackIncDir
#	LPLIBPATHS += lapackLibDir
#	LPLIB += -llapack -lblas -lg2c
#endif
#ifneq ($(filter COIN_libz,$(CoinLibsDefined)),)
#	LPINCDIR += zlibIncDir
#	LPLIBPATHS += zlibLibDir
#	LPLIB += -lz
#endif
#ifneq ($(filter COIN_libbz,$(CoinLibsDefined)),)
#	LPINCDIR += bzlibIncDir
#	LPLIBPATHS += bzlibLibDir
#	LPLIB += -lbz2
#endif

##############################################################################
##############################################################################
# Set the paths for PVM
##############################################################################
##############################################################################

ifeq ($(COMM_PROTOCOL),PVM)
	COMMINCDIR = $(PVM_ROOT)/include
	COMMLIBPATHS = $(PVM_ROOT)/lib/$(PVM_ARCH)
	COMMLIBS = -lgpvm3 -lpvm3
endif

##############################################################################
##############################################################################
# OS dependent flags, paths, libraries
# Set separate variable values for each architecture here
##############################################################################
##############################################################################

##############################################################################
# LINUX Definitions
##############################################################################

ifeq ($(ARCH),LINUX)
	SHLINKPREFIX := -Wl,-rpath,
	X11LIBPATHS = /usr/X11R6/lib
	ifeq ($(LP_SOLVER),CPLEX)
	   LPSOLVER_DEFS = -DSYSFREEUNIX
	endif
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM
	SYSLIBPATHS = /usr/lib/termcap
	SYSLIBS = -lpthread #-lefence
	ifeq ($(HAS_READLINE), TRUE)
		SYSLIBS += -lreadline -ltermcap
	endif
endif

##############################################################################
# CYGWIN Definitions
##############################################################################

ifeq ($(ARCH),CYGWIN)
	SHLINKPREFIX := -Wl,-rpath,
	X11LIBPATHS = /usr/X11R6/lib
	ifeq ($(LP_SOLVER),CPLEX)
	   LPSOLVER_DEFS = -DSYSFREEUNIX
	endif
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM
	SYSLIBS = -lpthread #-lefence
	LIBTYPE = STATIC #SHARED is not supported on CYGWIN
	HAS_READLINE = FALSE
endif

##############################################################################
# RS6K Definitions
##############################################################################

ifeq ($(ARCH),RS6K)
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM
	SYSLIBS = -lbsd
	ifeq ($(ARCH),RS6KMP)
	   SYSLIBS += -lpthreads
	endif
endif

##############################################################################
# Sun Sparc Solaris Definitions
##############################################################################

ifeq ($(ARCH),SUN4SOL2)
	SHLINKPREFIX = -Wl,-R,
	X11LIBPATHS = /usr/local/X11/lib
	ifeq ($(LP_SOLVER),CPLEX)
	   LPSOLVER_DEFS = -DSYSGNUSOLARIS
	endif
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM 
	SYSLIBS = -lsocket -lnsl
endif

##############################################################################
# Sun MP Definitions
##############################################################################

ifeq ($(ARCH),SUNMP)
	SHLINKPREFIX = -Wl,-R,
	X11LIBPATHS = /usr/local/X11/lib
	ifeq ($(LP_SOLVER),CPLEX)
	   LPSOLVER_DEFS = -DSYSGNUSOLARIS
	endif
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM 
	SYSLIBS = -lsocket -lnsl
endif

##############################################################################
# X86 Solaris Definitions
##############################################################################

ifeq ($(ARCH),X86SOL2)
	SHLINKPREFIX = -Wl,-R,
	X11LIBPATHS = /usr/local/X11/lib
	ifeq ($(LP_SOLVER),CPLEX)
	   LPSOLVER_DEFS = -DSYSGNUSOLARIS
	endif
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM
	SYSLIBS = -lsocket -lnsl
endif

##############################################################################
# Alpha Definitions
##############################################################################

ifeq ($(ARCH),ALPHA)
	X11LIBPATHS = /usr/local/X11/lib
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM
	SYSLIBS =
endif

##############################################################################
# Darwin Definitions
##############################################################################

ifeq ($(ARCH),DARWIN)
	X11LIBPATHS = /usr/local/X11/lib
	MACH_DEP = -DHAS_RANDOM -DHAS_SRANDOM
	SYSLIBS =
	EXTRAINCDIR = /usr/include/malloc
	LIBTYPE = STATIC #SHARED is not supported on Darwin
	HAS_READLINE = FALSE
endif

##############################################################################
##############################################################################
# !!!!!!!!!!!!!!!!!!!USER SHOULD NOT EDIT BELOW THIS LINE !!!!!!!!!!!!!!!!!!!!
##############################################################################
##############################################################################

##############################################################################
# Set the VER to "g" if using gcc
##############################################################################

ifeq ($(CC),gcc)
	VER = g
else
	VER = x
endif
ifeq ($(VER),g)
	VERSION=GNU
else
	VERSION=NOGNU
endif

##############################################################################
# Paths
##############################################################################
##############################################################################

##############################################################################
# Set the configuration and path
##############################################################################

ifeq ($(USE_SYM_APPL),TRUE)
SYM_COMPILE_IN_CG = $(COMPILE_IN_CG)
SYM_COMPILE_IN_CP = $(COMPILE_IN_CP)
SYM_COMPILE_IN_LP = $(COMPILE_IN_LP)
SYM_COMPILE_IN_TM = $(COMPILE_IN_TM)
else
SYMPHONYROOT = $(PWD)
endif

ifneq ($(USE_SYM_APPL),TRUE)
ifeq ($(SYMBUILDDIR),)
SYMBUILDDIR = $(SYMPHONYROOT)
endif
endif

ifeq ($(SYM_COMPILE_IN_TM),TRUE)
	CONFIG:=1
else
	CONFIG:=0
endif 
ifeq ($(SYM_COMPILE_IN_LP),TRUE)
	CONFIG:=1$(CONFIG)
else
	CONFIG:=0$(CONFIG)
endif 
ifeq ($(SYM_COMPILE_IN_CG),TRUE)
	CONFIG:=1$(CONFIG)
else
	CONFIG:=0$(CONFIG)
endif 
ifeq ($(SYM_COMPILE_IN_CP),TRUE)
	CONFIG:=1$(CONFIG)
else
	CONFIG:=0$(CONFIG)
endif 

INCDIR       = $(EXTRAINCDIR) -I$(SYMPHONYROOT)/include 
ifeq ($(USE_SYM_APPL),TRUE)
INCDIR      += -I$(USERROOT)/include 
endif
INCDIR 	    += $(USER_INCDIR)

#__BEGIN_EXPERIMENTAL_SECTION__#
ifeq ($(DECOMP),TRUE)
INCDIR 	    += -I$(SYMPHONYROOT)/include/decomp
endif
#___END_EXPERIMENTAL_SECTION___#

USER_OBJDIR  = $(USERBUILDDIR)/objects/$(ARCH)/$(CONFIG)
USER_LIBDIR  = $(USERBUILDDIR)/lib/$(ARCH)
DEPDIR       = $(SYMBUILDDIR)/dep/$(ARCH)
USER_DEPDIR  = $(USERBUILDDIR)/dep/$(ARCH)

ifeq ($(USE_GLPMPL), TRUE)
GMPLINCDIR   = $(SYMPHONYROOT)/src/GMPL
LPINCDIR    += $(GMPLINCDIR)
GMPL_OBJDIR  = $(SYMBUILDDIR)/src/GMPL/objects/$(ARCH)
endif

ifeq ($(LP_SOLVER),OSI)
ifeq ($(USE_SYM_APPL), TRUE)
OBJDIR	     = $(SYMBUILDDIR)/objects/$(ARCH)/$(CONFIG)/APPL_$(LP_SOLVER)_$(OSI_INTERFACE)
LIBDIR	     = $(SYMBUILDDIR)/lib/$(ARCH)/APPL_$(LP_SOLVER)_$(OSI_INTERFACE)
BINDIR       = $(USERBUILDDIR)/bin/$(ARCH)/$(LP_SOLVER)_$(OSI_INTERFACE)
else
OBJDIR   = $(SYMBUILDDIR)/objects/$(ARCH)/$(CONFIG)/$(LP_SOLVER)_$(OSI_INTERFACE)
LIBDIR   = $(SYMBUILDDIR)/lib/$(ARCH)/$(LP_SOLVER)_$(OSI_INTERFACE)
BINDIR   = $(SYMBUILDDIR)/bin/$(ARCH)/$(LP_SOLVER)_$(OSI_INTERFACE)
endif
else
ifeq ($(USE_SYM_APPL), TRUE)
OBJDIR	     = $(SYMBUILDDIR)/objects/$(ARCH)/$(CONFIG)/APPL_$(LP_SOLVER)
LIBDIR	     = $(SYMBUILDDIR)/lib/$(ARCH)/APPL_$(LP_SOLVER)
BINDIR       = $(USERBUILDDIR)/bin/$(ARCH)/$(LP_SOLVER)
else
OBJDIR   = $(SYMBUILDDIR)/objects/$(ARCH)/$(CONFIG)/$(LP_SOLVER)
LIBDIR   = $(SYMBUILDDIR)/lib/$(ARCH)/$(LP_SOLVER)
BINDIR   = $(SYMBUILDDIR)/bin/$(ARCH)/$(LP_SOLVER)
endif
endif

SRCDIR  = \
	$(SYMPHONYROOT)/src/Common      :\
	$(SYMPHONYROOT)/src/LP          :\
	$(SYMPHONYROOT)/src/CutGen      :\
	$(SYMPHONYROOT)/src/CutPool     :\
	$(SYMPHONYROOT)/src/SolPool     :\
	$(SYMPHONYROOT)/src/DrawGraph   :\
	$(SYMPHONYROOT)/src/Master      :\
	$(SYMPHONYROOT)/include     :\
	$(SYMPHONYROOT)             :\
	$(SYMPHONYROOT)/src/TreeManager :\
	$(SYMPHONYROOT)/src/GMPL

USER_SRCDIR += \
	$(USERROOT)/src/Common    :\
	$(USERROOT)/src/LP        :\
	$(USERROOT)/src/CutGen    :\
	$(USERROOT)/src/CutPool   :\
	$(USERROOT)/src/SolPool   :\
	$(USERROOT)/src/DrawGraph :\
	$(USERROOT)/src/Master    :\
	$(USERROOT)/include   :\
	$(USERROOT)           

VPATH  = $(SRCDIR):$(USER_SRCDIR)

##############################################################################
# Put it together
##############################################################################

LIBPATHS      = $(LIBDIR) $(X11LIBPATHS) $(SYSLIBPATHS) $(COMMLIBPATHS) $(LPLIBPATHS) \
		$(OSISYM_LIBPATH)
LIBPATHS     += $(USERLIBPATHS)
INCPATHS      = $(X11INCDIR) $(COMMINCDIR) $(LPINCDIR) $(LPSINCDIR)\
		$(OSISYM_INCDIR)

EXTRAINCDIR   = $(addprefix -I,${INCPATHS})
LDFLAGS       = $(addprefix -L,${LIBPATHS})
ifneq (${SHLINKPREFIX},)
     LDFLAGS += $(addprefix ${SHLINKPREFIX},${LIBPATHS})
endif

ifeq ($(CC),ompcc)
	LIBS  = -lm -lompc -ltlog -lthread $(COMMLIBS) $(SYSLIBS) \
	$(USERLIBS)
else
	LIBS  = -lm $(SYSLIBS) $(USERLIBS) $(COMMLIBS)
endif
ifeq ($(DRAWGRAPH),TRUE)
	LIBS += -lX11
endif

ifeq ($(OPT),-O)
    ifeq ($(CC),gcc)
	OPT = -O3 
    endif
    ifeq ($(ARCH),RS6K)
	ifeq ($(CC),xlC)
	    OPT = -O3 -qmaxmem=16384 -qarch=pwr2 -qtune=pwr2s
            OPT += -bmaxdata:0x80000000 -bloadmap:main.map
	endif
    endif
endif

ifeq ($(OPT),-g)
   ifeq ($(VERSION),GNU)
      OPT = -g 
      EFENCE = -lefence
   endif
   ifeq ($(ARCH),RS6K)
      ifeq ($(CC),xlC)
         OPT = -bmaxdata:0x80000000 -bloadmap:main.map
         OPT += -bnso -bnodelcsect -bI:/lib/syscalls.exp
         EFENCE = -lefence
      endif
   endif
endif

##############################################################################
##############################################################################
# Purify related flags
##############################################################################
##############################################################################

ifeq ($(ARCH),SUN4SOL2)
	PURIFYCACHEDIR=$(HOME)/purify-quantify/cache/SUN4SOL2
	PUREBIN = /home/purify/purify-4.1-solaris2/purify
endif
ifeq ($(ARCH),X86SOL2)
	PURIFYCACHEDIR=$(HOME)/purify-quantify/cache/X86SOL2
	PUREBIN = /home/purify/purify-4.1-solaris2/purify
endif

PFLAGS = -cache-dir=$(PURIFYCACHEDIR) -chain-length=10 \
	 -user-path=$(USERBUILDDIR)/bin/$(ARCH) \
         #-log-file=$(USERROOT)/purelog_%v.%p \
         #-mail-to-user=$(USER) # -copy-fd-output-to-logfile=1,2
PURIFY = $(PUREBIN) $(PFLAGS)

##############################################################################
##############################################################################
# Quantify related flags
##############################################################################
##############################################################################

ifeq ($(ARCH),SUN4SOL2)
	QUANTIFYCACHEDIR=$(HOME)/purify-quantify/cache/SUN4SOL2
	QUANTIFYBIN = /opts/pure/quantify-2.1-solaris2/quantify
endif
ifeq ($(ARCH),X86SOL2)
	QUANTIFYCACHEDIR=$(HOME)/purify-quantify/cache/X86SOL2
	QUANTIFYBIN = /opts/pure/quantify-2.1-solaris2/quantify
endif
QFLAGS   = -cache-dir=$(QUANTIFYCACHEDIR) 
QFLAGS  += -user-path=$(USERROOT)/bin/$(ARCH)
QUANTIFY = $(QUANTIFYBIN) $(QFLAGS)

##############################################################################
##############################################################################
#  Extensions and filenames for various configurations
##############################################################################
##############################################################################

ifeq ($(SYM_COMPILE_IN_CG),TRUE)
LPEXT = _cg
endif
ifeq ($(SYM_COMPILE_IN_CP),TRUE)
CPEXT = _cp
endif
ifeq ($(SYM_COMPILE_IN_LP),TRUE)
TMEXT = _lp$(LPEXT)$(CPEXT)
else
TMEXT = $(CPEXT)
endif
ifeq ($(SYM_COMPILE_IN_TM),TRUE)
MASTEREXT = _m_tm$(TMEXT)
endif

ifeq ($(MASTERNAME),)
MASTERNAME = symphony
endif

##############################################################################
##############################################################################
# Putting together DEF's, FLAGS
##############################################################################
##############################################################################

SYSDEFINES  = -D__$(COMM_PROTOCOL)__ $(LPSOLVER_DEFS) 
SYSDEFINES += $(MACH_DEP) -D__$(ARCH)

ifeq ($(USE_CGL_CUTS),TRUE)
SYSDEFINES += -DUSE_CGL_CUTS
endif
#ifneq ($(MAKECMDGOALS), symphony)
#SYSDEFINES += -DUSE_SYM_APPLICATION
#endif
ifeq ($(USE_SYM_APPL),TRUE)
SYSDEFINES += -DUSE_SYM_APPLICATION
endif
ifeq ($(USE_OSI_INTERFACE),TRUE)
SYSDEFINES += -DUSE_OSI_INTERFACE
endif
ifeq ($(LP_SOLVER), OSI)
SYSDEFINES += -D__OSI_$(OSI_INTERFACE)__
else
SYSDEFINES += -D__$(LP_SOLVER)__
endif
ifeq ($(USE_GLPMPL),TRUE)
SYSDEFINES += -DUSE_GLPMPL
endif
ifeq ($(HAS_READLINE),TRUE)
SYSDEFINES += -DHAS_READLINE
endif

BB_DEFINES  = $(USER_BB_DEFINES)
ifeq ($(SENSITIVITY_ANALYSIS),TRUE)
BB_DEFINES += -DSENSITIVITY_ANALYSIS
endif
ifeq ($(ROOT_NODE_ONLY),TRUE)
BB_DEFINES += -DROOT_NODE_ONLY
endif
ifeq ($(TRACE_PATH),TRUE)
BB_DEFINES += -DTRACE_PATH 
endif
ifeq ($(CHECK_CUT_VALIDITY),TRUE)
BB_DEFINES += -DCHECK_CUT_VALIDITY
endif
ifeq ($(CHECK_LP),TRUE)
BB_DEFINES += -DCOMPILE_CHECK_LP
endif

ifeq ($(SYM_COMPILE_IN_CG),TRUE)
BB_DEFINES += -DCOMPILE_IN_CG
endif
ifeq ($(SYM_COMPILE_IN_CP),TRUE)
BB_DEFINES += -DCOMPILE_IN_CP
endif
ifeq ($(SYM_COMPILE_IN_LP),TRUE)
BB_DEFINES+= -DCOMPILE_IN_LP
endif
ifeq ($(SYM_COMPILE_IN_TM), TRUE)
BB_DEFINES += -DCOMPILE_IN_TM
endif
ifeq ($(COMPILE_FRAC_BRANCHING),TRUE)
BB_DEFINES  += -DCOMPILE_FRAC_BRANCHING
endif
ifeq ($(DO_TESTS),TRUE)
BB_DEFINES  += -DDO_TESTS
endif
ifeq ($(BIG_PROBLEM),TRUE)
BB_DEFINES  += -DBIG_PROBLEM
endif
ifeq ($(TM_BASIS_TESTS),TRUE)
BB_DEFINES  += -DTM_BASIS_TESTS
endif
ifeq ($(EXACT_MACHINE_HANDLING),TRUE)
BB_DEFINES  += -DEXACT_MACHINE_HANDLING
endif
ifeq ($(STATISTICS),TRUE)
BB_DEFINES  += -DSTATISTICS
endif
ifeq ($(PSEUDO_COSTS),TRUE)
BB_DEFINES  += -DPSEUDO_COSTS
endif

#__BEGIN_EXPERIMENTAL_SECTION__#
##############################################################################
# DECOMP related stuff 
##############################################################################

ifeq ($(DECOMP),TRUE)
BB_DEFINES += -DCOMPILE_DECOMP
endif

#___END_EXPERIMENTAL_SECTION___#
##############################################################################
# Compiler flags
##############################################################################

STRICT_CHECKING = FALSE

DEFAULT_FLAGS = $(OPT) $(SYSDEFINES) $(BB_DEFINES) $(INCDIR)

MORECFLAGS =

ifeq ($(STRICT_CHECKING),TRUE)
ifeq ($(VERSION),GNU)
	MORECFLAGS = -ansi -pedantic -Wall -Wid-clash-81 -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -fnonnull-objects #-pipe
endif
else 
MOREFLAGS = 
endif

ifeq ($(LIBTYPE),SHARED)
ifneq ($(ARCH),CYGWIN)
MORECFLAGS += -fPIC
endif
endif

CFLAGS = $(DEFAULT_FLAGS) $(MORECFLAGS) $(MOREFLAGS)

LD             = $(AR)
LIBLDFLAGS     =

##############################################################################
##############################################################################
# Global source files
##############################################################################
##############################################################################

MASTER_SRC	= master.c master_wrapper.c master_io.c master_func.c

MASTER_MAIN_SRC =
ifneq ($(USE_SYM_APPL),TRUE)
MASTER_MAIN_SRC     = main.c
endif

DG_SRC		= draw_graph.c

ifeq ($(SYM_COMPILE_IN_TM), TRUE)
TM_SRC		= tm_func.c tm_proccomm.c
else
TM_SRC          = treemanager.c tm_func.c tm_proccomm.c
endif
ifeq ($(SYM_COMPILE_IN_LP),TRUE)
TM_SRC         += lp_solver.c lp_varfunc.c lp_rowfunc.c lp_genfunc.c
TM_SRC         += lp_proccomm.c lp_wrapper.c lp_free.c
ifeq ($(PSEUDO_COSTS),TRUE)
TM_SRC         += lp_pseudo_branch.c
else
TM_SRC         += lp_branch.c
endif
ifeq ($(SYM_COMPILE_IN_CG),TRUE)
TM_SRC         += cg_func.c cg_wrapper.c
#__BEGIN_EXPERIMENTAL_SECTION__#
ifeq ($(DECOMP),TRUE)
TM_SRC		+= decomp.c decomp_lp.c
endif
#___END_EXPERIMENTAL_SECTION___#
endif
else
MASTER_SRC += lp_solver.c
endif

ifeq ($(SYM_COMPILE_IN_CP),TRUE)
TM_SRC	       += cp_proccomm.c cp_func.c cp_wrapper.c
endif
ifeq ($(SYM_COMPILE_IN_TM),TRUE)
MASTER_SRC     += $(TM_SRC)
endif

LP_SRC		= lp_solver.c lp_varfunc.c lp_rowfunc.c lp_genfunc.c \
		  lp_proccomm.c lp_wrapper.c lp.c lp_free.c
ifeq ($(PSEUDO_COSTS),TRUE)
LP_SRC         += lp_pseudo_branch.c
else
LP_SRC         += lp_branch.c
endif

ifeq ($(SYM_COMPILE_IN_CG),TRUE)
LP_SRC         += cg_func.c cg_wrapper.c
#__BEGIN_EXPERIMENTAL_SECTION__#
ifeq ($(DECOMP),TRUE)
TM_SRC		+= decomp.c decomp_lp.c
endif
#___END_EXPERIMENTAL_SECTION___#
endif

CP_SRC		= cut_pool.c cp_proccomm.c cp_func.c cp_wrapper.c

CG_SRC		= cut_gen.c cg_proccomm.c cg_func.c cg_wrapper.c

QSORT_SRC	= qsortucb.c qsortucb_i.c qsortucb_ii.c qsortucb_id.c \
		  qsortucb_di.c qsortucb_ic.c
TIME_SRC	= timemeas.c
PROCCOMM_SRC	= proccomm.c
PACKCUT_SRC	= pack_cut.c
PACKARRAY_SRC	= pack_array.c

ifeq ($(USE_GLPMPL),TRUE)
GMPL_SRC        = glpmpl1.c glpmpl2.c glpmpl3.c glpmpl4.c glpdmp.c \
glpavl.c glprng.c glplib1a.c glplib2.c glplib3.c
endif

BB_SRC = $(MASTER_SRC) $(DG_SRC) $(TM_SRC) $(LP_SRC) $(CP_SRC) $(CG_SRC) \
	 $(QSORT_SRC) $(TIME_SRC) $(PROCCOMM_SRC) $(PACKCUT_SRC) \
	 $(PACKARRAY_SRC)

ALL_SRC = $(BB_SRC) $(USER_SRC)

##############################################################################
##############################################################################
# Global rules
##############################################################################
##############################################################################


$(OBJDIR)/%.o : %.c
	mkdir -p $(OBJDIR)
	@echo Compiling $*.c
	$(CC) $(CFLAGS) $(EFENCE_LD_OPTIONS) -c $< -o $@

$(SYM_OBJDIR)/%.o : %.c
	mkdir -p $(SYM_OBJDIR)
	@echo Compiling $*.c
	$(CC) $(CFLAGS) $(EFENCE_LD_OPTIONS) -c $< -o $@

$(GMPL_OBJDIR)/%.o : %.c
	mkdir -p $(GMPL_OBJDIR)
	@echo Compiling $*.c
	gcc -DHAVE_LIBM=1 -DSTDC_HEADERS=1 -I$(GMPLINCDIR) -g -c $< -o $@

$(DEPDIR)/%.d : %.c
	mkdir -p $(DEPDIR)
	@echo Creating dependency $*.d
	$(SHELL) -ec '$(CC) -MM $(CFLAGS) $< \
		| $(AWK) "(NR==1) {printf(\"$(OBJDIR)/$*.o \\\\\\n\"); \
                                 printf(\"$(DEPDIR)/$*.d :\\\\\\n \\\\\\n\"); \
                                } \
                        (NR!=1) {print;}" \
                > $@'

$(USER_OBJDIR)/%.o : %.cpp
	mkdir -p $(USER_OBJDIR)
	@echo Compiling $*.cpp
	$(CC) $(CFLAGS) $(EFENCE_LD_OPTIONS) -c $< -o $@

$(USER_DEPDIR)/%.d : %.cpp
	mkdir -p $(USER_DEPDIR)
	@echo Creating dependency $*.d
	$(SHELL) -ec '$(CC) -MM $(CFLAGS) $< \
		| $(AWK) "(NR==1) {printf(\"$(USER_OBJDIR)/$*.o \\\\\\n\"); \
                                 printf(\"$(USER_DEPDIR)/$*.d :\\\\\\n \\\\\\n\"); \
                                } \
                        (NR!=1) {print;}" \
                > $@'

$(USER_OBJDIR)/%.o : %.c
	mkdir -p $(USER_OBJDIR)
	@echo Compiling $*.c
	$(CC) $(CFLAGS) $(EFENCE_LD_OPTIONS) -c $< -o $@

$(USER_DEPDIR)/%.d : %.c
	mkdir -p $(USER_DEPDIR)
	@echo Creating dependency $*.d
	$(SHELL) -ec '$(CC) -MM $(CFLAGS) $< \
		| $(AWK) "(NR==1) {printf(\"$(USER_OBJDIR)/$*.o \\\\\\n\"); \
                                 printf(\"$(USER_DEPDIR)/$*.d :\\\\\\n \\\\\\n\"); \
                                } \
                        (NR!=1) {print;}" \
                > $@'

##############################################################################
##############################################################################
# What to make ? This has to go here in case the user has any targets.
##############################################################################
##############################################################################

WHATTOMAKE = 
PWHATTOMAKE = 
QWHATTOMAKE = 

ifeq ($(SYM_COMPILE_IN_LP),FALSE)
WHATTOMAKE  += lplib lp
PWHATTOMAKE += plp
QWHATTOMAKE += qlp
endif

ifeq ($(SYM_COMPILE_IN_CP),FALSE)
WHATTOMAKE += cplib cp
PWHATTOMAKE += pcp
QWHATTOMAKE += qcp
endif

ifeq ($(SYM_COMPILE_IN_CG),FALSE)
WHATTOMAKE += cglib cg
PWHATTOMAKE += pcg
QWHATTOMAKE += qcg
endif

ifeq ($(SYM_COMPILE_IN_TM),FALSE)
WHATTOMAKE += tmlib tm
PWHATTOMAKE += ptm
QWHATTOMAKE += qtm
endif


ifeq ($(LP_SOLVER), OSI)
ifeq ($(OSI_INTERFACE), CPLEX)
LPXDIR = OsiCpx
LPXINCDIR = CpxIncDir
else 
ifeq ($(OSI_INTERFACE), CLP)
COIN_WHATTOMAKE += coin_clp
LPXDIR = OsiClp
LPXINCDIR = ClpIncDir
endif
ifeq ($(OSI_INTERFACE), OSL)
LPXDIR = OsiOsl
LPXINCDIR = OslIncDir
endif
ifeq ($(OSI_INTERFACE), GLPK)
LPXDIR = OsiGlpk
LPXINCDIR = GlpkIncDir
endif
ifeq ($(OSI_INTERFACE), XPRESS)
LPXDIR = OsiXpr
LPXINCDIR = XprIncDir
endif
endif

endif

ifeq ($(USE_CGL_CUTS), TRUE)
COIN_WHATTOMAKE += cgl
endif

ifeq ($(USE_OSI_INTERFACE), TRUE)
COIN_WHATTOMAKE += osisym
endif


WHATTOMAKE += masterlib master
PWHATTOMAKE += pmaster
QWHATTOMAKE += pmaster

all : 
	$(MAKE) $(WHATTOMAKE)

parallel : 
	$(MAKE) COMM_PROTOCOL=PVM SYM_COMPILE_IN_LP=FALSE $(WHATTOMAKE)

pall :
	$(MAKE) $(PWHATOTOMAKE)

qall :
	$(MAKE) $(QWHATOTOMAKE)

##############################################################################
##############################################################################
##############################################################################
#  Include the user specific makefile
##############################################################################
##############################################################################

#include $(USERROOT)/Makefile

ifeq ($(LIFO),TRUE)
USER_BB_DEFINES += -DLIFO
endif

ifeq ($(FIND_NONDOMINATED_SOLUTIONS),TRUE)
USER_BB_DEFINES += -DFIND_NONDOMINATED_SOLUTIONS
endif

ifeq ($(BINARY_SEARCH),TRUE)
USER_BB_DEFINES += -DBINARY_SEARCH
endif

##############################################################################
##############################################################################
# Master
##############################################################################
##############################################################################

ALL_MASTER	 = $(MASTER_SRC)
ALL_MASTER 	+= $(TIME_SRC)
ALL_MASTER 	+= $(QSORT_SRC)
ALL_MASTER 	+= $(PROCCOMM_SRC)
ALL_MASTER 	+= $(PACKCUT_SRC)
ALL_MASTER 	+= $(PACKARRAY_SRC)

MASTER_OBJS 	  = $(addprefix $(OBJDIR)/,$(notdir $(ALL_MASTER:.c=.o)))
MAIN_OBJ          = $(addprefix $(OBJDIR)/,$(notdir $(MASTER_MAIN_SRC:.c=.o))) 
ifeq ($(USE_GLPMPL),TRUE)
GMPL_OBJ          = $(addprefix $(GMPL_OBJDIR)/,$(notdir $(GMPL_SRC:.c=.o))) 
endif
MASTER_DEP        = $(addprefix $(DEPDIR)/,$(MASTER_MAIN_SRC:.c=.d))
MASTER_DEP 	 += $(addprefix $(DEPDIR)/,$(ALL_MASTER:.c=.d))


USER_MASTER_OBJS = $(addprefix $(USER_OBJDIR)/,\
	$(notdir $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(USER_MASTER_SRC)))))
USER_MASTER_DEP = $(addprefix $(USER_DEPDIR)/,\
	$(notdir $(patsubst %.cpp,%.d,$(patsubst %.c,%.d,$(USER_MASTER_SRC)))))

DEPENDANTS = $(USER_MASTER_DEP)
OBJECTS = $(USER_MASTER_OBJS) $(MAIN_OBJ) 

ifeq ($(USE_SYM_APPL),TRUE)
LIBNAME = sym_app
else
LIBNAME = sym
endif

MASTERLIBNAME = $(LIBNAME)$(MASTEREXT)
ifeq ($(SYM_COMPILE_IN_CG),TRUE)
ifeq ($(SYM_COMPILE_IN_CP),TRUE)
ifeq ($(SYM_COMPILE_IN_LP),TRUE)
ifeq ($(SYM_COMPILE_IN_TM),TRUE)
ifeq ($(USE_SYM_APPL),TRUE)
MASTERLIBNAME = $(LIBNAME)
else
MASTERLIBNAME = $(LIBNAME)
endif
endif
endif
endif
endif

SYMLIBDIR  = $(SYMBUILDDIR)/lib
LN_S = ln -fs $(LIBDIR)/$(LIBNAME_TYPE) $(SYMLIBDIR)
ifeq ($(LIBTYPE),SHARED)
LIBNAME_TYPE      = $(addsuffix .so, $(addprefix lib, $(MASTERLIBNAME)))
USER_LIBNAME      = $(addsuffix .so, $(addprefix lib, $(MASTERBIN)))
LD = $(CC) $(OPT) 
LIBLDFLAGS = -shared -Wl,-soname,$(LIBNAME_TYPE) -o
USERLIBLDFLAGS = -shared -Wl,-soname,$(USER_LIBNAME) -o
MAKELIB        = 
else
LIBNAME_TYPE   = $(addsuffix .a, $(addprefix lib, $(MASTERLIBNAME)))
USER_LIBNAME   = $(addsuffix .a, $(addprefix lib, $(MASTERBIN)))
MKSYMLIBDIR    = mkdir -p $(SYMLIBDIR)
endif

MASTERBIN = $(MASTERNAME)$(MASTEREXT)
ifeq ($(SYM_COMPILE_IN_CG),TRUE)
ifeq ($(SYM_COMPILE_IN_CP),TRUE)
ifeq ($(SYM_COMPILE_IN_LP),TRUE)
ifeq ($(SYM_COMPILE_IN_TM),TRUE)
MASTERBIN = $(MASTERNAME)
endif
endif
endif
endif

MASTERLPLIB = $(LPLIB)

master : $(BINDIR)/$(MASTERBIN)
	true

masterlib : $(LIBDIR)/$(LIBNAME_TYPE)
	true

usermasterlib : $(USER_LIBDIR)/$(USER_LIBNAME)

pmaster : $(BINDIR)/p$(MASTERBIN)
	true

qmaster : $(BINDIR)/q$(MASTERBIN)
	true

cmaster : $(BINDIR)/c$(MASTERBIN)
	true

master_clean :
	cd $(OBJDIR)
	rm -f $(MASTER_OBJS)
	rm -f $(MAIN_OBJ)
	cd $(DEPDIR)
	rm -f $(MASTER_DEP)

master_clean_user :
	cd $(USER_OBJDIR)
	rm -f $(USER_MASTER_OBJS)
	cd $(USER_DEPDIR)
	rm -f $(USER_MASTER_DEP)

$(BINDIR)/$(MASTERBIN) : $(USER_MASTER_DEP) $(USER_MASTER_OBJS) \
$(MAIN_OBJ) $(LIBDIR)/$(LIBNAME_TYPE) 
	@echo ""
	@echo "Linking $(notdir $@) ..."
	mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_MASTER_OBJS) \
	$(MAIN_OBJ) $(OSISYM_LIB) -l$(MASTERLIBNAME) $(MASTERLPLIB) \
	$(MASTERLPLIB) $(LIBS) 
	@echo ""

$(USER_LIBDIR)/$(USER_LIBNAME) : $(USER_MASTER_DEP) $(USER_MASTER_OBJS) \
$(MASTER_DEP) $(MASTER_OBJS) $(GMPL_OBJ)
	@echo ""
	@echo "Making $(notdir $@) ..."
	@echo ""
	mkdir -p $(USER_LIBDIR)
	$(LD) $(USERLIBLDFLAGS) $@ $(USER_MASTER_OBJS) $(MASTER_OBJS) \
	$(GMPL_OBJ)
	@echo ""

$(LIBDIR)/$(LIBNAME_TYPE) : $(MASTER_DEP) $(MASTER_OBJS) $(GMPL_OBJ) 
	@echo ""
	@echo "Making $(notdir $@) ..."
	@echo ""
	mkdir -p $(LIBDIR)
	$(LD) $(LIBLDFLAGS) $@ $(MASTER_OBJS) $(GMPL_OBJ) 
	$(MAKELIB)
	$(MKSYMLIBDIR)
	$(LN_S)
	@echo ""

$(BINDIR)/p$(MASTERBIN) : $(USER_MASTER_DEP) $(USER_MASTER_OBJS) \
$(LIBDIR)/libmaster$(MASTEREXT).a 
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(PURIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_MASTER_OBJS) \
	-lmaster$(MASTEREXT) $(MASTERLPLIB) $(LIBS) 
	@echo ""

$(BINDIR)/q$(MASTERBIN) : $(USER_MASTER_DEP) $(USER_MASTER_OBJS) \
$(LIBDIR)/libmaster$(MASTEREXT).a 
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(QUANTIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_MASTER_OBJS) \
	-lmaster$(MASTEREXT) $(MASTERLPLIB) $(LIBS) 
	@echo ""

$(BINDIR)/c$(MASTERBIN) : $(USER_MASTER_DEP) $(USER_MASTER_OBJS) \
$(LIBDIR)/libmaster$(MASTEREXT).a
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CCMALLOC) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_MASTER_OBJS) \
	-lmaster$(MASTEREXT) $(MASTERLPLIB) $(LIBS)
	@echo ""

##############################################################################
##############################################################################
# DrawGraph
##############################################################################
##############################################################################

ALL_DG  = $(DG_SRC)
ALL_DG += $(PROCCOMM_SRC)

DG_OBJS 	= $(addprefix $(OBJDIR)/,$(notdir $(ALL_DG:.c=.o)))
DG_DEP  	= $(addprefix $(DEPDIR)/,$(ALL_DG:.c=.d))
USER_DG_OBJS 	= $(addprefix $(USER_OBJDIR)/,$(notdir $(USER_DG_SRC:.c=.o)))
USER_DG_DEP  	= $(addprefix $(USER_DEPDIR)/,$(USER_DG_SRC:.c=.d))

dg : $(BINDIR)/$(MASTERNAME)_dg
	true

dglib : $(LIBDIR)/lib$(LIBNAME)_dg.a
	true

pdg : $(BINDIR)/pdg
	true

dg_clean :
	cd $(OBJDIR)
	rm -f $(DG_OBJS)
	cd $(DEPDIR)
	rm -f $(DG_DEP)

dg_clean_user :
	cd $(USER_OBJDIR)
	rm -f $(USER_DG_OBJS)
	cd $(USER_DEPDIR)
	rm -f $(USER_DG_DEP))

$(BINDIR)/$(MASTERNAME)_dg : $(USER_DG_DEP) $(USER_DG_OBJS) $(LIBDIR)/lib$(LIBNAME)_dg.a
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_DG_OBJS) \
	-l$(LIBNAME)_dg $(LIBS) 
	@echo ""

$(LIBDIR)/lib$(LIBNAME)_dg.a : $(DG_DEP) $(DG_OBJS)
	@echo ""
	@echo "Making $(notdir $@) ..."
	@echo ""
	mkdir -p $(LIBDIR)
	$(AR) $(LIBDIR)/lib$(LIBNAME)_dg.a $(DG_OBJS)
	$(RANLIB) $(LIBDIR)/lib$(LIBNAME)_dg.a
	@echo ""

$(BINDIR)/pdg : $(USER_DG_DEP) $(USER_DG_OBJS) $(LIBDIR)/libdg.a
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(PURIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_DG_OBJS) -ldg \
	$(LIBS)
	@echo ""

##############################################################################
##############################################################################
# TreeManager
##############################################################################
##############################################################################

ALL_TM	 = $(TM_SRC)
ALL_TM 	+= $(TIME_SRC)
ALL_TM 	+= $(PROCCOMM_SRC)
ALL_TM 	+= $(PACKCUT_SRC)
ALL_TM 	+= $(PACKARRAY_SRC)
ifeq ($(SYM_COMPILE_IN_LP),TRUE)
ALL_TM  += $(QSORT_SRC)
endif

TM_OBJS 	= $(addprefix $(OBJDIR)/,$(notdir $(ALL_TM:.c=.o)))
TM_DEP  	= $(addprefix $(DEPDIR)/,$(ALL_TM:.c=.d))
USER_TM_OBJS 	= $(addprefix $(USER_OBJDIR)/,$(notdir $(USER_TM_SRC:.c=.o)))
USER_TM_DEP  	= $(addprefix $(USER_DEPDIR)/,$(USER_TM_SRC:.c=.d))

TMLPLIB = $(LPLIB)

tm : $(BINDIR)/$(MASTERNAME)_tm$(TMEXT)
	true

tmlib : $(LIBDIR)/lib$(LIBNAME)_tm$(TMEXT).a
	true

ptm : $(BINDIR)/ptm$(TMEXT)
	true

qtm : $(BINDIR)/qtm$(TMEXT)
	true

ctm : $(BINDIR)/ctm$(TMEXT)
	true

tm_clean :
	cd $(OBJDIR)
	rm -f $(TM_OBJS)
	cd $(DEPDIR)
	rm -f $(TM_DEP)

tm_clean_user :
	cd $(USER_OBJDIR)
	rm -f $(USER_TM_OBJS)
	cd $(USER_DEPDIR)
	rm -f $(USER_TM_DEP))

$(BINDIR)/$(MASTERNAME)_tm$(TMEXT) : $(USER_TM_DEP) $(USER_TM_OBJS) $(LIBDIR)/lib$(LIBNAME)_tm$(TMEXT).a
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_TM_OBJS) \
	-l$(LIBNAME)_tm$(TMEXT) \
	$(TMLPLIB) $(LIBS)
	@echo ""

$(LIBDIR)/lib$(LIBNAME)_tm$(TMEXT).a : $(TM_DEP) $(TM_OBJS)
	@echo ""
	@echo "Making $(notdir $@) ..."
	@echo ""
	mkdir -p $(LIBDIR)
	$(AR) $(LIBDIR)/lib$(LIBNAME)_tm$(TMEXT).a $(TM_OBJS)
	$(RANLIB) $(LIBDIR)/lib$(LIBNAME)_tm$(TMEXT).a
	@echo ""

$(BINDIR)/ptm$(TMEXT) : $(USER_TM_DEP) $(USER_TM_OBJS) \
$(LIBDIR)/libtm$(TMEXT).a
	@echo ""
	@echo "Linking purified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(PURIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_TM_OBJS) \
	-ltm$(TMEXT) $(TMLPLIB) $(LIBS) 
	@echo ""

$(BINDIR)/qtm$(TMEXT) : $(USER_TM_DEP) $(USER_TM_OBJS) \
$(LIBDIR)/libtm$(TMEXT).a
	@echo ""
	@echo "Linking quantified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(QUANTIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_TM_OBJS) \
	-ltm$(TMEXT) $(TMLPLIB) $(LIBS)
	@echo ""

$(BINDIR)/ctm$(TMEXT) : $(USER_TM_DEP) $(USER_TM_OBJS) \
$(LIBDIR)/libtm$(TMEXT).a
	@echo ""
	@echo "Linking quantified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CCMALLOC) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_TM_OBJS) \
	-ltm$(TMEXT) $(TMLPLIB) $(LIBS)
	@echo ""

##############################################################################
##############################################################################
# LP
##############################################################################
##############################################################################

ALL_LP	 = $(LP_SRC)
ALL_LP 	+= $(TIME_SRC)
ALL_LP 	+= $(QSORT_SRC)
ALL_LP 	+= $(PROCCOMM_SRC)
ALL_LP 	+= $(PACKCUT_SRC)
ALL_LP 	+= $(PACKARRAY_SRC)

LP_OBJS 	= $(addprefix $(OBJDIR)/,$(notdir $(ALL_LP:.c=.o)))
LP_DEP 		= $(addprefix $(DEPDIR)/,$(ALL_LP:.c=.d))
USER_LP_OBJS 	= $(addprefix $(USER_OBJDIR)/,$(notdir $(USER_LP_SRC:.c=.o)))
USER_LP_DEP 	= $(addprefix $(USER_DEPDIR)/,$(USER_LP_SRC:.c=.d))

lp : $(BINDIR)/$(MASTERNAME)_lp$(LPEXT)
	true

lplib : $(LIBDIR)/lib$(LIBNAME)_lp$(LPEXT).a
	true

plp : $(BINDIR)/plp$(LPEXT)
	true

qlp : $(BINDIR)/qlp$(LPEXT)
	true

clp : $(BINDIR)/clp$(LPEXT)
	true

lp_clean :
	cd $(OBJDIR)
	rm -f $(LP_OBJS)
	cd $(DEPDIR)
	rm -f $(LP_DEP)

sym_lp_clean:
	cd $(SYM_OBJDIR)
	rm -f $(LP_OBJS)
	cd $(SYM_DEPDIR)
	rm -f $(LP_DEP)

lp_clean_user :
	cd $(USER_OBJDIR)
	rm -f $(USER_LP_OBJS)
	cd $(USER_DEPDIR)
	rm -f $(USER_LP_DEP))

$(BINDIR)/$(MASTERNAME)_lp$(LPEXT) : $(USER_LP_DEP) $(USER_LP_OBJS) $(LIBDIR)/lib$(LIBNAME)_lp$(LPEXT).a
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ \
	$(USER_LP_OBJS) -l$(LIBNAME)_lp$(LPEXT) $(LPLIB) $(LIBS) \
	-l$(LIBNAME)_lp$(LPEXT) $(LPLIB) $(LIBS)
	@echo ""

$(LIBDIR)/lib$(LIBNAME)_lp$(LPEXT).a : $(LP_DEP) $(LP_OBJS) $(GMPL_OBJ) 
	@echo ""
	@echo "Making $(notdir $@) ..."
	@echo ""
	mkdir -p $(LIBDIR)
	$(AR) $(LIBDIR)/lib$(LIBNAME)_lp$(LPEXT).a $(LP_OBJS) $(GMPL_OBJ) 
	$(RANLIB) $(LIBDIR)/lib$(LIBNAME)_lp$(LPEXT).a
	@echo ""

$(BINDIR)/plp$(LPEXT) : $(USER_LP_DEP) $(USER_LP_OBJS) \
$(LIBDIR)/liblp$(LPEXT).a
	@echo ""
	@echo "Linking purified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(PURIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_LP_OBJS) \
	-llp$(LPEXT) $(LPLIB) $(LIBS)
	@echo ""

$(BINDIR)/qlp$(LPEXT) : $(USER_LP_DEP) $(USER_LP_OBJS) \
$(LIBDIR)/liblp$(LPEXT).a
	@echo ""
	@echo "Linking quantified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(QUANTIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_LP_OBJS) \
	-llp$(LPEXT) $(LPLIB) $(LIBS) 
	@echo ""

$(BINDIR)/clp$(LPEXT) : $(USER_LP_DEP) $(USER_LP_OBJS) \
$(LIBDIR)/liblp$(LPEXT).a
	@echo ""
	@echo "Linking quantified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CCMALLOC) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_LP_OBJS) \
	-llp$(LPEXT) $(LPLIB) $(LIBS)
	@echo ""

##############################################################################
##############################################################################
# CutPool
##############################################################################
##############################################################################

ALL_CP	 = $(CP_SRC)
ALL_CP 	+= $(TIME_SRC)
ALL_CP 	+= $(QSORT_SRC)
ALL_CP 	+= $(PROCCOMM_SRC)
ALL_CP 	+= $(PACKCUT_SRC)

CP_OBJS 	= $(addprefix $(OBJDIR)/,$(notdir $(ALL_CP:.c=.o)))
CP_DEP  	= $(addprefix $(DEPDIR)/,$(ALL_CP:.c=.d))
USER_CP_OBJS 	= $(addprefix $(USER_OBJDIR)/,$(notdir $(USER_CP_SRC:.c=.o)))
USER_CP_DEP  	= $(addprefix $(USER_DEPDIR)/,$(USER_CP_SRC:.c=.d))

cp : $(BINDIR)/$(MASTERNAME)_cp
	true

cplib : $(LIBDIR)/lib$(LIBNAME)_cp.a
	true

pcp : $(BINDIR)/pcp
	true

qcp : $(BINDIR)/qcp
	true

ccp : $(BINDIR)/ccp
	true

cp_clean :
	cd $(OBJDIR)
	rm -f $(CP_OBJS)
	cd $(DEPDIR)
	rm -f $(CP_DEP)

cp_clean_user :
	cd $(USER_OBJDIR)
	rm -f $(USER_CP_OBJS)
	cd $(USER_DEPDIR)
	rm -f $(USER_CP_DEP))

$(BINDIR)/$(MASTERNAME)_cp : $(USER_CP_DEP) $(USER_CP_OBJS) $(LIBDIR)/lib$(LIBNAME)_cp.a
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CP_OBJS) \
	-l$(LIBNAME)_cp $(LIBS) 
	@echo ""

$(LIBDIR)/lib$(LIBNAME)_cp.a : $(CP_DEP) $(CP_OBJS)
	@echo ""
	@echo "Making $(notdir $@) ..."
	@echo ""
	mkdir -p $(LIBDIR)
	$(AR) $(LIBDIR)/lib$(LIBNAME)_cp.a $(CP_OBJS)
	$(RANLIB) $(LIBDIR)/lib$(LIBNAME)_cp.a
	@echo ""

$(BINDIR)/pcp : $(USER_CP_DEP) $(USER_CP_OBJS) $(LIBDIR)/libcp.a
	@echo ""
	@echo "Linking purified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(PURIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CP_OBJS) -lcp \
	$(LIBS) 
	@echo ""

$(BINDIR)/qcp : $(USER_CP_DEP) $(USER_CP_OBJS) $(LIBDIR)/libcp.a
	@echo ""
	@echo "Linking purified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(QUANTIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CP_OBJS) -lcp \
	$(LIBS) 
	@echo ""

$(BINDIR)/ccp : $(USER_CP_DEP) $(USER_CP_OBJS) $(LIBDIR)/libcp.a
	@echo ""
	@echo "Linking purified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CCMALLOC) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CP_OBJS) -lcp \
	$(LIBS)
	@echo ""

##############################################################################
##############################################################################
# CutGen
##############################################################################
##############################################################################

ALL_CG	 = $(CG_SRC)
ALL_CG 	+= $(TIME_SRC)
ALL_CG 	+= $(QSORT_SRC)
ALL_CG 	+= $(PROCCOMM_SRC)
ALL_CG 	+= $(PACKCUT_SRC)

CG_OBJS = $(addprefix $(OBJDIR)/,$(notdir $(ALL_CG:.c=.o)))
CG_DEP  = $(addprefix $(DEPDIR)/,$(ALL_CG:.c=.d))
USER_CG_OBJS = $(addprefix $(USER_OBJDIR)/,$(notdir $(USER_CG_SRC:.c=.o)))
USER_CG_DEP  = $(addprefix $(USER_DEPDIR)/,$(USER_CG_SRC:.c=.d))

cg : $(BINDIR)/$(MASTERNAME)_cg
	true

cglib : $(LIBDIR)/lib$(LIBNAME)_cg.a
	true

pcg : $(BINDIR)/pcg
	true

qcg : $(BINDIR)/qcg
	true

ccg : $(BINDIR)/ccg
	true

cg_clean :
	cd $(OBJDIR)
	rm -f $(CG_OBJS)
	cd $(DEPDIR)
	rm -f $(CG_DEP)

cg_clean_user :
	cd $(USER_OBJDIR)
	rm -f $(USER_CG_OBJS)
	cd $(USER_DEPDIR)
	rm -f $(USER_CG_DEP))

$(BINDIR)/$(MASTERNAME)_cg : $(USER_CG_DEP) $(USER_CG_OBJS) $(LIBDIR)/lib$(LIBNAME)_cg.a
	@echo ""
	@echo "Linking $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CG_OBJS) -l$(LIBNAME)_cg\
	 $(LPLIB) $(LIBS) 
	@echo ""

$(LIBDIR)/lib$(LIBNAME)_cg.a : $(CG_DEP) $(CG_OBJS)
	@echo ""
	@echo "Making $(notdir $@) ..."
	@echo ""
	mkdir -p $(LIBDIR)
	$(AR) $(LIBDIR)/lib$(LIBNAME)_cg.a $(CG_OBJS)
	$(RANLIB) $(LIBDIR)/lib$(LIBNAME)_cg.a
	@echo ""

$(BINDIR)/pcg : $(USER_CG_DEP) $(USER_CG_OBJS) $(LIBDIR)/libcg.a
	@echo ""
	@echo "Linking purified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(PURIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CG_OBJS) \
	-lcg $(LPLIB) $(LIBS) 
	@echo ""

$(BINDIR)/qcg : $(USER_CG_DEP) $(USER_CG_OBJS) $(LIBDIR)/libcg.a
	@echo ""
	@echo "Linking quantified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(QUANTIFY) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CG_OBJS) \
	-lcg $(LPLIB) $(LIBS) 
	@echo ""

$(BINDIR)/ccg : $(USER_CG_DEP) $(USER_CG_OBJS) $(LIBDIR)/libcg.a
	@echo ""
	@echo "Linking quantified $(notdir $@) ..."
	@echo ""
	mkdir -p $(BINDIR)
	$(CCMALLOC) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(USER_CG_OBJS) \
	-lcg $(LPLIB) $(LIBS)
	@echo ""

###############################################################################
##############################################################################
# COIN targets
###############################################################################
##############################################################################

coin: $(COIN_WHATTOMAKE)
	(cd $(COINROOT)/Coin && $(MAKE) CXX=$(CC) LibType=$(LIBTYPE) \
	OptLevel=$(COIN_OPT))
	(cd $(COINROOT)/Osi/$(LPXDIR) && \
	$(MAKE) CXX=$(CC) LibType=$(LIBTYPE) OptLevel=$(COIN_OPT) \
	$(LPXINCDIR)=$(LPSINCDIR))

coin_clp:
	(cd $(COINROOT)/Clp && $(MAKE) CXX=$(CC) LibType=$(LIBTYPE) \
	OptLevel=$(COIN_OPT))

cgl:
	(cd $(COINROOT)/Cgl && $(MAKE) CXX=$(CC) LibType=$(LIBTYPE) \
	OptLevel=$(COIN_OPT))

osisym:
	(cd $(COINROOT)/Osi/OsiSym && \
	$(MAKE) CXX=$(CC) LibType=$(LIBTYPE) OptLevel=$(COIN_OPT) \
	SymIncDir=$(SYMPHONYROOT)/include)

###############################################################################
##############################################################################
# Special targets
##############################################################################
##############################################################################

.PHONY:	clean clean_gmpl clean_all master_clean lp_clean cg_clean cp_clean \
	tm_clean dg_clean

clean :
	rm -rf $(OBJDIR)

clean_coin :
	(cd $(COINROOT)/Clp && $(MAKE) clean)
	(cd $(COINROOT)/Coin && $(MAKE) clean)
	(cd $(COINROOT)/Cgl && $(MAKE) clean)
	(cd $(COINROOT)/Osi && $(MAKE) clean)

clean_gmpl :
	rm -rf $(GMPL_OBJDIR)

clean_user :
	rm -rf $(USER_OBJDIR)

clean_dep :
	rm -rf $(DEPDIR)/ 

clean_user_dep :
	rm -rf $(USER_DEPDIR)/

clean_lib :
	rm -rf $(LIBDIR)
	rm -rf $(SYMLIBDIR)

clean_bin :
	rm -rf $(BINDIR)

clean_all : clean clean_gmpl clean_dep clean_user clean_user_dep\
	clean_lib clean_bin
	true

.SILENT:
