import os
import platform
import re
class PlatformInfo:
def __init__(self, apiVersion, releaseVersion,ssl):
self.libraries=None
self.extra_compile_args=None
self.define_macros=None
self.extra_link_args=None
# This is a hack for 'sdist'. I need to set up all other information, but do not need the libraries
if ssl == None:
ssl = ""
unameOut = platform.uname()
if os.name == "nt":
if platform.python_compiler().find("64 bit") > 0:
pl = "NTX64"
arch = "64"
else:
pl = "NTX86"
arch = "32"
self.ID_OS=self.inStrStr(pl)
self.ID_REL=self.inStrStr(releaseVersion.getFullP4Version())
self.ID_PATCH=self.inStrStr(releaseVersion.patchlevel)
self.ID_API=self.inStrStr(apiVersion.getPatchVersion())
self.ID_Y=self.inStrStr(releaseVersion.suppdate_year)
self.ID_M=self.inStrStr(releaseVersion.suppdate_month)
self.ID_D=self.inStrStr(releaseVersion.suppdate_day)
self.libraries=["oldnames", "wsock32", "advapi32", "ws2_32", "User32", "Gdi32", # MSVC libs
"libclient", "librpc", "libsupp"] # P4API libs
self.libraries.append("libeay%s" % arch)
self.libraries.append("ssleay%s" % arch)
self.extra_compile_args=["/DOS_NT", "/DMT", "/DCASE_INSENSITIVE", "/EHsc"]
self.extra_link_args=["/NODEFAULTLIB:libcmt"]
elif os.name == "posix":
self.libraries=["client", "rpc", "supp"] # P4API libs
self.extra_link_args = []
if unameOut[0] == "Darwin":
self.extra_link_args = [ os.path.join(ssl, "libssl.a"), os.path.join(ssl,"libcrypto.a") ]
else:
self.libraries.append("ssl")
self.libraries.append("crypto")
self.extra_compile_args = []
# it is UNIX, but which one? Let's ask uname()
# details later
if unameOut[0] == "Linux":
unix = "LINUX"
release = unameOut[2][0:1] + unameOut[2][2:3]
arch = self.architecture(unameOut[4])
self.libraries.append("rt") # for clock_gettime
elif unameOut[0] == "Darwin":
unix = "DARWIN"
self.extra_compile_args.append("-fvisibility-inlines-hidden")
self.extra_compile_args.append("-DCASE_INSENSITIVE")
if unameOut[2][0] == "8":
release = "104"
elif unameOut[2][0] == "9" :
release = "105"
self.extra_link_args += ["-framework", "Carbon"]
elif unameOut[2][0:2] in ("10", "11") :
release = "106"
self.extra_link_args += ["-framework", "Carbon"]
else:
release = "100"
self.extra_link_args += ["-framework", "Carbon"]
arch = self.architecture(unameOut[4])
# The following is another hack
# There is no way to remove the standard compile flags. The default on a MAC
# is to build a universal binary. The Perforce API is only built for one
# platform, so we need to remove these flags. By setting the environment
# variable ARCHFLAGS the defaults can be overriden.
if arch == "PPC":
os.environ["ARCHFLAGS"] = "-arch ppc"
elif arch == "i386":
os.environ["ARCHFLAGS"] = "-arch i386"
elif arch == "X86_64":
os.environ["ARCHFLAGS"] = "-arch x86_64"
elif unameOut[0] == "SunOS":
unix = "SOLARIS"
release = re.match("5.(\d+)", unameOut[2]).group(1)
arch = self.architecture(unameOut[4])
elif unameOut[0] == 'FreeBSD':
unix = "FREEBSD"
release = unameOut[2][0]
if release == '5':
release += unameOut[2][2]
arch = self.architecture(unameOut[4])
elif unameOut[0] == 'CYGWIN_NT-5.1':
unix = "CYGWIN"
release = ""
arch = self.architecture(unameOut[4])
self.ID_OS = self.inStr(unix + release + arch)
self.ID_REL=self.inStr(releaseVersion.getFullP4Version())
self.ID_PATCH=self.inStr(releaseVersion.patchlevel)
self.ID_API=self.inStr(apiVersion.getPatchVersion())
self.ID_Y=self.inStr(releaseVersion.suppdate_year)
self.ID_M=self.inStr(releaseVersion.suppdate_month)
self.ID_D=self.inStr(releaseVersion.suppdate_day)
self.extra_compile_args.append("-DOS_" + unix)
self.extra_compile_args.append("-DOS_" + unix + release)
self.extra_compile_args.append("-DOS_" + unix + arch)
self.extra_compile_args.append("-DOS_" + unix + release + arch)
self.define_macros = [('ID_OS', self.ID_OS),
('ID_REL', self.ID_REL),
('ID_PATCH', self.ID_PATCH),
('ID_API', self.ID_API),
('ID_Y', self.ID_Y),
('ID_M', self.ID_M),
('ID_D', self.ID_D)]
def inStr(self, str):
return '"' + str + '"'
def inStrStr(self, str):
return '"\\"' + str + '\\""'
def architecture(self, str):
if str == 'x86_64':
return "X86_64"
elif re.match('i.86', str):
return "X86"
elif str == 'i86pc':
return "X86"
elif str == 'Power Macintosh':
return 'PPC'
elif str == 'powerpc':
return 'PPC'
elif str == 'amd64':
return 'X86_64'
elif str == 'sparc':
return 'SPARC'
elif re.match('arm.*', str):
return "ARM"