# Generated by uniffi-bindgen-react-native
cmake_minimum_required(VERSION 3.9.0)
project({{ self.config.project.module_cpp() }})

{%- let root = self.project_root() %}
{%- let dir = self.config.project.bindings.cpp_path(root) %}
{%- let bindings_dir = self.relative_to(root, dir) %}
{%- let dir = self.config.project.tm.cpp_path(root) %}
{%- let tm_dir = self.relative_to(root, dir) %}
{%- let is_so_lib = self.config.project.android.use_shared_library %}
{%- let is_static_lib = !is_so_lib %}

set (CMAKE_VERBOSE_MAKEFILE ON)
set (CMAKE_CXX_STANDARD 17)

# Resolve the path to the uniffi-bindgen-react-native package
execute_process(
    COMMAND node -p "require.resolve('uniffi-bindgen-react-native/package.json')"
    OUTPUT_VARIABLE UNIFFI_BINDGEN_PATH
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Get the directory; get_filename_component and cmake_path will normalize
# paths with Windows path separators.
get_filename_component(UNIFFI_BINDGEN_PATH "${UNIFFI_BINDGEN_PATH}" DIRECTORY)

# Specifies a path to native header files.
include_directories(
    {{ tm_dir }}
    {{ bindings_dir }}

    ${UNIFFI_BINDGEN_PATH}/cpp/includes
)

add_library({{ self.config.project.cpp_filename() }}            SHARED
    {{ tm_dir }}/{{ self.config.project.cpp_filename() }}.cpp
    {%- for m in self.config.modules %}
    {{ bindings_dir }}/{{ m.cpp_filename() }}
    {%- endfor %}
    cpp-adapter.cpp
)

# Set C++ compiler flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")

# Set linker flags for 16KB page size alignment (required for Android 15+)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")

{%- let dir = self.config.project.android.jni_libs(root) %}
{%- let jni_libs_dir = self.relative_to(root, dir) %}

cmake_path(
  SET MY_RUST_LIB
  ${CMAKE_SOURCE_DIR}/{{ jni_libs_dir }}/${ANDROID_ABI}/{{ self.config.rust_crate.library_file(Some("android"), Some(*self.config.project.android.use_shared_library)) }}
  NORMALIZE
)

{%- if is_static_lib %}
add_library(my_rust_lib STATIC IMPORTED)
set_target_properties(my_rust_lib PROPERTIES IMPORTED_LOCATION ${MY_RUST_LIB})
{%- endif %}
{%- if is_so_lib %}
add_library(my_rust_lib SHARED IMPORTED)
set_target_properties(my_rust_lib PROPERTIES IMPORTED_LOCATION ${MY_RUST_LIB} IMPORTED_NO_SONAME ON)
{%- endif %}

# Add ReactAndroid libraries, being careful to account for different versions.
find_package(ReactAndroid REQUIRED CONFIG)
find_library(LOGCAT log)

# REACTNATIVE_MERGED_SO seems to be only be set in a build.gradle.kt file,
# which we don't use. Thus falling back to version number sniffing.
if (ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
  set(REACTNATIVE_MERGED_SO true)
endif()

# https://github.com/react-native-community/discussions-and-proposals/discussions/816
# This if-then-else can be removed once this library does not support version below 0.76
if (REACTNATIVE_MERGED_SO)
  target_link_libraries({{ self.config.project.cpp_filename() }} ReactAndroid::reactnative)
else()
  target_link_libraries({{ self.config.project.cpp_filename() }}
    ReactAndroid::turbomodulejsijni
    ReactAndroid::react_nativemodule_core
  )
endif()

find_package(fbjni REQUIRED CONFIG)
target_link_libraries(
  {{ self.config.project.cpp_filename() }}
  fbjni::fbjni
  ReactAndroid::jsi
  ${LOGCAT}
  my_rust_lib
)
{# space #}
