godot/platform/android/SCsub
Rémi Verschelde 6770357e47 Android: Better identify thirdparty C/C++ code
- The `cpu-features.{c,h}` code was only used by chance by the webm
  (libvpx) code, so I moved it there. It was actually introduced before
  that and wasn't in use, and libvpx just happened to be able to
  compile thanks to it being bundled.
  It could potentially be compiled on the fly from the Android NDK, but
  since we plan to replace the webm module by a GDNative plugin in the
  near future, I went the bundling route.

- `ifaddrs_android.h` is already provided in the Android NDK as
  `ifaddrs.h`, same as on other Unixes. Yet we cannot use it until we
  up the min API level to 24, where `getifaddrs` is first defined.
  I moved the files to `thirdparty/misc` and synced them with upstream
  WebRTC (only indentation changes and removal of `static` qualifiers).

Also removes dropped thirdparty files from COPYRIGHT.txt after changes
in #24105 and #24145.
2018-12-20 13:07:54 +01:00

170 lines
5.8 KiB
Python

#!/usr/bin/env python
Import('env')
import shutil
from compat import open_utf8
from distutils.version import LooseVersion
from detect import get_ndk_version
android_files = [
'os_android.cpp',
'file_access_android.cpp',
'audio_driver_opensl.cpp',
'file_access_jandroid.cpp',
'dir_access_jandroid.cpp',
'thread_jandroid.cpp',
'audio_driver_jandroid.cpp',
'java_glue.cpp',
'java_class_wrapper.cpp',
# 'power_android.cpp'
]
env_android = env.Clone()
if env['target'] == "profile":
env_android.Append(CPPFLAGS=['-DPROFILER_ENABLED'])
android_objects = []
for x in android_files:
android_objects.append(env_android.SharedObject(x))
env_thirdparty = env_android.Clone()
env_thirdparty.disable_warnings()
android_objects.append(env_thirdparty.SharedObject('#thirdparty/misc/ifaddrs-android.cc'))
abspath = env.Dir(".").abspath
with open_utf8(abspath + "/build.gradle.template", "r") as gradle_basein:
gradle_text = gradle_basein.read()
gradle_maven_flat_text = ""
if len(env.android_flat_dirs) > 0:
gradle_maven_flat_text += "flatDir {\n"
gradle_maven_flat_text += "\tdirs "
for x in env.android_flat_dirs:
gradle_maven_flat_text += "'" + x + "',"
gradle_maven_flat_text = gradle_maven_flat_text[:-1]
gradle_maven_flat_text += "\n\t}\n"
gradle_maven_repos_text = ""
gradle_maven_repos_text += gradle_maven_flat_text
if len(env.android_maven_repos) > 0:
gradle_maven_repos_text += ""
for x in env.android_maven_repos:
gradle_maven_repos_text += "\tmaven {\n"
gradle_maven_repos_text += "\t" + x + "\n"
gradle_maven_repos_text += "\t}\n"
gradle_maven_dependencies_text = ""
for x in env.android_dependencies:
gradle_maven_dependencies_text += x + "\n\t"
gradle_java_dirs_text = ""
for x in env.android_java_dirs:
gradle_java_dirs_text += ",'" + x.replace("\\", "/") + "'"
gradle_plugins = ""
for x in env.android_gradle_plugins:
gradle_plugins += "apply plugin: \"" + x + "\"\n"
gradle_classpath = ""
for x in env.android_gradle_classpath:
gradle_classpath += "\t\tclasspath \"" + x + "\"\n"
gradle_res_dirs_text = ""
for x in env.android_res_dirs:
gradle_res_dirs_text += ",'" + x.replace("\\", "/") + "'"
gradle_aidl_dirs_text = ""
for x in env.android_aidl_dirs:
gradle_aidl_dirs_text += ",'" + x.replace("\\", "/") + "'"
gradle_jni_dirs_text = ""
for x in env.android_jni_dirs:
gradle_jni_dirs_text += ",'" + x.replace("\\", "/") + "'"
gradle_asset_dirs_text = ""
for x in env.android_asset_dirs:
gradle_asset_dirs_text += ",'" + x.replace("\\", "/") + "'"
gradle_default_config_text = ""
minSdk = 18
targetSdk = 28
for x in env.android_default_config:
if x.startswith("minSdkVersion") and int(x.split(" ")[-1]) < minSdk:
x = "minSdkVersion " + str(minSdk)
if x.startswith("targetSdkVersion") and int(x.split(" ")[-1]) > targetSdk:
x = "targetSdkVersion " + str(targetSdk)
gradle_default_config_text += x + "\n\t\t"
if "minSdkVersion" not in gradle_default_config_text:
gradle_default_config_text += ("minSdkVersion " + str(minSdk) + "\n\t\t")
if "targetSdkVersion" not in gradle_default_config_text:
gradle_default_config_text += ("targetSdkVersion " + str(targetSdk) + "\n\t\t")
gradle_text = gradle_text.replace("$$GRADLE_REPOSITORY_URLS$$", gradle_maven_repos_text)
gradle_text = gradle_text.replace("$$GRADLE_DEPENDENCIES$$", gradle_maven_dependencies_text)
gradle_text = gradle_text.replace("$$GRADLE_JAVA_DIRS$$", gradle_java_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_RES_DIRS$$", gradle_res_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_ASSET_DIRS$$", gradle_asset_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_AIDL_DIRS$$", gradle_aidl_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_JNI_DIRS$$", gradle_jni_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_DEFAULT_CONFIG$$", gradle_default_config_text)
gradle_text = gradle_text.replace("$$GRADLE_PLUGINS$$", gradle_plugins)
gradle_text = gradle_text.replace("$$GRADLE_CLASSPATH$$", gradle_classpath)
with open_utf8(abspath + "/java/build.gradle", "w") as gradle_baseout:
gradle_baseout.write(gradle_text)
with open_utf8(abspath + "/AndroidManifest.xml.template", "r") as pp_basein:
manifest = pp_basein.read()
manifest = manifest.replace("$$ADD_APPLICATION_CHUNKS$$", env.android_manifest_chunk)
manifest = manifest.replace("$$ADD_PERMISSION_CHUNKS$$", env.android_permission_chunk)
manifest = manifest.replace("$$ADD_APPATTRIBUTE_CHUNKS$$", env.android_appattributes_chunk)
with open_utf8(abspath + "/java/AndroidManifest.xml", "w") as pp_baseout:
pp_baseout.write(manifest)
lib = env_android.add_shared_library("#bin/libgodot", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"])
lib_arch_dir = ''
if env['android_arch'] == 'armv6':
lib_arch_dir = 'armeabi'
elif env['android_arch'] == 'armv7':
lib_arch_dir = 'armeabi-v7a'
elif env['android_arch'] == 'arm64v8':
lib_arch_dir = 'arm64-v8a'
elif env['android_arch'] == 'x86':
lib_arch_dir = 'x86'
else:
print('WARN: Architecture not suitable for embedding into APK; keeping .so at \\bin')
if lib_arch_dir != '':
if env['target'] == 'release':
lib_type_dir = 'release'
else: # release_debug, debug
lib_type_dir = 'debug'
out_dir = '#platform/android/java/libs/' + lib_type_dir + '/' + lib_arch_dir
env_android.Command(out_dir + '/libgodot_android.so', '#bin/libgodot' + env['SHLIBSUFFIX'], Move("$TARGET", "$SOURCE"))
ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"])
if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"):
stl_lib_path = str(env['ANDROID_NDK_ROOT']) + '/sources/cxx-stl/llvm-libc++/libs/' + lib_arch_dir + '/libc++_shared.so'
env_android.Command(out_dir + '/libc++_shared.so', stl_lib_path, Copy("$TARGET", "$SOURCE"))