makepanda: Changes to support build for macOS 11.0 / arm64

Besides use of --universal with --osxtarget 11, it's now also possible to create a fat build with ARM64 by using --osxtarget 10.9 --arch x86_64 --arch arm64 (it will use the 11.x SDK but target 10.9)

FMOD Ex is also being disabled when building against the 10.14 SDK or higher, because the necessary libstdc++.6.0.9.dylib is no longer being shipped.  FMOD Ex, libRocket and Cg are all disabled on ARM64 (FMOD Ex and Cg don't have the binaries available, libRocket could theoretically be built but there's no point as there won't be an ARM64 build of Python 2.7, and besides, we've deprecated it anyway).

Fixes #1062
This commit is contained in:
rdb 2020-12-17 12:25:06 +01:00
parent 4d50e73132
commit a18edf54b7
2 changed files with 70 additions and 23 deletions

View File

@ -194,7 +194,7 @@ def parseopts(args):
anything = 0 anything = 0
optimize = "" optimize = ""
target = None target = None
target_arch = None target_archs = []
universal = False universal = False
clean_build = False clean_build = False
for pkg in PkgListGet(): for pkg in PkgListGet():
@ -223,7 +223,7 @@ def parseopts(args):
elif (option=="--osxtarget"): OSXTARGET=value.strip() elif (option=="--osxtarget"): OSXTARGET=value.strip()
elif (option=="--universal"): universal = True elif (option=="--universal"): universal = True
elif (option=="--target"): target = value.strip() elif (option=="--target"): target = value.strip()
elif (option=="--arch"): target_arch = value.strip() elif (option=="--arch"): target_archs.append(value.strip())
elif (option=="--nocolor"): DisableColors() elif (option=="--nocolor"): DisableColors()
elif (option=="--version"): elif (option=="--version"):
match = re.match(r'^\d+\.\d+(\.\d+)+', value) match = re.match(r'^\d+\.\d+(\.\d+)+', value)
@ -305,8 +305,8 @@ def parseopts(args):
else: else:
OSXTARGET = None OSXTARGET = None
if target is not None or target_arch is not None: if target is not None or target_archs:
SetTarget(target, target_arch) SetTarget(target, target_archs[-1] if target_archs else None)
if universal: if universal:
if target_arch: if target_arch:
@ -329,8 +329,11 @@ def parseopts(args):
if osxver >= (11, 0): if osxver >= (11, 0):
OSX_ARCHS.append("arm64") OSX_ARCHS.append("arm64")
elif HasTargetArch(): elif target_archs:
OSX_ARCHS.append(GetTargetArch()) OSX_ARCHS = target_archs
if 'arm64' in target_archs and OSXTARGET and OSXTARGET < (10, 9):
exit("Must have at least --osxtarget 10.9 when targeting arm64")
try: try:
SetOptimize(int(optimize)) SetOptimize(int(optimize))
@ -442,6 +445,9 @@ elif target == 'darwin':
else: else:
maj, min = platform.mac_ver()[0].split('.')[:2] maj, min = platform.mac_ver()[0].split('.')[:2]
osxver = int(maj), int(min) osxver = int(maj), int(min)
if osxver[0] == 11:
# I think Python pins minor version to 0 from macOS 11 onward
osxver = (osxver[0], 0)
arch_tag = None arch_tag = None
if not OSX_ARCHS: if not OSX_ARCHS:
@ -591,7 +597,7 @@ MakeBuildTree()
SdkLocateDirectX(STRDXSDKVERSION) SdkLocateDirectX(STRDXSDKVERSION)
SdkLocateMaya() SdkLocateMaya()
SdkLocateMax() SdkLocateMax()
SdkLocateMacOSX(OSXTARGET) SdkLocateMacOSX(OSXTARGET, OSX_ARCHS)
SdkLocatePython(RTDIST) SdkLocatePython(RTDIST)
SdkLocateWindows(WINDOWS_SDK) SdkLocateWindows(WINDOWS_SDK)
SdkLocatePhysX() SdkLocatePhysX()
@ -927,6 +933,19 @@ if (COMPILER=="GCC"):
# 64-bits macOS doesn't have Carbon. # 64-bits macOS doesn't have Carbon.
PkgDisable("CARBON") PkgDisable("CARBON")
if GetTarget() == 'darwin':
if 'x86_64' not in OSX_ARCHS and 'i386' not in OSX_ARCHS:
# These support only these archs, so don't build them if we're not
# targeting any of the supported archs.
PkgDisable("FMODEX")
PkgDisable("NVIDIACG")
PkgDisable("ROCKET")
elif (OSX_ARCHS and 'arm64' in OSX_ARCHS) or \
(OSXTARGET and OSXTARGET >= (10, 14)) or \
(not OSXTARGET and not os.path.isfile('/usr/lib/libstdc++.6.0.9.dylib')):
# Also, we can't target FMOD Ex with the 10.14 SDK
PkgDisable("FMODEX")
#if (PkgSkip("PYTHON")==0): #if (PkgSkip("PYTHON")==0):
# IncDirectory("PYTHON", SDK["PYTHON"]) # IncDirectory("PYTHON", SDK["PYTHON"])
if (GetHost() == "darwin"): if (GetHost() == "darwin"):
@ -989,6 +1008,7 @@ if (COMPILER=="GCC"):
if not PkgSkip("FFMPEG"): if not PkgSkip("FFMPEG"):
if GetTarget() == "darwin": if GetTarget() == "darwin":
if 'i386' in OSX_ARCHS or 'ppc' in OSX_ARCHS:
LibName("FFMPEG", "-Wl,-read_only_relocs,suppress") LibName("FFMPEG", "-Wl,-read_only_relocs,suppress")
LibName("FFMPEG", "-framework VideoDecodeAcceleration") LibName("FFMPEG", "-framework VideoDecodeAcceleration")
elif os.path.isfile(GetThirdpartyDir() + "ffmpeg/lib/libavcodec.a"): elif os.path.isfile(GetThirdpartyDir() + "ffmpeg/lib/libavcodec.a"):
@ -1477,6 +1497,8 @@ def CompileCxx(obj,src,opts):
if OSXTARGET is not None: if OSXTARGET is not None:
cmd += " -isysroot " + SDK["MACOSX"] cmd += " -isysroot " + SDK["MACOSX"]
cmd += " -mmacosx-version-min=%d.%d" % (OSXTARGET) cmd += " -mmacosx-version-min=%d.%d" % (OSXTARGET)
elif platform.mac_ver()[0].startswith('11.'):
cmd += " -mmacosx-version-min=11.0"
for arch in OSX_ARCHS: for arch in OSX_ARCHS:
if 'NOARCH:' + arch.upper() not in opts: if 'NOARCH:' + arch.upper() not in opts:
@ -1997,6 +2019,8 @@ def CompileLink(dll, obj, opts):
if OSXTARGET is not None: if OSXTARGET is not None:
cmd += " -isysroot " + SDK["MACOSX"] + " -Wl,-syslibroot," + SDK["MACOSX"] cmd += " -isysroot " + SDK["MACOSX"] + " -Wl,-syslibroot," + SDK["MACOSX"]
cmd += " -mmacosx-version-min=%d.%d" % (OSXTARGET) cmd += " -mmacosx-version-min=%d.%d" % (OSXTARGET)
elif platform.mac_ver()[0].startswith('11.'):
cmd += " -mmacosx-version-min=11.0"
for arch in OSX_ARCHS: for arch in OSX_ARCHS:
if 'NOARCH:' + arch.upper() not in opts: if 'NOARCH:' + arch.upper() not in opts:
@ -2765,8 +2789,19 @@ def WriteConfigSettings():
conf = "/* dtool_config.h. Generated automatically by makepanda.py */\n" conf = "/* dtool_config.h. Generated automatically by makepanda.py */\n"
for key in sorted(dtool_config.keys()): for key in sorted(dtool_config.keys()):
val = OverrideValue(key, dtool_config[key]) val = OverrideValue(key, dtool_config[key])
if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
else: conf = conf + "#define " + key + " " + val + "\n" if key in ('HAVE_CG', 'HAVE_CGGL', 'HAVE_CGDX9') and val != 'UNDEF':
# These are not available for ARM, period.
conf = conf + "#ifdef __aarch64__\n"
conf = conf + "#undef " + key + "\n"
conf = conf + "#else\n"
conf = conf + "#define " + key + " " + val + "\n"
conf = conf + "#endif\n"
elif val == 'UNDEF':
conf = conf + "#undef " + key + "\n"
else:
conf = conf + "#define " + key + " " + val + "\n"
ConditionalWriteFile(GetOutputDir() + '/include/dtool_config.h', conf) ConditionalWriteFile(GetOutputDir() + '/include/dtool_config.h', conf)
if (RTDIST or RUNTIME): if (RTDIST or RUNTIME):
@ -4625,14 +4660,14 @@ if (PkgSkip("VISION") == 0) and (not RUNTIME):
# #
if (PkgSkip("ROCKET") == 0) and (not RUNTIME): if (PkgSkip("ROCKET") == 0) and (not RUNTIME):
OPTS=['DIR:panda/src/rocket', 'BUILDING:ROCKET', 'ROCKET', 'PYTHON'] OPTS=['DIR:panda/src/rocket', 'BUILDING:ROCKET', 'ROCKET', 'PYTHON', 'NOARCH:ARM64']
TargetAdd('p3rocket_composite1.obj', opts=OPTS, input='p3rocket_composite1.cxx') TargetAdd('p3rocket_composite1.obj', opts=OPTS, input='p3rocket_composite1.cxx')
TargetAdd('libp3rocket.dll', input='p3rocket_composite1.obj') TargetAdd('libp3rocket.dll', input='p3rocket_composite1.obj')
TargetAdd('libp3rocket.dll', input=COMMON_PANDA_LIBS) TargetAdd('libp3rocket.dll', input=COMMON_PANDA_LIBS)
TargetAdd('libp3rocket.dll', opts=OPTS) TargetAdd('libp3rocket.dll', opts=OPTS)
OPTS=['DIR:panda/src/rocket', 'ROCKET', 'RTTI', 'EXCEPTIONS'] OPTS=['DIR:panda/src/rocket', 'ROCKET', 'RTTI', 'EXCEPTIONS', 'NOARCH:ARM64']
IGATEFILES=GetDirectoryContents('panda/src/rocket', ["rocketInputHandler.h", IGATEFILES=GetDirectoryContents('panda/src/rocket', ["rocketInputHandler.h",
"rocketInputHandler.cxx", "rocketRegion.h", "rocketRegion.cxx", "rocketRegion_ext.h"]) "rocketInputHandler.cxx", "rocketRegion.h", "rocketRegion.cxx", "rocketRegion_ext.h"])
TargetAdd('libp3rocket.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3rocket.in', opts=OPTS, input=IGATEFILES)
@ -4650,7 +4685,7 @@ if (PkgSkip("ROCKET") == 0) and (not RUNTIME):
PyTargetAdd('rocket.pyd', input='libp3rocket.dll') PyTargetAdd('rocket.pyd', input='libp3rocket.dll')
PyTargetAdd('rocket.pyd', input='libp3interrogatedb.dll') PyTargetAdd('rocket.pyd', input='libp3interrogatedb.dll')
PyTargetAdd('rocket.pyd', input=COMMON_PANDA_LIBS) PyTargetAdd('rocket.pyd', input=COMMON_PANDA_LIBS)
PyTargetAdd('rocket.pyd', opts=['ROCKET']) PyTargetAdd('rocket.pyd', opts=['ROCKET', 'NOARCH:ARM64'])
# #
# DIRECTORY: panda/src/p3skel # DIRECTORY: panda/src/p3skel
@ -5201,10 +5236,10 @@ if (PkgSkip("BULLET")==0 and not RUNTIME):
# #
if (PkgSkip("PHYSX")==0): if (PkgSkip("PHYSX")==0):
OPTS=['DIR:panda/src/physx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC'] OPTS=['DIR:panda/src/physx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC', 'NOARCH:ARM64']
TargetAdd('p3physx_composite.obj', opts=OPTS, input='p3physx_composite.cxx') TargetAdd('p3physx_composite.obj', opts=OPTS, input='p3physx_composite.cxx')
OPTS=['DIR:panda/src/physx', 'PHYSX', 'NOARCH:PPC'] OPTS=['DIR:panda/src/physx', 'PHYSX', 'NOARCH:PPC', 'NOARCH:ARM64']
IGATEFILES=GetDirectoryContents('panda/src/physx', ["*.h", "*_composite*.cxx"]) IGATEFILES=GetDirectoryContents('panda/src/physx', ["*.h", "*_composite*.cxx"])
TargetAdd('libpandaphysx.in', opts=OPTS, input=IGATEFILES) TargetAdd('libpandaphysx.in', opts=OPTS, input=IGATEFILES)
TargetAdd('libpandaphysx.in', opts=['IMOD:panda3d.physx', 'ILIB:libpandaphysx', 'SRCDIR:panda/src/physx']) TargetAdd('libpandaphysx.in', opts=['IMOD:panda3d.physx', 'ILIB:libpandaphysx', 'SRCDIR:panda/src/physx'])
@ -5214,15 +5249,15 @@ if (PkgSkip("PHYSX")==0):
# #
if (PkgSkip("PHYSX")==0): if (PkgSkip("PHYSX")==0):
OPTS=['DIR:panda/metalibs/pandaphysx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] OPTS=['DIR:panda/metalibs/pandaphysx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC', 'NOARCH:ARM64', 'PYTHON']
TargetAdd('pandaphysx_pandaphysx.obj', opts=OPTS, input='pandaphysx.cxx') TargetAdd('pandaphysx_pandaphysx.obj', opts=OPTS, input='pandaphysx.cxx')
TargetAdd('libpandaphysx.dll', input='pandaphysx_pandaphysx.obj') TargetAdd('libpandaphysx.dll', input='pandaphysx_pandaphysx.obj')
TargetAdd('libpandaphysx.dll', input='p3physx_composite.obj') TargetAdd('libpandaphysx.dll', input='p3physx_composite.obj')
TargetAdd('libpandaphysx.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandaphysx.dll', input=COMMON_PANDA_LIBS)
TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC', 'PYTHON']) TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC', 'NOARCH:ARM64', 'PYTHON'])
OPTS=['DIR:panda/metalibs/pandaphysx', 'PHYSX', 'NOARCH:PPC'] OPTS=['DIR:panda/metalibs/pandaphysx', 'PHYSX', 'NOARCH:PPC', 'NOARCH:ARM64']
PyTargetAdd('physx_module.obj', input='libpandaphysx.in') PyTargetAdd('physx_module.obj', input='libpandaphysx.in')
PyTargetAdd('physx_module.obj', opts=OPTS) PyTargetAdd('physx_module.obj', opts=OPTS)
PyTargetAdd('physx_module.obj', opts=['IMOD:panda3d.physx', 'ILIB:physx', 'IMPORT:panda3d.core']) PyTargetAdd('physx_module.obj', opts=['IMOD:panda3d.physx', 'ILIB:physx', 'IMPORT:panda3d.core'])
@ -5232,7 +5267,7 @@ if (PkgSkip("PHYSX")==0):
PyTargetAdd('physx.pyd', input='libpandaphysx.dll') PyTargetAdd('physx.pyd', input='libpandaphysx.dll')
PyTargetAdd('physx.pyd', input='libp3interrogatedb.dll') PyTargetAdd('physx.pyd', input='libp3interrogatedb.dll')
PyTargetAdd('physx.pyd', input=COMMON_PANDA_LIBS) PyTargetAdd('physx.pyd', input=COMMON_PANDA_LIBS)
PyTargetAdd('physx.pyd', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC']) PyTargetAdd('physx.pyd', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC', 'NOARCH:ARM64'])
# #
# DIRECTORY: panda/src/physics/ # DIRECTORY: panda/src/physics/

View File

@ -2438,10 +2438,17 @@ def SdkLocateWindows(version = '7.1'):
else: else:
print("Using Windows SDK %s" % (version)) print("Using Windows SDK %s" % (version))
def SdkLocateMacOSX(osxtarget = None): def SdkLocateMacOSX(osxtarget = None, archs = []):
if (GetHost() != "darwin"): return if (GetHost() != "darwin"): return
if (osxtarget != None): if (osxtarget != None):
if osxtarget < (11, 0) and 'arm64' in archs:
# Building for arm64 requires the 11.0 SDK, with which we can still
# target 10.9.
assert osxtarget >= (10, 9)
sdkname = "MacOSX11.0"
else:
sdkname = "MacOSX%d.%d" % osxtarget sdkname = "MacOSX%d.%d" % osxtarget
if (os.path.exists("/Library/Developer/CommandLineTools/SDKs/%s.sdk" % sdkname)): if (os.path.exists("/Library/Developer/CommandLineTools/SDKs/%s.sdk" % sdkname)):
SDK["MACOSX"] = "/Library/Developer/CommandLineTools/SDKs/%s.sdk" % sdkname SDK["MACOSX"] = "/Library/Developer/CommandLineTools/SDKs/%s.sdk" % sdkname
elif (os.path.exists("/Developer/SDKs/%su.sdk" % sdkname)): elif (os.path.exists("/Developer/SDKs/%su.sdk" % sdkname)):
@ -2458,12 +2465,17 @@ def SdkLocateMacOSX(osxtarget = None):
handle.close() handle.close()
if (os.path.exists("%s/Platforms/MacOSX.platform/Developer/SDKs/%s.sdk" % (result, sdkname))): if (os.path.exists("%s/Platforms/MacOSX.platform/Developer/SDKs/%s.sdk" % (result, sdkname))):
SDK["MACOSX"] = "%s/Platforms/MacOSX.platform/Developer/SDKs/%s.sdk" % (result, sdkname) SDK["MACOSX"] = "%s/Platforms/MacOSX.platform/Developer/SDKs/%s.sdk" % (result, sdkname)
elif sdkname == "MacOSX11.0" and os.path.exists("/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk"):
SDK["MACOSX"] = "/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk"
else: else:
exit("Couldn't find any MacOSX SDK for OSX version %s!" % sdkname) exit("Couldn't find any MacOSX SDK for macOS version %s!" % sdkname)
SDK["OSXTARGET"] = osxtarget SDK["OSXTARGET"] = osxtarget
else: else:
SDK["MACOSX"] = "" SDK["MACOSX"] = ""
maj, min = platform.mac_ver()[0].split('.')[:2] maj, min = platform.mac_ver()[0].split('.')[:2]
if int(maj) == 11:
SDK["OSXTARGET"] = int(maj), 0
else:
SDK["OSXTARGET"] = int(maj), int(min) SDK["OSXTARGET"] = int(maj), int(min)
# Latest first # Latest first