#------------------------------------------------------------------------------- # 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=' 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) ; # # 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 ;