From c803aa2dddb536533cccb25b87528e2c9caccdaf Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov <2536374+asmorkalov@users.noreply.github.com> Date: Tue, 31 Dec 2024 11:53:04 +0300 Subject: [PATCH] Merge pull request #26057 from asmorkalov:as/android_16k_pages Android builds update #26057 Fixes https://github.com/opencv/opencv/issues/26027 Should also address https://github.com/opencv/opencv/issues/26542 Changes: - Switched to Android build tools 34, NDK 26d, target API level 34 (required by Google Play). - Use flexible page size on Android by default to support Android 15+. - Dummy stub for R and BuildConfig classes for javadoc. - Java 17 everywhere. - Strict ndkVersion and ABI list in release package. Related: - Docker: https://github.com/opencv-infrastructure/opencv-gha-dockerfile/pull/41 - Pipeline: https://github.com/opencv/ci-gha-workflow/pull/183 Related IPP issue with NDK 27+: https://github.com/opencv/opencv/issues/26072 Google documentation for 16kb pages support : https://developer.android.com/guide/practices/page-sizes?hl=en ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake --- cmake/OpenCVCompilerOptions.cmake | 8 +++++++ cmake/android/android_gradle_projects.cmake | 22 ++++++++++--------- modules/java/android_sdk/CMakeLists.txt | 6 ++++- .../aar-template/OpenCV/build.gradle.template | 1 + platforms/android/aar-template/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- platforms/android/build_java_shared_aar.py | 17 +++++++++++--- platforms/android/build_sdk.py | 18 +++++++++++++-- platforms/android/build_static_aar.py | 9 +++++--- platforms/android/default.config.py | 6 +++++ samples/android/build.gradle.in | 2 +- .../build.gradle.in | 3 ++- .../jni/CMakeLists.txt | 8 +++++++ .../android/tutorial-4-opencl/build.gradle.in | 2 ++ .../tutorial-4-opencl/jni/CMakeLists.txt | 8 +++++++ 15 files changed, 91 insertions(+), 23 deletions(-) create mode 100644 platforms/android/default.config.py diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index a664e417c3..512e6d1abd 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -404,6 +404,14 @@ if(NOT OPENCV_SKIP_LINK_NO_UNDEFINED) endif() endif() +# For 16k pages support with NDK prior 27 +# Details: https://developer.android.com/guide/practices/page-sizes?hl=en +if(ANDROID AND ANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES AND (ANDROID_ABI STREQUAL arm64-v8a OR ANDROID_ABI STREQUAL x86_64)) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,max-page-size=16384") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,max-page-size=16384") +endif() + # combine all "extra" options if(NOT OPENCV_SKIP_EXTRA_COMPILER_FLAGS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_C_FLAGS}") diff --git a/cmake/android/android_gradle_projects.cmake b/cmake/android/android_gradle_projects.cmake index 4278b10f8d..d8e65a036a 100644 --- a/cmake/android/android_gradle_projects.cmake +++ b/cmake/android/android_gradle_projects.cmake @@ -1,5 +1,5 @@ # https://developer.android.com/studio/releases/gradle-plugin -set(ANDROID_GRADLE_PLUGIN_VERSION "7.3.1" CACHE STRING "Android Gradle Plugin version") +set(ANDROID_GRADLE_PLUGIN_VERSION "8.6.0" CACHE STRING "Android Gradle Plugin version") message(STATUS "Android Gradle Plugin version: ${ANDROID_GRADLE_PLUGIN_VERSION}") set(KOTLIN_PLUGIN_VERSION "1.8.20" CACHE STRING "Kotlin Plugin version") @@ -13,16 +13,16 @@ else() set(KOTLIN_STD_LIB "" CACHE STRING "Kotlin Standard Library dependency") endif() -set(GRADLE_VERSION "7.6.3" CACHE STRING "Gradle version") +set(GRADLE_VERSION "8.11.1" CACHE STRING "Gradle version") message(STATUS "Gradle version: ${GRADLE_VERSION}") -set(ANDROID_COMPILE_SDK_VERSION "31" CACHE STRING "Android compileSdkVersion") +set(ANDROID_COMPILE_SDK_VERSION "34" CACHE STRING "Android compileSdkVersion") if(ANDROID_NATIVE_API_LEVEL GREATER 21) set(ANDROID_MIN_SDK_VERSION "${ANDROID_NATIVE_API_LEVEL}" CACHE STRING "Android minSdkVersion") else() set(ANDROID_MIN_SDK_VERSION "21" CACHE STRING "Android minSdkVersion") endif() -set(ANDROID_TARGET_SDK_VERSION "31" CACHE STRING "Android minSdkVersion") +set(ANDROID_TARGET_SDK_VERSION "34" CACHE STRING "Android targetSdkVersion") set(ANDROID_BUILD_BASE_DIR "${OpenCV_BINARY_DIR}/opencv_android" CACHE INTERNAL "") set(ANDROID_TMP_INSTALL_BASE_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/install/opencv_android") @@ -35,11 +35,11 @@ include '${ANDROID_ABI}' ") set(ANDROID_INSTALL_ABI_FILTER " -//reset() -//include 'armeabi-v7a' -//include 'arm64-v8a' -//include 'x86' -//include 'x86_64' + reset() + include 'armeabi-v7a' + include 'arm64-v8a' + include 'x86' + include 'x86_64' ") if(NOT INSTALL_CREATE_DISTRIB) set(ANDROID_INSTALL_ABI_FILTER "${ANDROID_BUILD_ABI_FILTER}") @@ -54,7 +54,9 @@ set(ANDROID_STRICT_BUILD_CONFIGURATION "true") configure_file("${OpenCV_SOURCE_DIR}/samples/android/build.gradle.in" "${ANDROID_BUILD_BASE_DIR}/build.gradle" @ONLY) set(ANDROID_ABI_FILTER "${ANDROID_INSTALL_ABI_FILTER}") -set(ANDROID_STRICT_BUILD_CONFIGURATION "false") +# CI uses NDK 26d to overcome https://github.com/opencv/opencv/issues/26072 +# It's ahead of default configuration and we have to force version to get non-controversial parts of the package +#set(ANDROID_STRICT_BUILD_CONFIGURATION "false") configure_file("${OpenCV_SOURCE_DIR}/samples/android/build.gradle.in" "${ANDROID_TMP_INSTALL_BASE_DIR}/${ANDROID_INSTALL_SAMPLES_DIR}/build.gradle" @ONLY) install(FILES "${ANDROID_TMP_INSTALL_BASE_DIR}/${ANDROID_INSTALL_SAMPLES_DIR}/build.gradle" DESTINATION "${ANDROID_INSTALL_SAMPLES_DIR}" COMPONENT samples) diff --git a/modules/java/android_sdk/CMakeLists.txt b/modules/java/android_sdk/CMakeLists.txt index a9e6ff52af..42fd08e15b 100644 --- a/modules/java/android_sdk/CMakeLists.txt +++ b/modules/java/android_sdk/CMakeLists.txt @@ -20,6 +20,11 @@ set(SOURSE_SETS_JAVA_SRC_DIRS "'java/src'") set(SOURSE_SETS_RES_SRC_DIRS "'java/res'") set(SOURSE_SETS_MANIFEST_SRC_FILE "'java/AndroidManifest.xml'") set(BUILD_GRADLE_COMPILE_OPTIONS " + android { + buildFeatures { + buildConfig true + } + } compileOptions { sourceCompatibility JavaVersion.VERSION_${ANDROID_GRADLE_JAVA_VERSION_INIT} targetCompatibility JavaVersion.VERSION_${ANDROID_GRADLE_JAVA_VERSION_INIT} @@ -183,7 +188,6 @@ set(SOURSE_SETS_JNI_LIBS_SRC_DIRS "'../../jni'") set(SOURSE_SETS_JAVA_SRC_DIRS "'src'") set(SOURSE_SETS_RES_SRC_DIRS "'${OpenCV_SOURCE_DIR}/modules/java/android_sdk/android_gradle_lib/res'") set(SOURSE_SETS_MANIFEST_SRC_FILE "'AndroidManifest.xml'") -set(BUILD_GRADLE_COMPILE_OPTIONS "") set(MAVEN_PUBLISH_PLUGIN_DECLARATION "") set(BUILD_GRADLE_ANDROID_PUBLISHING_CONFIG "") set(BUILD_GRADLE_PUBLISHING_CONFIG "") diff --git a/platforms/android/aar-template/OpenCV/build.gradle.template b/platforms/android/aar-template/OpenCV/build.gradle.template index b12802063b..192a46877a 100644 --- a/platforms/android/aar-template/OpenCV/build.gradle.template +++ b/platforms/android/aar-template/OpenCV/build.gradle.template @@ -7,6 +7,7 @@ plugins { android { namespace 'org.opencv' compileSdk ${COMPILE_SDK} + ndkVersion "${NDK_VERSION}" defaultConfig { minSdk ${MIN_SDK} diff --git a/platforms/android/aar-template/build.gradle b/platforms/android/aar-template/build.gradle index 280dab5da7..538635ace5 100644 --- a/platforms/android/aar-template/build.gradle +++ b/platforms/android/aar-template/build.gradle @@ -1,5 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.library' version '7.3.0' apply false + id 'com.android.library' version '8.6.0' apply false id 'org.jetbrains.kotlin.android' version '1.8.20' apply false } diff --git a/platforms/android/aar-template/gradle/wrapper/gradle-wrapper.properties b/platforms/android/aar-template/gradle/wrapper/gradle-wrapper.properties index c4f47b9a2e..9300a54eba 100644 --- a/platforms/android/aar-template/gradle/wrapper/gradle-wrapper.properties +++ b/platforms/android/aar-template/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Jul 10 11:57:38 SGT 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/platforms/android/build_java_shared_aar.py b/platforms/android/build_java_shared_aar.py index 8e17a7a4d6..5452ac5d2c 100755 --- a/platforms/android/build_java_shared_aar.py +++ b/platforms/android/build_java_shared_aar.py @@ -47,6 +47,14 @@ def get_opencv_version(opencv_sdk_path): revision = re.search(r'^#define\W+CV_VERSION_REVISION\W+(\d+)$', data, re.MULTILINE).group(1) return "%(major)s.%(minor)s.%(revision)s" % locals() +def get_ndk_version(ndk_path): + props_path = path.join(ndk_path, "source.properties") + with open(props_path, "rt") as f: + data = f.read() + version = re.search(r'Pkg\.Revision\W+=\W+(\d+\.\d+\.\d+)', data).group(1) + return version.strip() + + def get_compiled_aar_path(path1, path2): if path.exists(path1): return path1 @@ -70,6 +78,8 @@ def cleanup(paths_to_remove): def main(args): opencv_version = get_opencv_version(args.opencv_sdk_path) + ndk_version = get_ndk_version(args.ndk_location) + print("Detected ndk_version:", ndk_version) abis = os.listdir(path.join(args.opencv_sdk_path, "sdk/native/libs")) lib_name = "opencv_java" + opencv_version.split(".")[0] final_aar_path = FINAL_AAR_PATH_TEMPLATE.replace("", opencv_version) @@ -90,6 +100,7 @@ def main(args): "LIB_TYPE": "c++_shared", "PACKAGE_NAME": MAVEN_PACKAGE_NAME, "OPENCV_VERSION": opencv_version, + "NDK_VERSION": ndk_version, "COMPILE_SDK": args.android_compile_sdk, "MIN_SDK": args.android_min_sdk, "TARGET_SDK": args.android_target_sdk, @@ -170,10 +181,10 @@ def main(args): if __name__ == "__main__": parser = argparse.ArgumentParser(description="Builds AAR with Java and shared C++ libs from OpenCV SDK") parser.add_argument('opencv_sdk_path') - parser.add_argument('--android_compile_sdk', default="31") + parser.add_argument('--android_compile_sdk', default="34") parser.add_argument('--android_min_sdk', default="21") - parser.add_argument('--android_target_sdk', default="31") - parser.add_argument('--java_version', default="1_8") + parser.add_argument('--android_target_sdk', default="34") + parser.add_argument('--java_version', default="17") parser.add_argument('--ndk_location', default="") parser.add_argument('--cmake_location', default="") parser.add_argument('--offline', action="store_true", help="Force Gradle use offline mode") diff --git a/platforms/android/build_sdk.py b/platforms/android/build_sdk.py index 83f40904d5..3a920c78f1 100755 --- a/platforms/android/build_sdk.py +++ b/platforms/android/build_sdk.py @@ -285,7 +285,10 @@ class Builder: cmd.append(self.opencvdir) execute(cmd) # full parallelism for C++ compilation tasks - execute([self.ninja_path, "opencv_modules"]) + build_targets = ["opencv_modules"] + if do_install: + build_targets.append("opencv_tests") + execute([self.ninja_path, *build_targets]) # limit parallelism for building samples (avoid huge memory consumption) if self.no_samples_build: execute([self.ninja_path, "install" if (self.debug_info or self.debug) else "install/strip"]) @@ -300,6 +303,14 @@ class Builder: classpaths.append(os.path.join(dir, f)) srcdir = os.path.join(self.resultdest, 'sdk', 'java', 'src') dstdir = self.docdest + # HACK: create stubs for auto-generated files to satisfy imports + with open(os.path.join(srcdir, 'org', 'opencv', 'BuildConfig.java'), 'wt') as fs: + fs.write("package org.opencv;\n public class BuildConfig {\n}") + fs.close() + with open(os.path.join(srcdir, 'org', 'opencv', 'R.java'), 'wt') as fs: + fs.write("package org.opencv;\n public class R {\n}") + fs.close() + # synchronize with modules/java/jar/build.xml.in shutil.copy2(os.path.join(SCRIPT_DIR, '../../doc/mymath.js'), dstdir) cmd = [ @@ -327,9 +338,12 @@ class Builder: '-bottom', 'Generated on %s / OpenCV %s' % (time.strftime("%Y-%m-%d %H:%M:%S"), self.opencv_version), "-d", dstdir, "-classpath", ":".join(classpaths), - '-subpackages', 'org.opencv', + '-subpackages', 'org.opencv' ] execute(cmd) + # HACK: remove temporary files needed to satisfy javadoc imports + os.remove(os.path.join(srcdir, 'org', 'opencv', 'BuildConfig.java')) + os.remove(os.path.join(srcdir, 'org', 'opencv', 'R.java')) def gather_results(self): # Copy all files diff --git a/platforms/android/build_static_aar.py b/platforms/android/build_static_aar.py index 56cfbcbc1e..1f817818c3 100755 --- a/platforms/android/build_static_aar.py +++ b/platforms/android/build_static_aar.py @@ -7,7 +7,7 @@ import os import shutil import subprocess -from build_java_shared_aar import cleanup, fill_template, get_compiled_aar_path, get_opencv_version +from build_java_shared_aar import cleanup, fill_template, get_compiled_aar_path, get_opencv_version, get_ndk_version ANDROID_PROJECT_TEMPLATE_DIR = path.join(path.dirname(__file__), "aar-template") @@ -103,6 +103,8 @@ def convert_deps_list_to_prefab(linked_libs, opencv_libs, external_libs): def main(args): opencv_version = get_opencv_version(args.opencv_sdk_path) + ndk_version = get_ndk_version(args.ndk_location) + print("Detected ndk_version:", ndk_version) abis = os.listdir(path.join(args.opencv_sdk_path, "sdk/native/libs")) final_aar_path = FINAL_AAR_PATH_TEMPLATE.replace("", opencv_version) sdk_dir = args.opencv_sdk_path @@ -121,6 +123,7 @@ def main(args): "LIB_TYPE": "c++_static", "PACKAGE_NAME": MAVEN_PACKAGE_NAME, "OPENCV_VERSION": opencv_version, + "NDK_VERSION": ndk_version, "COMPILE_SDK": args.android_compile_sdk, "MIN_SDK": args.android_min_sdk, "TARGET_SDK": args.android_target_sdk, @@ -243,9 +246,9 @@ def main(args): if __name__ == "__main__": parser = argparse.ArgumentParser(description="Builds AAR with static C++ libs from OpenCV SDK") parser.add_argument('opencv_sdk_path') - parser.add_argument('--android_compile_sdk', default="31") + parser.add_argument('--android_compile_sdk', default="34") parser.add_argument('--android_min_sdk', default="21") - parser.add_argument('--android_target_sdk', default="31") + parser.add_argument('--android_target_sdk', default="34") parser.add_argument('--java_version', default="1_8") parser.add_argument('--ndk_location', default="") parser.add_argument('--cmake_location', default="") diff --git a/platforms/android/default.config.py b/platforms/android/default.config.py new file mode 100644 index 0000000000..9c7b9ad0ef --- /dev/null +++ b/platforms/android/default.config.py @@ -0,0 +1,6 @@ +ABIs = [ + ABI("2", "armeabi-v7a", None, 21, cmake_vars=dict(ANDROID_ABI='armeabi-v7a with NEON')), + ABI("3", "arm64-v8a", None, 21, cmake_vars=dict(ANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES='ON')), + ABI("5", "x86_64", None, 21, cmake_vars=dict(ANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES='ON')), + ABI("4", "x86", None, 21), +] diff --git a/samples/android/build.gradle.in b/samples/android/build.gradle.in index d159899132..a06c42187d 100644 --- a/samples/android/build.gradle.in +++ b/samples/android/build.gradle.in @@ -99,7 +99,7 @@ gradle.afterProject { project -> // Android Gradle Plugin (AGP) 3.5+ is required // https://github.com/android/ndk-samples/wiki/Configure-NDK-Path def isNdkVersionSupported = project.android.metaClass.getProperties().find { it.name == 'ndkVersion' } != null - if ((false || opencv_strict_build_configuration) && isNdkVersionSupported) { + if (opencv_strict_build_configuration && isNdkVersionSupported) { gradle.println("Override ndkVersion for the project ${project.name}") project.android { ndkVersion '@ANDROID_NDK_REVISION@' diff --git a/samples/android/tutorial-2-mixedprocessing/build.gradle.in b/samples/android/tutorial-2-mixedprocessing/build.gradle.in index a156f42240..0e8f5b2a9f 100644 --- a/samples/android/tutorial-2-mixedprocessing/build.gradle.in +++ b/samples/android/tutorial-2-mixedprocessing/build.gradle.in @@ -14,10 +14,11 @@ android { cmake { if (gradle.opencv_source == "sdk_path") { arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@", + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", "-DOPENCV_FROM_SDK=TRUE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ - } else { arguments "-DOPENCV_VERSION_MAJOR=@OPENCV_VERSION_MAJOR@", + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", "-DOPENCV_FROM_SDK=FALSE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ } targets "mixed_sample" diff --git a/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt b/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt index 37e9a698bb..fd7b1389d3 100644 --- a/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt +++ b/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt @@ -14,6 +14,14 @@ endif() message(STATUS "ANDROID_ABI=${ANDROID_ABI}") find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS}) +# For 16k pages support with NDK prior 27 +# Details: https://developer.android.com/guide/practices/page-sizes?hl=en +if(ANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES) + if(ANDROID_ABI STREQUAL arm64-v8a OR ANDROID_ABI STREQUAL x86_64) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") + endif() +endif() + file(GLOB srcs *.cpp *.c) file(GLOB hdrs *.hpp *.h) diff --git a/samples/android/tutorial-4-opencl/build.gradle.in b/samples/android/tutorial-4-opencl/build.gradle.in index 8eeb12b17d..8118bd1d19 100644 --- a/samples/android/tutorial-4-opencl/build.gradle.in +++ b/samples/android/tutorial-4-opencl/build.gradle.in @@ -15,11 +15,13 @@ android { if (gradle.opencv_source == "sdk_path") { arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@", "-DOPENCV_FROM_SDK=TRUE", + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", "-DANDROID_OPENCL_SDK=@ANDROID_OPENCL_SDK@" @OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ } else { arguments "-DOPENCV_VERSION_MAJOR=@OPENCV_VERSION_MAJOR@", "-DOPENCV_FROM_SDK=FALSE", + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", "-DANDROID_OPENCL_SDK=@ANDROID_OPENCL_SDK@" @OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ } targets "JNIpart" diff --git a/samples/android/tutorial-4-opencl/jni/CMakeLists.txt b/samples/android/tutorial-4-opencl/jni/CMakeLists.txt index d1a1dcf234..df38f0ac83 100644 --- a/samples/android/tutorial-4-opencl/jni/CMakeLists.txt +++ b/samples/android/tutorial-4-opencl/jni/CMakeLists.txt @@ -18,6 +18,14 @@ find_package(OpenCL QUIET) file(GLOB srcs *.cpp *.c) file(GLOB hdrs *.hpp *.h) +# For 16k pages support with NDK prior 27 +# Details: https://developer.android.com/guide/practices/page-sizes?hl=en +if(ANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES) + if(ANDROID_ABI STREQUAL arm64-v8a OR ANDROID_ABI STREQUAL x86_64) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") + endif() +endif() + include_directories("${CMAKE_CURRENT_LIST_DIR}") add_library(${target} SHARED ${srcs} ${hdrs})