#-------------------------------------------------------------------------------
# Copyright (c) 2007, Perforce Software, Inc.  All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE 
# SOFTWARE, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 
# DAMAGE.
#-------------------------------------------------------------------------------

if ! $(P4)
{
    Exit "Use 'jam -sP4=<path to Perforce API>' to build" ;
}


P4LIBS = [ FDirName $(P4) lib ] ;
P4HDRS = [ FDirName $(P4) include p4 ] ;
P4RULES = [ FDirName $(P4) sample Jamrules ] ;

# This sucker ensures that we're always building using the correct 
# compiler & linker flags for our platform. The same ones used to 
# build the Perforce API.
include $(P4RULES) ;

if $(TYPE:L) = opt
{
    EXEC_DIRS = $(P4DCTL) .. bin.$(OS:L)$(OSVER:EL)$(OSPLAT:EL) ;
}
else
{
    EXEC_DIRS = $(P4DCTL) .. bin.$(OS:L)$(OSVER:EL)$(OSPLAT:EL) $(TYPE:L) ;
}

EXEC	= [ FDirName $(EXEC_DIRS) ] ;
ALL_LOCATE_TARGET = $(EXEC) ;

# If SSL requested add -lssl to the linker
if $(SSL) = yes
{
	LINKLIBS += -lssl ;
}

#
# Load our version data
#
SEARCH on Version = $(P4DCTL) ;
include Version ;

#
# By default install into /usr/local/bin
#
BINDIR ?= /usr/local/bin ;
	
#
# Rule for making sure that our executable is installed setuid root, which
# it needs to be to manage the pid files. Based on InstallInto and InstallBin
# in Jambase: unfortunately they don't get it quite right.
#
# SetUidRoot target : sources ;

rule SetUidRoot
{
	local _oldmode = $(EXEMODE) ;
	local _oldowner = $(OWNER) ;

	EXEMODE = 4711 ;
	OWNER = root ;
	GROUP = 0 ; # On some it's called 'root', on others, 'wheel'

	Main $(<) : $(>) ;

	local i t ;

	t = [ FAppendSuffix $(<) : $(SUFEXE) ] ;
	t = $(t:G=$(INSTALLGRIST)) ;
	MODE on $(t) = $(EXEMODE) ;

	# Arrange for jam install
	# Arrange for jam uninstall
	# sources are in SEARCH_SOURCE
	# targets are in dir

	Depends install : $(t) ;
	Clean uninstall : $(t) ;
	SEARCH on $(<) = $(SEARCH_SOURCE) ;
	MakeLocate $(t) : $(BINDIR) ;

	# For each target, make gristed target name
	# and Install, Chmod, Chown, and Chgrp

	for i in $(<)
	{
	    local tt = $(i:G=$(INSTALLGRIST)) ;

	    Depends $(tt) : $(i) ;
	    Install $(tt) : $(i) ;

	    if $(OWNER) && $(CHOWN) 
	    { 
		Chown $(tt) ;
		OWNER on $(tt) = $(OWNER) ;
	    }

	    if $(GROUP) && $(CHGRP) 
	    { 
		Chgrp $(tt) ;
		GROUP on $(tt) = $(GROUP) ;
	    }

	    Chmod $(tt) ;
	}

	EXEMODE = $(_oldmode) ;
	OWNER	= $(_oldowner) ;
}


#
# Ident magic - overridden from p4/Jamrules because we need ID_API added
# to our ident string.
#
rule Ident
{
	# Set up special defines

	local osid = $(OS)$(OSVER:E)$(OSPLAT:E) ;

	rule Fconcat { return $(<:J) ; }

	ObjectDefines $(<) :
	    [ Fconcat ID_OS=    [ FQuote $(osid[1]:U) ] ]
	    [ Fconcat ID_REL=   [ FQuote $(RELEASE:J=.) ] ]
	    [ Fconcat ID_API=   [ FQuote $(APIVERSION:J=.) ] ]
	    [ Fconcat ID_PATCH= [ FQuote $(PATCHLEVEL)$(SPECIAL:E) ] ]
	    [ Fconcat ID_Y=     [ FQuote $(DATE[1]) ] ]
	    [ Fconcat ID_M=     [ FQuote $(DATE[2]) ] ]
	    [ Fconcat ID_D=     [ FQuote $(DATE[3]) ] ] ;

	# Source file includes Version

	Includes [ FGristSourceFiles $(<) ] : Version ;
}


# Overriden from P4 Jamrules since the library locations are different in
# an API tree.
rule SetLibName
{
    $(1) = $(2:S=$(SUFLIB)) ;
    LOCATE on $($(1)) = $(P4LIBS) ;
}

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