#
# For Linux 2.6: export OSVER=26  (or the appropriate number for your system)
# 

# These Jamrules mostly copied from the P4API distribution.

rule SetLibName
{
	$(1) = $(2:S=$(SUFLIB)) ;
	LOCATE on $($(1)) = $(EXEC) ;
}

#####################################################################
# P4API libs and includes.
#####################################################################

rule IncludeP4API
{
	# Add includes for building P4API apps.
	if ! $(P4APIDIR)
	{
	    Exit Please set P4APIDIR to the path of the P4API distribution. ;
	}

	P4INCLUDE = $(P4APIDIR)$(SLASH)include$(SLASH)p4 ;
	P4LIBS    = $(P4APIDIR)$(SLASH)lib ;

	SubDirHdrs $(P4INCLUDE) ;

	SetLibName CLIENTLIB  : libclient ;
	SetLibName RPCLIB     : librpc    ;
	SetLibName SUPPORTLIB : libsupp   ;

	CLIENTLIB  = $(P4LIBS)$(SLASH)$(CLIENTLIB)  ;
	RPCLIB     = $(P4LIBS)$(SLASH)$(RPCLIB)     ;
	SUPPORTLIB = $(P4LIBS)$(SLASH)$(SUPPORTLIB) ;
}


###################################################################
# OS settings.
###################################################################

	if $(OS) = NT 
	{
		JAMSHELL = cmd.exe /c ;
	}

	GENFLAGS = CCFLAGS C++FLAGS ;

	switch $(OS)$(OSVER) $(OS)
	{
	case AIX53 :
	    #using GNU
	    C++ = g++ ;
	    CC  = gcc ;
	    C++FLAGS += -DBSD -Dunix -D_LARGE_FILES=1 ;
	    LINK = gcc ;
	    LINKLIBS += -lsupc++ ;

	case CYGWIN :
	    STRIP = ;
	    CC = gcc ;
	    C++ = gcc ;
	    LINK = g++ ;
	    C++FLAGS += -DUSE_CRLF ;

	case DARWIN :
	    CC = cc ;
	    C++ = cc ;
	    C++FLAGS += -DCASE_INSENSITIVE ;

	case DARWIN60cs : #case-sensitive
	    CC = cc ;
	    C++ = cc ;
            LINK = g++ ;

	case DARWIN8* :
	   CC	= gcc ;
	   C++	= g++ ;
	   LINK = g++ ;

	   MACOSX_SDK ?= /Developer/SDKs/MacOSX10.4u.sdk ;
	   LINKFLAGS += -Wl,-syslibroot,$(MACOSX_SDK) ;

	   switch $(OSVER:U) {
             case *CS :
             case *   : C++FLAGS += -DCASE_INSENSITIVE ;
           }

	   switch $(OSPLAT) {
	     case X86 :    _arch = i386   ;
	     case X86_64 : _arch = x86_64 ;
	     case *   :    _arch = ppc    ;
	   }

	   $(GENFLAGS) += -arch $(_arch) -DOS_DARWIN80 ;
	   LINKFLAGS   += -arch $(_arch) ;

	case FREEBSD :
	    Exit Set OSVER to 4, 5, or 6 for FreeBSD ;

	case FREEBSD4 :
		CC   = gcc ;
		C++  = g++ ;
		LINK = gcc ;

		switch $(OSCOMP)
		{
		case GCC3 : LINKLIBS += -lsupc++ ;
		}

		if $(OSPLAT) != AXP { LINKFLAGS += -static ; }
		$(GENFLAGS) += -pipe ;

	case FREEBSD[56789]* :
		CC   = gcc ;
		C++  = g++ ;
		LINK = gcc ;
		# supc++ library on freebsd5.x and later is missing some
		# modules (this is a bug), so we can't use it.
		# But we still do not want to link stdc++ dynamically.
		#LINKLIBS += -lsupc++ ;
		LINKLIBS += -Wl,-dn,-lstdc++,-dy ;

		_mflags = ;
		switch $(OSPLAT)
		{
		case X86    : _mflags = -m32 ;
		case X86_64 : _mflags = -m64 ;
		}

		$(GENFLAGS) += $(_mflags) -pipe ;
		LINKFLAGS   += $(_mflags) ;

		QTOPENGL ?= no ;

	case HPUX11 :
		switch $(OSPLAT:E)-$(OSCOMP:E)
		{
		# On IA64, hpux supports both 64-bit and 32-bit executables.
		# We build 64-bit for the benefit of p4d, and client apps are built
		# the same way for the sake of simplicity.
		case IA64-GCC :
			CC           = gcc ;
			C++          = gcc ;
			$(GENFLAGS) += -mlp64 ;

			LINK         = gcc ;
			LINKFLAGS   += -mlp64 ;
			LINKLIBS    += -lsupc++ -lunwind ;

		case IA64-* : # unbundled vendor compiler
			CC           = aCC ;
			C++          = aCC ;
			OPTIM        = +O1 ;
			if $(TYPE) = pic { OPTIM += +Z ; }

			$(GENFLAGS) += +DD64 ;

			# Suppress compiler warnings:
 			# 	2611: overloaded virtual function "x" is only partially overridden in class "y"
 			# 	2997: function "x::fn is hidden by y::fn" -- virtual function override intended?
			$(GENFLAGS) += +W2611,2997 ;

			LINK         = aCC ;
			LINKFLAGS   += +DD64 ;

		case PA11-* : # unbundled vendor compiler
			CC    = aCC ;
			C++   = aCC ;
			LINK  = aCC ;
			OPTIM = +O1 ;
			$(GENFLAGS) += -D_LARGEFILE64_SOURCE +DA1.1 ;

		case *-* : # assumed PA20 (32-bit) with unbundled vendor compiler
			CC           = aCC ;
			C++          = aCC ;
			LINK         = aCC ;
			OPTIM        = +O1 ;
			$(GENFLAGS) += -D_LARGEFILE64_SOURCE ;
	    }

	case IRIX65 :
		CC   = cc -OPT:Olimit 5000 -64 -mips3 ;
		C++  = CC -woff 3439,1174,1178,1681,1682
		          -OPT:Olimit 5000 -64 -mips3 ;
		LINK = CC -64 ;

		if $(TYPE) = pic
		{
			OPTIM = -O2 -KPIC ;
		}

	case LINUX :
		Exit Set OSVER to 24 or 26 ;

	case LINUX24 :
		CC   = gcc ;
		C++  = g++ ;
		LINK = gcc ;
		LINKLIBS += -lsupc++ ;  # Assumes gcc 3.x or later

		# be explicit about submodel since we may be compiling x86 code on
		# an x86/x86_64 biarch system, and the default may be uncertain.
		_mflags = ;
		switch $(OSPLAT)
		{
		case X86    : _mflags = -m32 ;
		case X86_64 : _mflags = -m64 ;
		}
		LINKLIBS on p4d += $(LINKLIBS) -ldl ;
		LINKLIBS on p4p += $(LINKLIBS) -ldl ;
		LINKLIBS on p4web += $(LINKLIBS) -ldl ;

		if $(SMARTHEAP) = yes { $(GENFLAGS) += -DUSE_SMARTHEAP ; }

		$(GENFLAGS) += $(_mflags) -D_GNU_SOURCE ;
		LINKFLAGS   += $(_mflags) ;

		QTOPENGL ?= no ;

	case LINUX26 :
		CC   = gcc ;
		C++  = g++ ;
		LINK = gcc ;
		LINKLIBS += -lsupc++ ;

		LINKLIBS on p4d += $(LINKLIBS) -ldl ;
		LINKLIBS on p4p += $(LINKLIBS) -ldl ;
		LINKLIBS on p4web += $(LINKLIBS) -ldl ;

		# be explicit about submodel since we may be compiling x86 code on
		# an x86/x86_64 biarch system, and the default may be uncertain.
		_mflags = ;
		switch $(OSPLAT)
		{
		case X86    : _mflags = -m32 ;
		case X86_64 : _mflags = -m64 ;
		case AXP    : LINKFLAGS += -static ;
		}

		if $(SMARTHEAP) = yes { $(GENFLAGS) += -DUSE_SMARTHEAP ; }

		$(GENFLAGS) += $(_mflags) -D_GNU_SOURCE ;
		LINKFLAGS   += $(_mflags) ;

		QTOPENGL ?= no ;

	case MACOSX :
	    CC = cc ;
	    C++ = cc ;
	    $(GENFLAGS) += -DCASE_INSENSITIVE ;
  	    $(GENFLAGS) += -fpascal-strings ;
	    # This looks like a flag but it is really a library macro
	    # kind of thing and causes link problems if it at the front
	    # of the link command so we make it a LIB
  	    LINKLIBS += -framework Carbon ;

	case MACOSX104 :  # assumes using gcc 4.0.1 or newer
		CC   = gcc ;
		C++  = g++ ;
		LINK = g++ ;

		MACOSX_SDK ?= /Developer/SDKs/MacOSX10.4u.sdk ;

		# The -fvisibility-inlines-hidden option is a C++-only
		# option, needed because Qt4 is built with it and all
		# statically-compiled objects need to use it consistently.
		C++FLAGS    += -fvisibility-inlines-hidden ;
		$(GENFLAGS) += -DCASE_INSENSITIVE
		               -fpascal-strings
		               -isysroot$(MACOSX_SDK) ;
		LINKFLAGS   += -Wl,-syslibroot,$(MACOSX_SDK) ;
		# This looks like a flag but it is really a library macro
		# and causes link problems if it's at the front of the link
		# command, so we make it a LIB.
		LINKLIBS    += -framework Carbon ;

		switch $(OSPLAT)
		{
		# Note: we may elect at some point to generate universal
		# binaries, in which case just add multiple -arch [arch]
		# flags here.
		#case X86   : _arch = -arch i386 -arch ppc ;
		case X86    : _arch = -arch i386   ;
		case X86_64 : _arch = -arch x86_64 ;
		case *      : _arch = -arch ppc    ;
		}

		$(GENFLAGS) += $(_arch) -DCASE_INSENSITIVE ;
		LINKFLAGS   += $(_arch) ;

		# This adds $(QTDIR)/lib as a frameworks directory, in case
		# Qt is built as frameworks.  On the mac, it can be built
		# either as frameworks, regular unix-style shared
		# libraries, or unix-style static libaries.
		$(GENFLAGS)  += -F$(QTDIR)/lib ;

	case NETBSD* :
	    CC = /usr/pkg/gcc34/bin/gcc ;
	    C++ = /usr/pkg/gcc34/bin/g++ ;
	    $(GENFLAGS) += -pipe -Dunix ;
	    LINK = /usr/pkg/gcc34/bin/g++ ;
	    # NetBSD gcc choked on -O2 -fPIC
	    if $(TYPE) = pic { OPTIM = -O1 -fPIC ; }

	case VMS* :
	    # use C++ compiler: we're cheap
	    CC = cxx ;
	    C++ = cxx ;
	    DEFINES += NO_MEMCPY ;
	    STRIP = ;
	    OPTIM = ;

	case NT* :
	    # Use setargv.obj to get wildcard expansion.
	    # The "rc" tool needs MS headers:

	    BINDIR = e:\\perforce ;
	    JAMSHELL ?= $(P4)\\Jamsh.bat $(OSPLAT) % "!" ;

	    C++FLAGS += /DCASE_INSENSITIVE /DUSE_CRLF /wd4996 ;
	    if $(SMARTHEAP) = yes { $(GENFLAGS) += /DUSE_SMARTHEAP ; }

	    LINKLIBS = setargv.obj advapi32.lib oldnames.lib
			    kernel32.lib ws2_32.lib ;
	    STDHDRS = $(MSVCNT)\\include $(MSVCNT)\\atlmfc\\include ;
	    STRIP = ;

	    # Now, unset STDHDRS so Jam doesn't scan system headers (takes
	    # too long when using compiler on networked machine):

	    STDHDRS = ;

	    if $(BCCROOT)
	    {
		# Jeff Anton compiles with borland.

		OPTIM = -O2 ;
		RCFLAGS = /d NDEBUG /r ;
		AR = tlib /C /P128 ;
		LINKLIBS = $(BCCROOT)/lib/wildargs.obj ;
	    }
	    else if $(TYPE) = g
	    {
		# Debugging build

		OPTIM = /Zi /Gm ;
		RCFLAGS = /d DEBUG /r ;
		LINKFLAGS += /DEBUG ;
		$(GENFLAGS) += /MTd ;
		}
	    else if $(TYPE) = dyn
	    {
		# Dynamic link version, for qt products

		if $(JAMFAST)
		{
			OPTIM = /Z7 /O2 ;
		}
		else
		{
			OPTIM = /Zi /O2 ;
			actions Cc
			{
			$(CC) /c /Fo$(<) /Fd$(EXEC)\ $(CCFLAGS) $(CCDEFS) $(CCHDRS) /I"$(STDHDRS)" $(>)
			}
			actions C++
			{
			$(C++) /c /Fo$(<) /Fd$(EXEC)\ $(C++FLAGS) $(CCDEFS) $(CCHDRS) /I"$(STDHDRS)" /Tp$(>)
			}
		}
		RCFLAGS = /d NDEBUG /r ;
		$(GENFLAGS) += /MD ;
		LINKFLAGS += /MAP /OPT:REF /OPT:ICF /DEBUG ;
	    }
	    else if $(TYPE) = dyng
	    {
		# Dynamic Debugging build
		if $(JAMFAST)
		{
			OPTIM = /Z7 ;
		}
		else
		{
			OPTIM = /Zi /Gm ;
			actions Cc
			{
			$(CC) /c /Fo$(<) /Fd$(EXEC)\ $(CCFLAGS) $(CCDEFS) $(CCHDRS) /I"$(STDHDRS)" $(>)
			}
			actions C++
			{
			$(C++) /c /Fo$(<) /Fd$(EXEC)\ $(C++FLAGS) $(CCDEFS) $(CCHDRS) /I"$(STDHDRS)" /Tp$(>)
			}
		}
		RCFLAGS = /d DEBUG /r ;
		$(GENFLAGS) += /MDd ;
		LINKFLAGS += /DEBUG /NODEFAULTLIB:msvcrt.lib  /fixed:no ;
	    }
	    else if $(TYPE) = vsdebug
	    {
		# Static link with Visual Studio debug libraries.
		# This does not enable debugging our own code, just sets
		# linker dependencies for VS libraries.
		# This is intended for customer use.

		OPTIM        = /O2 ;
		RCFLAGS      = /d NDEBUG /r ;
		$(GENFLAGS) += /MTd ;
		LINKFLAGS   += /MAP ;
	    }
	    else if $(TYPE) = dyn_vsdebug
	    {
		# Dynamic link with Visual Studio debug libraries.
		# This does not enable debugging our own code, just sets
		# linker dependencies for VS libraries.
		# This is intended for customer use.

		OPTIM        = /O2 ;
		RCFLAGS      = /d NDEBUG /r ;
		$(GENFLAGS) += /MDd ;
		LINKFLAGS   += /MAP /OPT:REF /OPT:ICF ;
	    }
	    else if $(OSVER) = 98
	    {
		# Dynamic link version for win98 version of p4win
		# Goes into bin.win98 -- oddity.

		EXEC = [ FSubDirPath P4BIN bin.win98 ] ;
		ALL_LOCATE_TARGET = $(EXEC) ;

		OPTIM = /O2 ;
		if $(TYPE_DEBUG) = true { OPTIM += /Zi ; }

		RCFLAGS = /d NDEBUG /r ;
		$(GENFLAGS) += /MD ;
		LINKFLAGS = /MAP ;
	    }
	    else
	    {
		# Static link version, for command line products

		OPTIM = /O2 ;
		RCFLAGS = /d NDEBUG /r ;
		$(GENFLAGS) += /MT ;
		LINKFLAGS += /MAP ;
	    }

	case SCO* :
	    C++ = gcc ;
	    CC = gcc ;
	    LINK = gcc ;
	    LINKLIBS += -lsocket ;

	case SOLARIS* :
		switch $(OSCOMP)
		{
		case SUNC11 : # Sun Studio 11
			# Recommended jam flags: -sOSCOMP=SUNC11 -sBUILD=suncc
			CC   = cc ;
			C++  = CC ;
			LINK = CC ;
			OPTIM = -xO3 ;

			switch $(OSPLAT)
			{
			case X86 :
				$(GENFLAGS) += -xtarget=generic ;

			case X86_64 :
				$(GENFLAGS) += -xtarget=opteron -xarch=generic64 ;
				LINKFLAGS   += -xtarget=opteron -xarch=generic64 ;
			}

		case SUNC12 : # Sun Studio 12
			# Recommended jam flags: -sOSCOMP=SUNC12 -sBUILD=suncc
			CC   = cc ;
			C++  = CC ;
			LINK = CC ;
			OPTIM = -xO3 ;

			switch $(OSPLAT)
			{
			case X86 :
				$(GENFLAGS) += -xtarget=generic ;

			case X86_64 :
				$(GENFLAGS) += -xtarget=opteron -m64 ;
				LINKFLAGS   += -xtarget=opteron -m64 ;
			}

		case * : # GCC
			CC   = gcc ;
			C++  = g++ ;
			LINK = gcc ;

			switch $(OSPLAT)
			{
			case *64 : # X86_64 or SPARC64
				LINKFLAGS   += -m64 ;
				$(GENFLAGS) += -m64 ;
			}

			# supc++ needed for all apps since we use gcc >= 3.2.
			LINKLIBS += -lsupc++ ;
		}

		$(GENFLAGS) += -Dsolaris
		               -D_LARGEFILE64_SOURCE
		               -I/opt/lude/include ;

		LINKLIBS += -lsocket -lnsl ;
		AR        = /usr/ccs/bin/ar ru ;
		STRIP     = /usr/ccs/bin/strip ;
		COMPRESS  = compress ;

		QTOPENGL ?= no ;

	case * :
	    Exit Don't know "$(OS)$(OSVER) or " $(OS) ;
	}


#####################################################################
# Set up output directory.
# Jamfile should use "SubDir BIN ;" to specify the current directory
# as the root where the bin.* subdirectories will live.
#####################################################################

	EXEC_LIB_TOKENS =
		BIN
		lib.$(OS:L)$(OSVER:EL)$(OSPLAT:EL)
		;
	EXEC_LIB ?= [ FSubDirPath $(EXEC_LIB_TOKENS) ] ;

	EXEC_LIBEXEC_TOKENS =
		BIN
		libexec.$(OS:L)$(OSVER:EL)$(OSPLAT:EL)
		;
	EXEC_LIBEXEC ?= [ FSubDirPath $(EXEC_LIBEXEC_TOKENS) ] ;

	# Build dir: p4-bin/bin.xxx[/build][/type]
	EXEC_TOKENS =
		BIN
		bin.$(OS:L)$(OSVER:EL)$(OSPLAT:EL)
		$(BUILD)
		$(TYPE:L)
		;

	EXEC ?= [ FSubDirPath $(EXEC_TOKENS) ] ;
	ALL_LOCATE_TARGET = $(EXEC) ;