UNPKG

@shopify/react-native-skia

Version:

High-performance React Native Graphics using Skia

348 lines (301 loc) 11 kB
project(RNSkia) cmake_minimum_required(VERSION 3.4.1) set (CMAKE_VERBOSE_MAKEFILE ON) set (CMAKE_CXX_STANDARD 17) # Import prebuilt SKIA libraries path set (SKIA_LIBS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../libs/android/${ANDROID_ABI}") # Import libskia first so we can check for symbols add_library(skia STATIC IMPORTED) set_property(TARGET skia PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskia.a") # Check if Graphite symbols are available in libskia using nm/objdump set(SK_GRAPHITE_AVAILABLE OFF) if(EXISTS "${SKIA_LIBS_PATH}/libskia.a") # Look for specific Dawn function symbols that indicate Graphite support execute_process( COMMAND nm "${SKIA_LIBS_PATH}/libskia.a" COMMAND grep "dawn::\\|wgpu\\|_ZN4dawn\\|DawnDevice\\|dawn_native" OUTPUT_VARIABLE NM_OUTPUT ERROR_QUIET RESULT_VARIABLE NM_RESULT ) if(NM_RESULT EQUAL 0 AND NOT "${NM_OUTPUT}" STREQUAL "") set(SK_GRAPHITE_AVAILABLE ON) else() # Fallback to objdump if nm doesn't work execute_process( COMMAND objdump -t "${SKIA_LIBS_PATH}/libskia.a" COMMAND grep "dawn::\\|wgpu\\|_ZN4dawn\\|DawnDevice\\|dawn_native" OUTPUT_VARIABLE OBJDUMP_OUTPUT ERROR_QUIET RESULT_VARIABLE OBJDUMP_RESULT ) if(OBJDUMP_RESULT EQUAL 0 AND NOT "${OBJDUMP_OUTPUT}" STREQUAL "") set(SK_GRAPHITE_AVAILABLE ON) endif() endif() endif() if(SK_GRAPHITE_AVAILABLE) set(SK_GRAPHITE ON) message("-- SK_GRAPHITE: ON (Graphite symbols found in libskia)") else() set(SK_GRAPHITE OFF) message("-- SK_GRAPHITE: OFF (Graphite symbols not found in libskia)") endif() set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSK_BUILD_FOR_ANDROID -DSK_IMAGE_READ_PIXELS_DISABLE_LEGACY_API -DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID") set (PACKAGE_NAME "rnskia") set (SKIA_LIB "skia") set (SKIA_SVG_LIB "svg") set (SKIA_SKSHAPER_LIB "skshaper") set (SKIA_SKPARAGRAPH_LIB "skparagraph") set (SKIA_SKUNICODE_CORE_LIB "skunicode_core") set (SKIA_SKUNICODE_ICU_LIB "skunicode_icu") set (SKIA_PATHOPS_LIB "pathops") # Clear some variables unset(LIBRN_DIR CACHE) unset(libfbjni_link_DIRS CACHE) unset(libfbjni_include_DIRS CACHE) set(build_DIR ${CMAKE_SOURCE_DIR}/build) file(GLOB LIBRN_DIR "${PREBUILT_DIR}/${ANDROID_ABI}") file(GLOB libfbjni_link_DIRS "${build_DIR}/fbjni*.aar/jni/${ANDROID_ABI}") file(GLOB libfbjni_include_DIRS "${build_DIR}/fbjni-*-headers.jar/") message("-- ABI : " ${ANDROID_ABI}) message("-- PREBUILT: " ${PREBUILT_DIR}) message("-- BUILD : " ${build_DIR}) message("-- LIBRN : " ${LIBRN_DIR}) link_directories(../libs/android/${ANDROID_ABI}/) if(SK_GRAPHITE) add_definitions(-DSK_GRAPHITE) set(BACKEND_SOURCES #TODO: is this source needed to be added? "${PROJECT_SOURCE_DIR}/../cpp/rnskia/DawnWindowContext.cpp" ) else() add_definitions(-DSK_GL -DSK_GANESH) set(BACKEND_SOURCES "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/OpenGLWindowContext.cpp" "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/GrAHardwareBufferUtils.cpp" ) endif() if(${REACT_NATIVE_VERSION} LESS 66) file( TO_CMAKE_PATH "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp" INCLUDE_JSI_CPP ) endif() add_library( ${PACKAGE_NAME} SHARED "${PROJECT_SOURCE_DIR}/cpp/jni/JniLoad.cpp" "${PROJECT_SOURCE_DIR}/cpp/jni/JniSkiaManager.cpp" "${PROJECT_SOURCE_DIR}/cpp/jni/JniPlatformContext.cpp" "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/gl/Error.cpp" "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp" "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/AHardwareBufferUtils.cpp" "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkAndroidVideo.cpp" "${PROJECT_SOURCE_DIR}/../cpp/jsi/JsiHostObject.cpp" "${PROJECT_SOURCE_DIR}/../cpp/jsi/RuntimeLifecycleMonitor.cpp" "${PROJECT_SOURCE_DIR}/../cpp/jsi/RuntimeAwareCache.cpp" "${PROJECT_SOURCE_DIR}/../cpp/jsi/JsiPromises.cpp" "${PROJECT_SOURCE_DIR}/../cpp/rnskia/RNSkManager.cpp" "${PROJECT_SOURCE_DIR}/../cpp/api/third_party/CSSColorParser.cpp" "${PROJECT_SOURCE_DIR}/../cpp/api/third_party/base64.cpp" ${BACKEND_SOURCES} ) target_include_directories( ${PACKAGE_NAME} PRIVATE "${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker" "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi" "${NODE_MODULES_DIR}/react-native/ReactCommon" "${NODE_MODULES_DIR}/react-native/ReactCommon/react/nativemodule/core" "${NODE_MODULES_DIR}/react-native/ReactCommon/runtimeexecutor" "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/jni" "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni" cpp/jni/include cpp/rnskia-android # Skia headers have to be included with "fully"-qualified paths, # so "include/core/SkRef.h" instead of "SkRef.h", as otherwise # the prefab cannot be shipped. ../cpp/skia ../cpp/dawn/include ../cpp/api ../cpp/jsi ../cpp/rnskia ../cpp/rnskia/values ../cpp/utils ${libfbjni_include_DIRS} ) add_library(svg STATIC IMPORTED) set_property(TARGET svg PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libsvg.a") add_library(skshaper STATIC IMPORTED) set_property(TARGET skshaper PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskshaper.a") add_library(skparagraph STATIC IMPORTED) set_property(TARGET skparagraph PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskparagraph.a") add_library(skunicode_core STATIC IMPORTED) set_property(TARGET skunicode_core PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskunicode_core.a") add_library(skunicode_icu STATIC IMPORTED) set_property(TARGET skunicode_icu PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskunicode_icu.a") add_library(pathops STATIC IMPORTED) set_property(TARGET pathops PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libpathops.a") find_library( LOG_LIB log ) message("-- LOG : " ${LOG_LIB}) if(${REACT_NATIVE_VERSION} GREATER_EQUAL 71) # We need to find packages since from RN 0.71 binaries are prebuilt find_package(fbjni REQUIRED CONFIG) find_package(ReactAndroid REQUIRED CONFIG) endif() unset(JSI_LIB CACHE) if(${REACT_NATIVE_VERSION} LESS 66) # JSI lib didn't exist on RN 0.65 and before. Simply omit it. set (JSI_LIB "") elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71) # RN 0.71 distributes prebuilt binaries. set (JSI_LIB ReactAndroid::jsi) else() # RN 0.66 distributes libjsi.so, can be used instead of compiling jsi.cpp manually. find_library( JSI_LIB jsi PATHS ${LIBRN_DIR} NO_CMAKE_FIND_ROOT_PATH ) endif() message("-- JSI : " ${JSI_LIB}) unset(REACT_LIB CACHE) if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76) # RN 0.76 packs react_nativemodule_core into ReactAndroid::reactnative set (REACT_LIB ReactAndroid::reactnative) elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71) # RN 0.71 distributes prebuilt binaries. set (REACT_LIB ReactAndroid::react_nativemodule_core) else() find_library( REACT_LIB react_nativemodule_core PATHS ${LIBRN_DIR} NO_CMAKE_FIND_ROOT_PATH ) endif() message("-- REACT : " ${REACT_LIB}) unset(FBJNI_LIBRARY CACHE) if(${REACT_NATIVE_VERSION} GREATER_EQUAL 71) # RN 0.71 distributes prebuilt binaries. set (FBJNI_LIBRARY fbjni::fbjni) else() find_library( FBJNI_LIBRARY fbjni PATHS ${libfbjni_link_DIRS} NO_CMAKE_FIND_ROOT_PATH ) endif() message("-- FBJNI : " ${FBJNI_LIBRARY}) unset(REACTNATIVEJNI_LIB CACHE) if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76) # RN 0.76 doesn't have reactnativejni # DO NOTHING, we'll not link these libraries elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71) # RN 0.71 distributes prebuilt binaries. set (REACTNATIVEJNI_LIB "ReactAndroid::reactnativejni") else() find_library( REACTNATIVEJNI_LIB reactnativejni PATHS ${LIBRN_DIR} NO_CMAKE_FIND_ROOT_PATH ) endif() message("-- REACTNATIVEJNI : " ${REACTNATIVEJNI_LIB}) unset(RUNTIMEEXECUTOR_LIB CACHE) if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76) # RN 0.76 doesn't have runtimeexecutor # DO NOTHING, we'll not link these libraries elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71) # RN 0.71 distributes prebuilt binaries. set (RUNTIMEEXECUTOR_LIB "ReactAndroid::runtimeexecutor") else() find_library( RUNTIMEEXECUTOR_LIB runtimeexecutor PATHS ${LIBRN_DIR} NO_CMAKE_FIND_ROOT_PATH ) endif() message("-- RUNTIMEEXECUTOR : " ${RUNTIMEEXECUTOR_LIB}) unset(TURBOMODULES_LIB CACHE) if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76) # RN 0.76 doesn't have turbomodulejsijni # DO NOTHING, we'll not link these libraries elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71) # RN 0.71 distributes prebuilt binaries. set (TURBOMODULES_LIB "ReactAndroid::turbomodulejsijni") else() find_library( TURBOMODULES_LIB turbomodulejsijni PATHS ${LIBRN_DIR} NO_CMAKE_FIND_ROOT_PATH ) endif() message("-- TURBO : " ${TURBOMODULES_LIB}) add_definitions(-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION}) # Link if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76) set(COMMON_LIBS ${LOG_LIB} ${REACT_LIB} ${FBJNI_LIBRARY} ${JSI_LIB} ${SKIA_SVG_LIB} ${SKIA_SKSHAPER_LIB} ${SKIA_SKPARAGRAPH_LIB} ${SKIA_SKUNICODE_CORE_LIB} ${SKIA_SKUNICODE_ICU_LIB} ${SKIA_PATHOPS_LIB} ${SKIA_LIB} -ljnigraphics -lGLESv2 -lEGL -landroid ) else() set(COMMON_LIBS ${LOG_LIB} ${FBJNI_LIBRARY} ${REACT_LIB} ${JSI_LIB} ${REACTNATIVEJNI_LIB} ${RUNTIMEEXECUTOR_LIB} ${TURBOMODULES_LIB} ${SKIA_SVG_LIB} ${SKIA_SKSHAPER_LIB} ${SKIA_SKPARAGRAPH_LIB} ${SKIA_SKUNICODE_CORE_LIB} ${SKIA_SKUNICODE_ICU_LIB} ${SKIA_PATHOPS_LIB} ${SKIA_LIB} -ljnigraphics -lGLESv2 -lEGL -landroid ) endif() if(SK_GRAPHITE) target_link_libraries(${PACKAGE_NAME} ${COMMON_LIBS} ) else() target_link_libraries(${PACKAGE_NAME} ${COMMON_LIBS} -lGLESv2 -lEGL ) endif() # Enable Android 16kb native library alignment if(CMAKE_ANDROID_NDK_VERSION VERSION_LESS "27") target_link_options(${PACKAGE_NAME} PRIVATE "-Wl,-z,max-page-size=16384") endif()