SHELL = /bin/sh
OS := $(shell uname)

## We don't care about architectural distinguishers in the OS
## such as IRIX64, IRIX32, etc. so we truncate IRIX?? to IRIX
ifeq ($(findstring IRIX,$(OS)),IRIX)
OS := IRIX
endif

## Make CYGWIN_XXXX CYGWIN so it's "Windows cross platform" :)
ifeq ($(findstring CYGWIN,$(OS)),CYGWIN)
OS := CYGWIN
endif

## Make MINGW_XXXX MINGW so it's "Windows cross platform" :)
ifeq ($(findstring MINGW,$(OS)),MINGW)
OS := MINGW
endif

# TOPDIR needs to be redefined for every GNUmakefile
TOPDIR     ?= ../
THISDIR    = .
MAKEFILE   = GNUmakefile
MAKEDEPEND = ignore

####################################################################### 
##
##                   VERSIONING SEMANTICS
##
## Version consistes of <major> . <minor> . <release> - <revision>
## Where:
##    major   : Production (0 = pre-production)
##    minor   : 0-7 = Production minor, 8 = Alpha, 9 = Beta
##    release : Release tag
##    revision: Release revision - 0 = development (cutting edge). 
##
## Usage:
##     Default - VERSION_REVISION is set to the value defined here
##     Env variable PRODUCER_VERSION_REVISION overrides default    
##           e.g.:
##               % setenv PRODUCER_VERSION_REVISION 5
##               % make version
##     Command line overrides env variable
##               % make VERSION_REVISION=  
####################################################################### 
VERSION_MAJOR    = 1
VERSION_MINOR    = 0
VERSION_RELEASE  = 2
VERSION_REVISION ?= 1
ifneq (,$(PRODUCER_VERSION_REVISION))
VERSION_REVISION = $(PRODUCER_VERSION_REVISION)
endif
VERSION       = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_RELEASE)

DEF        = -DPRODUCER_VERSION=\"$(VERSION)\" \
             -DPRODUCER_VERSION_REVISION="$(VERSION_REVISION)"

INC        = -I$(TOPDIR)/include 

CXXFLAGS   = $(ARCHARGS) $(DOF) $(DEF) $(INC)
LDFLAGS    = $(ARCHARGS) $(DOF) $(LINKARGS) -L$(TOPDIR)/lib/$(OS)$(ARCH) 
OBJS       = $(CXXFILES:.cpp=.o) \
	     	 $(CFILES:.c=.o) \
	     	 $(YACCFILES:.y=.o) \
	     	 $(LEXFILES:.l=.o)	    

DOF        = $(OPTF)
DEBUGDIR   = $(OS)$(ARCH).Debug
OPTDIR     = $(OS)$(ARCH).Opt
BININST    = bin
LIBINST    = lib

INST_LOCATION      ?= /usr/local
INST_LIBS          = $(INST_LOCATION)/lib$(ARCH_EXT)
INST_INCLUDE       = $(INST_LOCATION)/include
INST_SHARE         = $(INST_LOCATION)/share/Producer
INST_DEMOS         = $(INST_SHARE)/bin
INST_SRC           = $(INST_SHARE)/src
INST_DOC           = $(INST_SHARE)/doc
INST_DATA          = $(INST_SHARE)/data
INST_DEMO_SRC      = $(INST_SRC)/demos

LINK               = ln -sf
INSTXCMD           = install -m 755
INSTRCMD           = install -m 644
INSTLINKCMD        = $(LINK)

LIB_PREFIX         = lib
LIB_EXT            = so
EXE_EXT    =

MAKEDIST           = echo "   === Distribution build is not implemented yet for $(OS)"; printf "\n"
INSTLOGFILE        = /tmp/.producer_inst_log

YFLAGS             = -d

RECURSIVE_TARGETS = \
	  opt \
	  debug \
      static \
      staticdebug \
	  clean \
	  cleandepend \
	  cleandependopt \
	  cleandependdbg \
	  cleandbg \
	  cleanopt \
	  cleantarget \
	  cleantargetopt \
	  cleantargetdbg \
	  clobber \
	  clobberdbg \
	  clobberopt \
	  beautify \
	  docs \
	  depend \


ifneq ("$(OPENTHREADS_INC_DIR)","")
INC += -I$(OPENTHREADS_INC_DIR)
endif

ifneq ("$(OPENTHREADS_LIB_DIR)","")
LDFLAGS += -L$(OPENTHREADS_LIB_DIR)
endif

OPEN_THREAD_LIB = -lOpenThreads
PTHREAD_LIB = -lpthread

STATICLIB_EXT = a
STATICLIB = $(LIB).$(STATICLIB_EXT)

#### SUN OS Specific definitions
ifeq ($(OS),SunOS)

  ARCH              = 32

#### if using g++ on a sun
  ifeq ($(COMPILER),gnu)
    ifeq (x$(CXX),x)
      CXX               = g++
    endif
    INC               += 
    DEPARG            = -M
    DEF               += -W -Wall -fPIC -fpermissive
    OPTF              = -O2
    DBGF              = -g 
    SHARED            = -shared -fPIC 
    ifeq ($(ARCH),64)
      ARCHARGS          = -m64
    else
      ARCHARGS          = 
    endif
#### using forte compilers (default)
  else
    CXX               = CC
    INC               += 
    DEPARG            = -xM1
    DEF               += -features=extensions -mt -KPIC
    OPTF              = -xO4
    DBGF              = -g 
    SHARED            = -G
    ifeq ($(ARCH),64)
      ARCHARGS          = -xarch=v9
    else
      ARCHARGS          = 
    endif
  endif
  LINKARGS        = -mt 
  INSTXCMD        = cp
  INSTRCMD        = cp
  INST_LOCATION   = /opt/Producer
  INST_LIBS       = $(INST_LOCATION)/lib$(ARCH_EXT)
  INST_INCLUDE    = $(INST_LOCATION)/include
  MAKEDIST        = $(TOPDIR)/Make/makepkg

  GL_LIBS           = -lGL
  X_LIBS            = -lXmu -lX11
  OPEN_THREAD_LIB   = -lOpenThreads -lpthread

endif 

#### IRIX Specific definitions
ifeq ($(OS),IRIX)
	CXX = CC
	ifeq ($(CXX),CC)
		CXX               = CC
		DEPARG            = -M
		INC               +=  -I${TOPDIR}/include 
		DEF               +=  -LANG:std -OPT:Olimit=0 \
							-DEBUG:woff=1682 -DEBUG:woff=3303 \
							-MDupdate $(MAKEDEPEND) \
		OPTF              = -O2 
		DBGF              = -g 
		SHARED            = -shared
		ARCH              = 32
		ifeq ($(ARCH),64)
			ARCHARGS          = -64
		else
			ARCHARGS          = -n32
		endif
		ARCH_EXT             = $(ARCH)
		LINKARGS          = -L${TOPDIR}/lib -LANG:std -OPT:Olimit=0 
		INSTXCMD        = cp
		INSTRCMD        = cp
	else  		
		CXX             = g++
		INC             +=  -I${TOPDIR}/include 
		OPTF            = -O2 
		DBGF            = -g 
		DEF				= -fPIC -W -Wno-unused 
		SHARED          = -shared
		ARCH            = 32
		ifeq ($(ARCH),64)
			ARCHARGS	= -mabi=64 -mips4
		else
			ARCHARGS	= -mabi=n32 -mips4
		endif
		ARCH_EXT 		= $(ARCH)
		LINKARGS 		= -L${TOPDIR}/lib 
		INSTXCMD        = cp
		INSTRCMD        = cp
	endif

  GL_LIBS           = -lGL
  X_LIBS            = -lXmu -lX11
  OPEN_THREAD_LIB   = -lOpenThreads -lpthread

endif

#### Linux specific definitions

ifeq ($(OS),Linux)
  DEF += -DGLX_GLXEXT_PROTOTYPES
  SYSARCH           := $(shell arch)
  ifeq ($(COMPILER),intel)
    CXX               = icpc
    CXXFLAGS          += -x c++ -cxxlib-gcc -gcc-version=323
    DEF               += -fPIC
    OPTF              = -O2
    DBGF              = -g
    ifeq ($(SYSARCH),ia64)
      ARCH              = IA64
    else
      ARCH              = 32
    endif
  else
    ifeq (x$(CXX),x)
      CXX               = g++
    endif

ifeq ("$(COMPILE_OSG_OP_OT_WITH_SONAMES)","YES")
    LDFLAGS         += -Wl,-soname -Wl,$@.$(LIB_EXT).0
endif

    DEF               += -fPIC -pthread
    OPTF              = -O2
    DBGF              = -ggdb -gstabs
    ifeq ($(SYSARCH),x86_64)
      ARCH              = 64
      ifeq (x$(CXX),x)
        CXX               = g++
      endif
    else 
      ARCH              = 32
    endif
  endif

  DEPARG            = -M
  INC               +=  
  DEF               +=
  SHARED            = -shared
  ARCHARGS          = 
ifeq ($(SYSARCH),x86_64)
  LINKARGS          = -L/usr/X11R6/lib64
else
  LINKARGS          = -L/usr/X11R6/lib
endif
  MAKEDIST          = $(TOPDIR)/Make/makerpms

  GL_LIBS           = -lGL
  X_LIBS            = -lXmu -lX11
  OPEN_THREAD_LIB   = -lOpenThreads -lpthread

   LDFLAGS          += -pthread

endif

#### FreeBSD specific definitions
ifeq ($(OS),FreeBSD)
  SYSARCH           := $(shell uname -p)
  DEF               += -DGLX_GLXEXT_PROTOTYPES
  ifeq (x$(CXX),x)
    CXX             = g++
  endif
  ifeq (x$(PTHREAD_CFLAGS),x)
    PTHREAD_CFLAGS  = -pthread
  endif
  ifeq (x$(PTHREAD_LIBS),x)
    PTHREAD_LIBS    = -pthread
  endif
  ifeq (x$(ARCH),x)
    ARCH            = $(SYSARCH)
  endif
  DEPARG            = -MM
  INC               += -I/usr/local/include -I/usr/X11R6/include
  DEF               += -W -Wall $(PTHREAD_CFLAGS)
  OPTF              = -O2 
  DBGF              = -g 
  SHARED            = -shared
  ifeq ($(SYSARCH),amd64)
    ARCHARGS        = -fPIC
  else
    ARCHARGS        = 
  endif
  LINKARGS          = -L/usr/local/lib -L/usr/X11R6/lib $(PTHREAD_LIBS)

  GL_LIBS           = -lGL
  X_LIBS            = -lXmu -lX11
  OPEN_THREAD_LIB   = -lOpenThreads

endif

#### MacOS X specific definitions
ifeq ($(OS),Darwin)
    ifeq (x$(CXX),x)
      CXX               = g++
    endif
  DEPARG            = -M

  #### Default to AGL?  Will try it temporary while waiting for feedback
  USE_AGL ?= yes

  ifeq ($(USE_AGL),yes)

  	DEF               += -Wall -D__DARWIN_OSX__ -D__USE_OSX_AGL_IMPLEMENTATION__
  	LINKARGS          = -framework Carbon -framework AGL
  	X_LIBS            = 
  	GL_LIBS           = -framework OpenGL

  else

      ifeq ($(USE_CGL),yes)

  	    DEF               += -Wall -D__DARWIN_OSX__ -D__USE_OSX_CGL_IMPLEMENTATION__
  	    LINKARGS          = -framework Carbon
  	    X_LIBS            = 
  	    GL_LIBS           = -framework OpenGL

      else

  	    DEF               += -Wall -D__DARWIN_OSX__ -DGLX_GLXEXT_PROTOTYPES
            INC               +=  -I/usr/X11R6/include
  	    LINKARGS          = -L/usr/X11R6/lib -framework Carbon
  	    X_LIBS            = -lXmu -lX11
  	    GL_LIBS           = -lGL

      endif

  endif

  OPTF              = -O2 
  DBGF              = -gstabs+  -ggdb
  SHARED            = -dynamiclib
  ARCH              = 32
  ARCHARGS          = 
  LIB_EXT           = dylib

  OPEN_THREAD_LIB   = -lOpenThreads -lpthread

endif

#### Cygwin/Mingw specific definitions
ifeq ($(OS),CYGWIN)
  CXX               = c++
  INC               +=
  DEF               += -DWIN32 -W -Wall -DPR_LIBRARY -DNOMINMAX
  DEPARG            = -M $(DEF)

  OPTF              = -O2 
  DBGF              = -g 
  SHARED            = -shared \
                        -Wl,--export-all-symbols  \
			            -Wl,--out-implib,libProducer.dll.a

  EXE_EXT           =.exe
  ARCH              = 32
  ARCHARGS          = 
  LINKARGS          = -W -Wall
  DYNAMICLIBRARYLIB =

  GL_LIBS           = -lglu32 -lopengl32
  X_LIBS            = -lgdi32 -luser32
  OPEN_THREAD_LIB   = -lOpenThreads -lpthread
  SOCKET_LIBS       = 

  LIB_PREFIX        = cyg
  LIB_EXT           = dll
  IMP_LIB_EXT       = dll.a

  LINK              = cp -f

  INST_LOCATION     = /usr/local/Producer
  INST_LIBS         = $(INST_LOCATION)/bin
  INST_IMP_LIBS     = $(INST_LOCATION)/lib
  INST_INCLUDE      = $(INST_LOCATION)/include
  INST_SHARE        = $(INST_LOCATION)
  MAKEDIST          = $(TOPDIR)/Make/makeinnosetup

endif

#### Cygwin/Mingw specific definitions
ifeq ($(OS),MINGW)
  CXX               = c++ -mthreads 
  DEPARG            = -M
  INC               += 
  DEF               += -DWIN32 -Wall -DPR_LIBRARY -DNOMINMAX
  OPTF              = -O2 
  DBGF              = -g 
  SHARED            = -shared -mthreads \
		              -Wl,--export-all-symbols  \
		              -Wl,--out-implib,libProducer.dll.a

  EXE_EXT           =.exe
  ARCH              = 32
  ARCHARGS          = 
  LINKARGS          = -W -Wall
  DYNAMICLIBRARYLIB =

  GL_LIBS           = -lglu32 -lopengl32
  X_LIBS            = -lgdi32 -luser32
  OPEN_THREAD_LIB   = -lOpenThreads
  SOCKET_LIBS       = 

  LIB_PREFIX        = lib
  LIB_EXT           = dll
  IMP_LIB_EXT       = dll.a
  PLUGIN_EXT        = dll

  LINK              = cp -f

  INST_LOCATION   = /usr/local/Producer
  INST_LIBS         = $(INST_LOCATION)/bin
  INST_IMP_LIBS     = $(INST_LOCATION)/lib
  INST_INCLUDE      = $(INST_LOCATION)/include
  INST_SHARE        = $(INST_LOCATION)
  MAKEDIST          = $(TOPDIR)/Make/makeinnosetup
endif

#### HP-UX Specific definitions
# contributed by tino.schwarze@informatik.tu-chemnitz.de

ifeq ($(OS),HP-UX)
  CXX 		    = aCC -AA -mt
  DEPARG            = -w +make -E
  INC               += -I/opt/graphics/OpenGL/include -I/usr/contrib/X11R6/include
  DEF               += +Z -z
  OPTF              = +O2 
  DBGF              = -g 
  SHARED            = -b +Z -z -Wl,+s
  ARCH              = 32
  LDFLAGS	    += -L/opt/graphics/OpenGL/lib -L/usr/contrib/X11R6/lib/
  LINKARGS          = -lpthread
  LIB_EXT           = sl
  PLUGIN_EXT        = sl
  DYNAMICLIBRARYLIB = -ldld
  OTHER_LIBS        = 

  GL_LIBS           = -lGL
  X_LIBS            = -lX11
  OPEN_THREAD_LIB   = -lOpenThreads -lpthread
endif


ifeq ($(OS),HP-UX)
  ifeq (x$(CXX),x)
    CXX               = g++
  endif
  DEPARG            = -M
  INC               += -I/opt/glut/include
  DEF               += -W -Wall -fPIC
  OPTF              = -O2 
  # gcc 3.1 uses DWARF as default, my GDB might not yet support this...
  # at least I've got problems everywhere
  DBGF              = -g -gstabs+ 
  SHARED            = -shared -fPIC
  LDFLAGS          +=   -Wl,+h -Wl,$(LIB)
  ARCH              = 32
  ifeq ($(ARCH),64)
      # not yet tested
      ARCHARGS          = -march=2.0
  else
     # at least my gcc 3.1 defaults to HP-PA RISC 1.1
    ARCHARGS          = 
  endif
  LINKARGS          = -lpthread
  LIB_EXT           = sl
  PLUGIN_EXT        = sl
  DYNAMICLIBRARYLIB = -ldld

  GL_LIBS           = -lGL
  X_LIBS            = -lXmu -lX11
  OPEN_THREAD_LIB   = -lOpenThreads -lpthread

endif


VPATH=..
