-
-
Notifications
You must be signed in to change notification settings - Fork 21.4k
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,6 +26,7 @@ def get_opts(): | |
EnumVariable('android_arch', 'Target architecture', "armv7", ('armv7', 'armv6', 'arm64v8', 'x86')), | ||
BoolVariable('android_neon', 'Enable NEON support (armv7 only)', True), | ||
BoolVariable('android_stl', 'Enable Android STL support (for modules)', False), | ||
BoolVariable('ndk_unified_headers', 'Enable NDK unified headers', True) | ||
] | ||
|
||
|
||
|
@@ -178,12 +179,28 @@ def mySpawn(sh, escape, cmd, args, env): | |
env['RANLIB'] = tools_path + "/ranlib" | ||
env['AS'] = tools_path + "/as" | ||
|
||
sysroot = env["ANDROID_NDK_ROOT"] + "/platforms/" + env['ndk_platform'] + "/" + env['ARCH'] | ||
ndk_unified_headers = env['ndk_unified_headers'] | ||
ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) | ||
|
||
common_opts = ['-fno-integrated-as', '-gcc-toolchain', gcc_toolchain_path] | ||
|
||
if not ndk_unified_headers and ndk_version != None and ndk_version[0] >= 16: | ||
ndk_unified_headers = True | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
rraallvv
Author
Contributor
|
||
print("Turning NDK unified headers on (starting from r16)") | ||
|
||
lib_sysroot = env["ANDROID_NDK_ROOT"] + "/platforms/" + env['ndk_platform'] + "/" + env['ARCH'] | ||
|
||
## Compile flags | ||
|
||
env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include"]) | ||
if ndk_unified_headers: | ||
sysroot = env["ANDROID_NDK_ROOT"] + "/sysroot" | ||
env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include"]) | ||
env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include/" + abi_subpath]) | ||
# For unified headers this define has to be set manually | ||
env.Append(CPPFLAGS=["-D__ANDROID_API__=" + str(int(env['ndk_platform'].split("-")[1]))]) | ||
else: | ||
env.Append(CPPFLAGS=["-isystem", lib_sysroot + "/usr/include"]) | ||
|
||
env.Append(CPPFLAGS='-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -fvisibility=hidden -fno-strict-aliasing'.split()) | ||
env.Append(CPPFLAGS='-DNO_STATVFS -DGLES2_ENABLED'.split()) | ||
|
||
|
@@ -224,7 +241,7 @@ def mySpawn(sh, escape, cmd, args, env): | |
|
||
## Link flags | ||
|
||
env['LINKFLAGS'] = ['-shared', '--sysroot=' + sysroot, '-Wl,--warn-shared-textrel'] | ||
env['LINKFLAGS'] = ['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel'] | ||
if env["android_arch"] == "armv7": | ||
env.Append(LINKFLAGS='-Wl,--fix-cortex-a8'.split()) | ||
env.Append(LINKFLAGS='-Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now'.split()) | ||
|
@@ -248,3 +265,19 @@ def mySpawn(sh, escape, cmd, args, env): | |
if (env["android_arch"] == "armv6" or env["android_arch"] == "armv7"): | ||
env.Append(CFLAGS=["-DOPUS_ARM_OPT"]) | ||
env.opus_fixed_point = "yes" | ||
|
||
# Return NDK version as [<major>,<minor>,<build>] or None if cannot be figured out (adapted from the Chromium project). | ||
def get_ndk_version (path): | ||
if path == None: | ||
return None | ||
prop_file_path = os.path.join(path, "source.properties") | ||
try: | ||
with open(prop_file_path) as prop_file: | ||
for line in prop_file: | ||
key_value = map(lambda x: string.strip(x), line.split("=")) | ||
if key_value[0] == "Pkg.Revision": | ||
version_parts = key_value[1].split("-")[0].split(".") | ||
return map(int, version_parts[0:3]) | ||
except: | ||
print("Could not read source prop file '%s'" % prop_file_path) | ||
return None |
Isn't it misleading that the user input gets overridden? What's the point is then to have it as an option?
Also, this code forces usage of unified headers by default even on older NDK versions that do not support them which breaks compilation there.
My suggestion is to determine
ndk_unified_headers
value strictly from NDK version. If it's old, do not use them, otherwise do use them.