json-eval-rs 0.0.90

High-performance JSON Logic evaluator with schema validation and dependency tracking. Built on blazing-fast Rust engine.
Documentation
cmake_minimum_required(VERSION 3.9.0)

project(json-eval-rn)

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 17)

# Find React Native
find_package(ReactAndroid REQUIRED CONFIG)

# Pre-built Rust library (bundled with npm package)
# The library is located in src/main/jniLibs/[abi]/libjson_eval_rs.so
set(RUST_PREBUILT_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
set(RUST_LIB_PATH ${RUST_PREBUILT_DIR}/libjson_eval_rs.so)

message(STATUS "Looking for pre-built Rust library at: ${RUST_LIB_PATH}")

# Check if pre-built library exists
if(NOT EXISTS ${RUST_LIB_PATH})
    message(FATAL_ERROR 
        "Pre-built Rust library not found at: ${RUST_LIB_PATH}\n"
        "\nThis package requires pre-built native libraries.\n"
        "If you're developing this package, build the libraries first:\n"
        "  cd ${CMAKE_SOURCE_DIR}/../..\n"
        "  ./build-android.sh all\n"
        "\nIf you're a user and seeing this error, the package may be corrupted.\n"
        "Try reinstalling: npm install @json-eval-rs/react-native\n"
        "\nCurrent ANDROID_ABI: ${ANDROID_ABI}")
endif()

message(STATUS "Using pre-built Rust library: ${RUST_LIB_PATH}")

# Add library search path for the Rust library
link_directories(${RUST_PREBUILT_DIR})

# C++ Bridge files
add_library(
  json_eval_rn
  SHARED
  src/main/cpp/json-eval-rn.cpp
  ../cpp/json-eval-bridge.cpp
)

# Include directories
target_include_directories(
  json_eval_rn
  PRIVATE
  ../cpp
  src/main/cpp
)

# Link libraries
# Note: React Native provides JSI and other libraries at runtime
# We link against them for compilation, but they should not be packaged
target_link_libraries(
  json_eval_rn
  json_eval_rs
  android
  log
  ReactAndroid::jsi
)

if(TARGET ReactAndroid::reactnative)
    message(STATUS "Linking against ReactAndroid::reactnative")
    target_link_libraries(json_eval_rn ReactAndroid::reactnative)
elseif(TARGET ReactAndroid::reactnativejni)
    message(STATUS "Linking against ReactAndroid::reactnativejni")
    target_link_libraries(json_eval_rn ReactAndroid::reactnativejni)
else()
    message(WARNING "Could not find ReactAndroid linkage target. Ensuring JSI is present.")
endif()

# Modern React Native (0.71+) uses prefab which properly handles shared libraries
# The libraries are marked as shared dependencies, not to be packaged in our module
# If you still see duplicate library warnings, ensure your React Native version is up to date

# Android 15 16KB page size support
target_link_options(json_eval_rn PRIVATE -Wl,-z,max-page-size=16384)

# Optimize binary size
set_target_properties(json_eval_rn PROPERTIES
  CXX_VISIBILITY_PRESET hidden
  C_VISIBILITY_PRESET hidden
  VISIBILITY_INLINES_HIDDEN ON
)

# Strip debug symbols in release builds
if(CMAKE_BUILD_TYPE STREQUAL "Release")
  target_link_options(json_eval_rn PRIVATE -Wl,--strip-all)
endif()