cmake_minimum_required(VERSION 3.22)
project(marbleknights_loader C CXX ASM)

set(CMAKE_C_STANDARD 11)
add_compile_options(-Wall -Wno-unused-function -Wno-incompatible-function-pointer-types
                    -Wno-int-conversion -fno-omit-frame-pointer -fvisibility=hidden)

add_library(mkdarwin STATIC
    src/macho_loader.c
    src/macho_unwind.c
    src/darwin_libsystem.c
    src/darwin_cxx.c
    src/darwin_cf.c
    src/trap.S
    src/cxx_runtime.cpp)
target_include_directories(mkdarwin PUBLIC src)
target_link_libraries(mkdarwin PUBLIC log)

add_executable(il2cpp_probe probe/il2cpp_probe.c)
target_link_libraries(il2cpp_probe mkdarwin)
set_target_properties(il2cpp_probe PROPERTIES LINKER_LANGUAGE CXX)

# Proxy libil2cpp.so for the official Unity Android player.
find_package(Python3 REQUIRED COMPONENTS Interpreter)
set(API_STUBS ${CMAKE_CURRENT_BINARY_DIR}/il2cpp_api_stubs.S)
add_custom_command(OUTPUT ${API_STUBS}
    COMMAND Python3::Interpreter -I ${CMAKE_CURRENT_SOURCE_DIR}/../tools/gen_api_stubs.py
            ${CMAKE_CURRENT_SOURCE_DIR}/proxy/il2cpp_api.txt ${API_STUBS}
    DEPENDS proxy/il2cpp_api.txt ../tools/gen_api_stubs.py)
# controller button icons (our own drawings, tools/make_glyphs.py needs Pillow, hence -E)
set(GLYPHS_INC ${CMAKE_CURRENT_BINARY_DIR}/glyphs.inc)
add_custom_command(OUTPUT ${GLYPHS_INC}
    COMMAND Python3::Interpreter -E ${CMAKE_CURRENT_SOURCE_DIR}/../tools/make_glyphs.py ${GLYPHS_INC}
    DEPENDS ../tools/make_glyphs.py)
set_source_files_properties(proxy/gamepad.c PROPERTIES OBJECT_DEPENDS ${GLYPHS_INC})
# Validation harness for the recompiled (PC) build: -DMK_RECOMP_BATCH=ON compiles the generated
# work/recomp/batch.c (tools/a64toc.py --batch; game-derived, never in Git) into the proxy.
option(MK_RECOMP_BATCH "link work/recomp/batch.c" OFF)
set(RECOMP_SOURCES proxy/recomp_rt.c proxy/recomp_rt.S)
if(MK_RECOMP_BATCH)
    set(RECOMP_BATCH ${CMAKE_CURRENT_SOURCE_DIR}/../work/recomp/batch.c)
    set_source_files_properties(${RECOMP_BATCH} PROPERTIES COMPILE_OPTIONS "-O1;-Wno-unused-label;-Wno-parentheses-equality;-Wno-unused-variable"
                                INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/proxy)
    list(APPEND RECOMP_SOURCES ${RECOMP_BATCH})
endif()
add_library(il2cpp SHARED proxy/proxy.c proxy/fmod_audio.c proxy/gamepad.c proxy/haptics.c proxy/tilt.c proxy/gamecenter_net.c
            ${RECOMP_SOURCES} ${API_STUBS})
target_link_libraries(il2cpp mkdarwin aaudio)
target_include_directories(il2cpp PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_options(il2cpp PRIVATE -Wl,--exclude-libs,ALL -Wl,-Bsymbolic)
set_target_properties(il2cpp PROPERTIES LINKER_LANGUAGE CXX)
