diff options
| author | ruki <[email protected]> | 2021-03-17 23:44:21 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-03-17 23:44:21 +0800 |
| commit | f9da46c4728ed172298fba54f8e2d6d1778ec9b3 (patch) | |
| tree | 2c807dc53e5f48ac16dcca2af354822c9981da71 /xmake/modules/detect | |
| parent | 9cee4eb02ae2b45f83045a50d0b46df8a04cd1fe (diff) | |
support ndk >= r22
Diffstat (limited to 'xmake/modules/detect')
| -rw-r--r-- | xmake/modules/detect/sdks/find_ndk.lua | 88 |
1 files changed, 75 insertions, 13 deletions
diff --git a/xmake/modules/detect/sdks/find_ndk.lua b/xmake/modules/detect/sdks/find_ndk.lua index 996b63e8c..bc07f6081 100644 --- a/xmake/modules/detect/sdks/find_ndk.lua +++ b/xmake/modules/detect/sdks/find_ndk.lua @@ -25,6 +25,24 @@ import("core.project.config") import("core.cache.detectcache") import("lib.detect.find_directory") +-- get triple +function _get_triple(arch) + local triples = + { + ["armv5te"] = "arm-linux-androideabi" -- deprecated + , ["armv7-a"] = "arm-linux-androideabi" -- deprecated + , ["armeabi"] = "arm-linux-androideabi" -- removed in ndk r17 + , ["armeabi-v7a"] = "arm-linux-androideabi" + , ["arm64-v8a"] = "aarch64-linux-android" + , i386 = "i686-linux-android" -- deprecated + , x86 = "i686-linux-android" + , x86_64 = "x86_64-linux-android" + , mips = "mips-linux-android" -- removed in ndk r17 + , mips64 = "mips64-linux-android" -- removed in ndk r17 + } + return triples[arch] +end + -- find ndk directory function _find_ndkdir(sdkdir) @@ -46,7 +64,7 @@ function _find_ndkdir(sdkdir) end -- find the sdk version of ndk -function _find_ndk_sdkver(sdkdir, bindir, arch) +function _find_ndk_sdkver(sdkdir, bindir, sysroot, arch) -- uses llvm stl? local use_llvm = false @@ -60,18 +78,32 @@ function _find_ndk_sdkver(sdkdir, bindir, arch) use_llvm = true end + -- get triple + local triple = _get_triple(arch) + -- try to select the best compatible version local sdkver = "16" if use_llvm or arch == "arm64-v8a" then sdkver = "21" end + if sysroot then + if os.isdir(path.join(sysroot, "usr", "lib", triple, sdkver)) then + return sdkver + end + end if os.isdir(path.join(sdkdir, "platforms", "android-" .. sdkver)) then return sdkver end -- find the max version local sdkver_max = 0 - for _, sdkdir in ipairs(os.dirs(path.join(sdkdir, "platforms", "android-*"))) do + local sdkver_dir_pattern + if sysroot and os.isdir(path.join(sysroot, "usr", "lib")) then + sdkver_dir_pattern = path.join(sysroot, "usr", "lib", triple, "*") + else + sdkver_dir_pattern = path.join(sdkdir, "platforms", "android-*") + end + for _, sdkdir in ipairs(os.dirs(sdkver_dir_pattern)) do -- get version local filename = path.filename(sdkdir) @@ -95,6 +127,25 @@ function _find_ndk_toolchains_ver(bindir) return bindir:match("%-(%d*%.%d*)[/\\]") end +-- find sysroot directory +function _find_ndk_sysroot(sdkdir) + + -- get sysroot above ndk r22 + -- @see https://github.com/android/ndk/wiki/Changelog-r22 + local prebuilt = (is_host("macosx") and "darwin" or os.host()) .. "-x86_64" + local sysroot_r22 = path.join(sdkdir, "toolchains", "llvm", "prebuilt", prebuilt, "sysroot") + if os.isdir(sysroot_r22) then + return sysroot_r22 + end + + -- get sysroot above ndk r14 + -- @see https://android.googlesource.com/platform/ndk/+/master/docs/UnifiedHeaders.md + local sysroot_r14 = path.join(sdkdir, "sysroot") + if os.isdir(sysroot_r14) then + return sysroot_r14 + end +end + -- find the ndk toolchain function _find_ndk(sdkdir, arch, ndk_sdkver, ndk_toolchains_ver) @@ -145,9 +196,6 @@ function _find_ndk(sdkdir, arch, ndk_sdkver, ndk_toolchains_ver) return end - -- find the sdk version - local sdkver = ndk_sdkver or _find_ndk_sdkver(sdkdir, bindir, arch) - -- find the gcc toolchain local gcc_toolchain = find_directory("bin", path.join(sdkdir, "toolchains", gcc_toolchain_subdir, "prebuilt", "*")) if gcc_toolchain then @@ -157,21 +205,35 @@ function _find_ndk(sdkdir, arch, ndk_sdkver, ndk_toolchains_ver) -- find the toolchains version local toolchains_ver = ndk_toolchains_ver or _find_ndk_toolchains_ver(gcc_toolchain or bindir) + -- find sysroot directory + local sysroot = _find_ndk_sysroot(sdkdir) + + -- find the sdk version + local sdkver = ndk_sdkver or _find_ndk_sdkver(sdkdir, bindir, sysroot, arch) + -- get ndk version, e.g. r16b, .. local ndkver = nil - local ndk_version_header = path.join(sdkdir, "sysroot/usr/include/android/ndk-version.h") - if os.isfile(ndk_version_header) then - local ndk_version_info = io.readfile(ndk_version_header) - if ndk_version_info then - ndk_version_info = ndk_version_info:match("#define __NDK_MAJOR__ (%d+)") + if sysroot then + local ndk_version_header = path.join(sysroot, "usr/include/android/ndk-version.h") + if os.isfile(ndk_version_header) then + local ndk_version_info = io.readfile(ndk_version_header) if ndk_version_info then - ndkver = tonumber(ndk_version_info) + ndk_version_info = ndk_version_info:match("#define __NDK_MAJOR__ (%d+)") + if ndk_version_info then + ndkver = tonumber(ndk_version_info) + end end end end - -- ok? - return {ndkver = ndkver, sdkdir = sdkdir, bindir = bindir, cross = cross, sdkver = sdkver, gcc_toolchain = gcc_toolchain, toolchains_ver = toolchains_ver} + return {ndkver = ndkver, + sdkdir = sdkdir, + bindir = bindir, + cross = cross, + sdkver = sdkver, + gcc_toolchain = gcc_toolchain, + toolchains_ver = toolchains_ver, + sysroot = sysroot} end -- find ndk toolchains |
