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