cmake_minimum_required(VERSION 3.22.1)
project("com_nativephp_mobile")

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -fvisibility=default")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -fexceptions -frtti -fPIC -fvisibility=default")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")

set(PHP_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../staticLibs/arm64-v8a)
set(PHP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include/php)

add_definitions(
        -DHAVE_CONFIG_H
        -D__ANDROID__
        -DANDROID
        -D_GNU_SOURCE
        -D_LARGEFILE64_SOURCE
        -D_FILE_OFFSET_BITS=64
        -DHAVE_SYS_PARAM_H
        -DHAVE_BUILD_DEFS_H
        -D_REENTRANT
        -DHAVE_BUILTIN_EXPECT
        -DZTS=1
        -DPTHREADS
)

include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        ${CMAKE_CURRENT_SOURCE_DIR}/include/php
        ${CMAKE_CURRENT_SOURCE_DIR}/include/php/main
        ${CMAKE_CURRENT_SOURCE_DIR}/include/php/Zend
        ${CMAKE_CURRENT_SOURCE_DIR}/include/php/TSRM
        ${CMAKE_CURRENT_SOURCE_DIR}/include/php/sapi/embed
        ${CMAKE_CURRENT_SOURCE_DIR}/compat
        ${CMAKE_CURRENT_SOURCE_DIR}
)

# Import static libraries — only those that exist
set(STATIC_DEP_LIBS "")
foreach(LIB z ssl crypto xml2 sqlite3 iconv charset onig zip curl sodium png16 glob_compat compat icui18n icuuc icudata icuio)
    if(EXISTS ${PHP_LIB_DIR}/lib${LIB}.a)
        add_library(${LIB} STATIC IMPORTED)
        set_target_properties(${LIB} PROPERTIES
            IMPORTED_LOCATION ${PHP_LIB_DIR}/lib${LIB}.a
        )
        list(APPEND STATIC_DEP_LIBS ${LIB})
    else()
        message(STATUS "Skipping lib${LIB}.a (not found)")
    endif()
endforeach()

# PHP must exist
if(NOT EXISTS ${PHP_LIB_DIR}/libphp.a)
    message(FATAL_ERROR "libphp.a not found in ${PHP_LIB_DIR}")
endif()
add_library(php STATIC IMPORTED)
set_target_properties(php PROPERTIES
    IMPORTED_LOCATION ${PHP_LIB_DIR}/libphp.a
)

# Single .so output — everything linked in
add_library(php_wrapper SHARED
        PHP.c
        php_bridge.c
        bridge_jni.cpp
        compat/android_compat.cpp
)

# Link libphp.a with --whole-archive to preserve PHP module registration constructors
target_link_libraries(php_wrapper
        # --whole-archive for libphp.a: PHP uses constructor functions for
        # module registration that would be stripped without this
        -Wl,--whole-archive
        php
        -Wl,--no-whole-archive
        # Dependencies wrapped in link group to resolve circular references
        # (e.g. libxml2 <-> libiconv)
        -Wl,--start-group
        ${STATIC_DEP_LIBS}
        -Wl,--end-group
        # System
        android log dl
        # libiconv exports libiconv_open/close/iconv but libxml2 references
        # iconv_open/close/iconv — alias them at link time
        -Wl,--defsym,iconv_open=libiconv_open
        -Wl,--defsym,iconv_close=libiconv_close
        -Wl,--defsym,iconv=libiconv
)

# Conditionally link ICU libraries if they exist
foreach(ICU_NAME icui18n icuuc icudata icuio)
    if(EXISTS ${PHP_LIB_DIR}/lib${ICU_NAME}.a)
        target_link_libraries(php_wrapper ${ICU_NAME})
    endif()
endforeach()

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    add_compile_definitions(DEBUG=1)
    add_compile_options(-g -O0 -fno-limit-debug-info)
endif()
