mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
makepanda: change Android build model
We no longer copy libs to a separate libs dir to entertain Ant (which is no longer the build system of choice on Android). Also, rather than copying the Java sources to built/src, we now compile them and put the classes in built/classes. Furthermore, executables are really compiled as executables now (rather than as libraries) to allow building and running Panda in termux.
This commit is contained in:
parent
7c1dd4050b
commit
e04cb17a30
@ -943,7 +943,7 @@ if (COMPILER=="GCC"):
|
|||||||
|
|
||||||
if GetTarget() == 'android':
|
if GetTarget() == 'android':
|
||||||
LibName("ALWAYS", '-llog')
|
LibName("ALWAYS", '-llog')
|
||||||
LibName("ALWAYS", '-landroid')
|
LibName("ANDROID", '-landroid')
|
||||||
LibName("JNIGRAPHICS", '-ljnigraphics')
|
LibName("JNIGRAPHICS", '-ljnigraphics')
|
||||||
|
|
||||||
for pkg in MAYAVERSIONS:
|
for pkg in MAYAVERSIONS:
|
||||||
@ -1704,8 +1704,11 @@ def CompileLink(dll, obj, opts):
|
|||||||
|
|
||||||
if COMPILER == "GCC":
|
if COMPILER == "GCC":
|
||||||
cxx = GetCXX()
|
cxx = GetCXX()
|
||||||
if GetOrigExt(dll) == ".exe" and GetTarget() != 'android':
|
if GetOrigExt(dll) == ".exe":
|
||||||
cmd = cxx + ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
|
cmd = cxx + ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
|
||||||
|
if GetTarget() == "android":
|
||||||
|
# Necessary to work around an issue with libandroid depending on vendor libraries
|
||||||
|
cmd += ' -Wl,--allow-shlib-undefined'
|
||||||
else:
|
else:
|
||||||
if (GetTarget() == "darwin"):
|
if (GetTarget() == "darwin"):
|
||||||
cmd = cxx + ' -undefined dynamic_lookup'
|
cmd = cxx + ' -undefined dynamic_lookup'
|
||||||
@ -1718,6 +1721,7 @@ def CompileLink(dll, obj, opts):
|
|||||||
cmd += ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
|
cmd += ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
|
||||||
else:
|
else:
|
||||||
cmd = cxx + ' -shared'
|
cmd = cxx + ' -shared'
|
||||||
|
# Always set soname on Android to avoid a linker warning when loading the library.
|
||||||
if "MODULE" not in opts or GetTarget() == 'android':
|
if "MODULE" not in opts or GetTarget() == 'android':
|
||||||
cmd += " -Wl,-soname=" + os.path.basename(dll)
|
cmd += " -Wl,-soname=" + os.path.basename(dll)
|
||||||
cmd += ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
|
cmd += ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
|
||||||
@ -1774,14 +1778,7 @@ def CompileLink(dll, obj, opts):
|
|||||||
|
|
||||||
oscmd(cmd)
|
oscmd(cmd)
|
||||||
|
|
||||||
if GetTarget() == 'android':
|
if GetOptimizeOption(opts) == 4 and GetTarget() in ('linux', 'android'):
|
||||||
# Copy the library to built/libs/$ANDROID_ABI and strip it.
|
|
||||||
# This is the format that Android NDK projects should use.
|
|
||||||
new_path = '%s/libs/%s/%s' % (GetOutputDir(), SDK["ANDROID_ABI"], os.path.basename(dll))
|
|
||||||
CopyFile(new_path, dll)
|
|
||||||
oscmd('%s --strip-unneeded %s' % (GetStrip(), BracketNameWithQuotes(new_path)))
|
|
||||||
|
|
||||||
elif (GetOptimizeOption(opts)==4 and GetTarget() == 'linux'):
|
|
||||||
oscmd(GetStrip() + " --strip-unneeded " + BracketNameWithQuotes(dll))
|
oscmd(GetStrip() + " --strip-unneeded " + BracketNameWithQuotes(dll))
|
||||||
|
|
||||||
os.system("chmod +x " + BracketNameWithQuotes(dll))
|
os.system("chmod +x " + BracketNameWithQuotes(dll))
|
||||||
@ -1890,6 +1887,25 @@ def CompileRsrc(target, src, opts):
|
|||||||
cmd += " " + BracketNameWithQuotes(src)
|
cmd += " " + BracketNameWithQuotes(src)
|
||||||
oscmd(cmd)
|
oscmd(cmd)
|
||||||
|
|
||||||
|
##########################################################################################
|
||||||
|
#
|
||||||
|
# CompileJava (Android only)
|
||||||
|
#
|
||||||
|
##########################################################################################
|
||||||
|
|
||||||
|
def CompileJava(target, src, opts):
|
||||||
|
"""Compiles a .java file into a .class file."""
|
||||||
|
cmd = "ecj "
|
||||||
|
|
||||||
|
optlevel = GetOptimizeOption(opts)
|
||||||
|
if optlevel >= 4:
|
||||||
|
cmd += "-debug:none "
|
||||||
|
|
||||||
|
cmd += "-cp " + GetOutputDir() + "/classes "
|
||||||
|
cmd += "-d " + GetOutputDir() + "/classes "
|
||||||
|
cmd += BracketNameWithQuotes(src)
|
||||||
|
oscmd(cmd)
|
||||||
|
|
||||||
##########################################################################################
|
##########################################################################################
|
||||||
#
|
#
|
||||||
# FreezePy
|
# FreezePy
|
||||||
@ -2143,6 +2159,9 @@ def CompileAnything(target, inputs, opts, progress = None):
|
|||||||
elif (origsuffix==".rsrc"):
|
elif (origsuffix==".rsrc"):
|
||||||
ProgressOutput(progress, "Building resource object", target)
|
ProgressOutput(progress, "Building resource object", target)
|
||||||
return CompileRsrc(target, infile, opts)
|
return CompileRsrc(target, infile, opts)
|
||||||
|
elif (origsuffix==".class"):
|
||||||
|
ProgressOutput(progress, "Building Java class", target)
|
||||||
|
return CompileJava(target, infile, opts)
|
||||||
elif (origsuffix==".obj"):
|
elif (origsuffix==".obj"):
|
||||||
if (infile.endswith(".cxx")):
|
if (infile.endswith(".cxx")):
|
||||||
ProgressOutput(progress, "Building C++ object", target)
|
ProgressOutput(progress, "Building C++ object", target)
|
||||||
@ -3233,15 +3252,6 @@ if (PkgSkip("CONTRIB")==0):
|
|||||||
CopyAllHeaders('contrib/src/contribbase')
|
CopyAllHeaders('contrib/src/contribbase')
|
||||||
CopyAllHeaders('contrib/src/ai')
|
CopyAllHeaders('contrib/src/ai')
|
||||||
|
|
||||||
########################################################################
|
|
||||||
#
|
|
||||||
# Copy Java files, if applicable
|
|
||||||
#
|
|
||||||
########################################################################
|
|
||||||
|
|
||||||
if GetTarget() == 'android':
|
|
||||||
CopyAllJavaSources('panda/src/android')
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
#
|
#
|
||||||
# These definitions are syntactic shorthand. They make it easy
|
# These definitions are syntactic shorthand. They make it easy
|
||||||
@ -3561,7 +3571,7 @@ TargetAdd('libpandaexpress.dll', input='p3express_composite1.obj')
|
|||||||
TargetAdd('libpandaexpress.dll', input='p3express_composite2.obj')
|
TargetAdd('libpandaexpress.dll', input='p3express_composite2.obj')
|
||||||
TargetAdd('libpandaexpress.dll', input='p3pandabase_pandabase.obj')
|
TargetAdd('libpandaexpress.dll', input='p3pandabase_pandabase.obj')
|
||||||
TargetAdd('libpandaexpress.dll', input=COMMON_DTOOL_LIBS)
|
TargetAdd('libpandaexpress.dll', input=COMMON_DTOOL_LIBS)
|
||||||
TargetAdd('libpandaexpress.dll', opts=['ADVAPI', 'WINSOCK2', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER'])
|
TargetAdd('libpandaexpress.dll', opts=['ADVAPI', 'WINSOCK2', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'ANDROID'])
|
||||||
|
|
||||||
#
|
#
|
||||||
# DIRECTORY: panda/src/pipeline/
|
# DIRECTORY: panda/src/pipeline/
|
||||||
@ -5059,6 +5069,8 @@ if (not RTDIST and not RUNTIME and PkgSkip("PVIEW")==0 and GetTarget() != 'andro
|
|||||||
|
|
||||||
if (not RUNTIME and GetTarget() == 'android'):
|
if (not RUNTIME and GetTarget() == 'android'):
|
||||||
OPTS=['DIR:panda/src/android']
|
OPTS=['DIR:panda/src/android']
|
||||||
|
TargetAdd('org/panda3d/android/NativeIStream.class', opts=OPTS, input='NativeIStream.java')
|
||||||
|
TargetAdd('org/panda3d/android/PandaActivity.class', opts=OPTS, input='PandaActivity.java', dep='org/panda3d/android/NativeIStream.class')
|
||||||
|
|
||||||
TargetAdd('p3android_composite1.obj', opts=OPTS, input='p3android_composite1.cxx')
|
TargetAdd('p3android_composite1.obj', opts=OPTS, input='p3android_composite1.cxx')
|
||||||
TargetAdd('libp3android.dll', input='p3android_composite1.obj')
|
TargetAdd('libp3android.dll', input='p3android_composite1.obj')
|
||||||
@ -5070,15 +5082,15 @@ if (not RUNTIME and GetTarget() == 'android'):
|
|||||||
|
|
||||||
if (not RTDIST and PkgSkip("PVIEW")==0):
|
if (not RTDIST and PkgSkip("PVIEW")==0):
|
||||||
TargetAdd('pview_pview.obj', opts=OPTS, input='pview.cxx')
|
TargetAdd('pview_pview.obj', opts=OPTS, input='pview.cxx')
|
||||||
TargetAdd('pview.exe', input='android_native_app_glue.obj')
|
TargetAdd('libpview.dll', input='android_native_app_glue.obj')
|
||||||
TargetAdd('pview.exe', input='android_main.obj')
|
TargetAdd('libpview.dll', input='android_main.obj')
|
||||||
TargetAdd('pview.exe', input='pview_pview.obj')
|
TargetAdd('libpview.dll', input='pview_pview.obj')
|
||||||
TargetAdd('pview.exe', input='libp3framework.dll')
|
TargetAdd('libpview.dll', input='libp3framework.dll')
|
||||||
if not PkgSkip("EGG"):
|
if not PkgSkip("EGG"):
|
||||||
TargetAdd('pview.exe', input='libpandaegg.dll')
|
TargetAdd('libpview.dll', input='libpandaegg.dll')
|
||||||
TargetAdd('pview.exe', input='libp3android.dll')
|
TargetAdd('libpview.dll', input='libp3android.dll')
|
||||||
TargetAdd('pview.exe', input=COMMON_PANDA_LIBS)
|
TargetAdd('libpview.dll', input=COMMON_PANDA_LIBS)
|
||||||
TargetAdd('AndroidManifest.xml', opts=OPTS, input='pview_manifest.xml')
|
TargetAdd('libpview.dll', opts=['MODULE', 'ANDROID'])
|
||||||
|
|
||||||
#
|
#
|
||||||
# DIRECTORY: panda/src/androiddisplay/
|
# DIRECTORY: panda/src/androiddisplay/
|
||||||
|
@ -1145,12 +1145,7 @@ def MakeBuildTree():
|
|||||||
MakeDirectory(OUTPUTDIR + "/Frameworks")
|
MakeDirectory(OUTPUTDIR + "/Frameworks")
|
||||||
|
|
||||||
elif GetTarget() == 'android':
|
elif GetTarget() == 'android':
|
||||||
MakeDirectory(OUTPUTDIR + "/libs")
|
MakeDirectory(OUTPUTDIR + "/classes")
|
||||||
MakeDirectory(OUTPUTDIR + "/libs/" + ANDROID_ABI)
|
|
||||||
MakeDirectory(OUTPUTDIR + "/src")
|
|
||||||
MakeDirectory(OUTPUTDIR + "/src/org")
|
|
||||||
MakeDirectory(OUTPUTDIR + "/src/org/panda3d")
|
|
||||||
MakeDirectory(OUTPUTDIR + "/src/org/panda3d/android")
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
#
|
#
|
||||||
@ -2892,14 +2887,6 @@ def CopyAllHeaders(dir, skip=[]):
|
|||||||
WriteBinaryFile(dstfile, ReadBinaryFile(srcfile))
|
WriteBinaryFile(dstfile, ReadBinaryFile(srcfile))
|
||||||
JustBuilt([dstfile], [srcfile])
|
JustBuilt([dstfile], [srcfile])
|
||||||
|
|
||||||
def CopyAllJavaSources(dir, skip=[]):
|
|
||||||
for filename in GetDirectoryContents(dir, ["*.java"], skip):
|
|
||||||
srcfile = dir + "/" + filename
|
|
||||||
dstfile = OUTPUTDIR + "/src/org/panda3d/android/" + filename
|
|
||||||
if (NeedsBuild([dstfile], [srcfile])):
|
|
||||||
WriteBinaryFile(dstfile, ReadBinaryFile(srcfile))
|
|
||||||
JustBuilt([dstfile], [srcfile])
|
|
||||||
|
|
||||||
def CopyTree(dstdir, srcdir, omitVCS=True):
|
def CopyTree(dstdir, srcdir, omitVCS=True):
|
||||||
if os.path.isdir(dstdir):
|
if os.path.isdir(dstdir):
|
||||||
source_entries = os.listdir(srcdir)
|
source_entries = os.listdir(srcdir)
|
||||||
@ -3147,6 +3134,7 @@ def CalcLocation(fn, ipath):
|
|||||||
if fn.startswith("panda3d/") and fn.endswith(".py"):
|
if fn.startswith("panda3d/") and fn.endswith(".py"):
|
||||||
return OUTPUTDIR + "/" + fn
|
return OUTPUTDIR + "/" + fn
|
||||||
|
|
||||||
|
if (fn.endswith(".class")):return OUTPUTDIR+"/classes/"+fn
|
||||||
if (fn.count("/")): return fn
|
if (fn.count("/")): return fn
|
||||||
dllext = ""
|
dllext = ""
|
||||||
target = GetTarget()
|
target = GetTarget()
|
||||||
@ -3162,6 +3150,7 @@ def CalcLocation(fn, ipath):
|
|||||||
if (fn.endswith(".lxx")): return CxxFindSource(fn, ipath)
|
if (fn.endswith(".lxx")): return CxxFindSource(fn, ipath)
|
||||||
if (fn.endswith(".pdef")):return CxxFindSource(fn, ipath)
|
if (fn.endswith(".pdef")):return CxxFindSource(fn, ipath)
|
||||||
if (fn.endswith(".xml")): return CxxFindSource(fn, ipath)
|
if (fn.endswith(".xml")): return CxxFindSource(fn, ipath)
|
||||||
|
if (fn.endswith(".java")):return CxxFindSource(fn, ipath)
|
||||||
if (fn.endswith(".egg")): return OUTPUTDIR+"/models/"+fn
|
if (fn.endswith(".egg")): return OUTPUTDIR+"/models/"+fn
|
||||||
if (fn.endswith(".egg.pz")):return OUTPUTDIR+"/models/"+fn
|
if (fn.endswith(".egg.pz")):return OUTPUTDIR+"/models/"+fn
|
||||||
if (fn.endswith(".pyd")): return OUTPUTDIR+"/panda3d/"+fn[:-4]+GetExtensionSuffix()
|
if (fn.endswith(".pyd")): return OUTPUTDIR+"/panda3d/"+fn[:-4]+GetExtensionSuffix()
|
||||||
@ -3197,15 +3186,6 @@ def CalcLocation(fn, ipath):
|
|||||||
if (fn.endswith(".rsrc")): return OUTPUTDIR+"/tmp/"+fn
|
if (fn.endswith(".rsrc")): return OUTPUTDIR+"/tmp/"+fn
|
||||||
if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn
|
if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn
|
||||||
if (fn.endswith(".app")): return OUTPUTDIR+"/bin/"+fn
|
if (fn.endswith(".app")): return OUTPUTDIR+"/bin/"+fn
|
||||||
elif (target == 'android'):
|
|
||||||
# On Android, we build the libraries into built/tmp, then copy them.
|
|
||||||
if (fn.endswith(".obj")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
|
|
||||||
if (fn.endswith(".dll")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".so"
|
|
||||||
if (fn.endswith(".mll")): return OUTPUTDIR+"/plugins/"+fn
|
|
||||||
if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn[:-7]+dllext+".so"
|
|
||||||
if (fn.endswith(".exe")): return OUTPUTDIR+"/tmp/lib"+fn[:-4]+".so"
|
|
||||||
if (fn.endswith(".lib")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".a"
|
|
||||||
if (fn.endswith(".ilb")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".a"
|
|
||||||
else:
|
else:
|
||||||
if (fn.endswith(".obj")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
|
if (fn.endswith(".obj")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
|
||||||
if (fn.endswith(".dll")): return OUTPUTDIR+"/lib/"+fn[:-4]+".so"
|
if (fn.endswith(".dll")): return OUTPUTDIR+"/lib/"+fn[:-4]+".so"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user