cmake_minimum_required(VERSION 3.22)
project(DoomTouch LANGUAGES C CXX)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

set(SDL_SHARED ON CACHE BOOL "" FORCE)
set(SDL_STATIC OFF CACHE BOOL "" FORCE)
set(SDL_TEST OFF CACHE BOOL "" FORCE)
set(SDL2_DISABLE_INSTALL ON CACHE BOOL "" FORCE)
add_subdirectory(native/SDL EXCLUDE_FROM_ALL)

set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
set(SDL2MIXER_SAMPLES OFF CACHE BOOL "" FORCE)
set(SDL2MIXER_INSTALL OFF CACHE BOOL "" FORCE)
set(SDL2MIXER_VENDORED OFF CACHE BOOL "" FORCE)
foreach(codec FLAC MOD MP3 MIDI OPUS VORBIS WAVPACK)
    set(SDL2MIXER_${codec} OFF CACHE BOOL "" FORCE)
endforeach()
add_subdirectory(native/SDL_mixer EXCLUDE_FROM_ALL)

find_package(Python3 REQUIRED COMPONENTS Interpreter)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
    "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prepare-engine.py"
    "${CMAKE_CURRENT_SOURCE_DIR}/native/patches/android-touch.patch")
set(ENGINE_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/engine-source")
execute_process(
    COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prepare-engine.py"
            "${CMAKE_CURRENT_SOURCE_DIR}/native/chocolate-doom" "${ENGINE_SOURCE}"
            "${CMAKE_CURRENT_SOURCE_DIR}/native/patches/android-touch.patch"
    RESULT_VARIABLE prepare_result
)
if(NOT prepare_result EQUAL 0)
    message(FATAL_ERROR "Preparing Chocolate Doom failed")
endif()

# SDL is built in this project. Small package configs prevent the upstream
# desktop find modules from searching for prebuilt host libraries.
set(SDL2_DIR "${CMAKE_CURRENT_SOURCE_DIR}/native/cmake/SDL2")
set(SDL2_mixer_DIR "${CMAKE_CURRENT_SOURCE_DIR}/native/cmake/SDL2_mixer")
set(ENABLE_SDL2_NET OFF CACHE BOOL "" FORCE)
set(ENABLE_SDL2_MIXER ON CACHE BOOL "" FORCE)
set(CMAKE_DISABLE_FIND_PACKAGE_PNG ON)
set(CMAKE_DISABLE_FIND_PACKAGE_SampleRate ON)
set(CMAKE_DISABLE_FIND_PACKAGE_FluidSynth ON)
add_subdirectory("${ENGINE_SOURCE}" engine EXCLUDE_FROM_ALL)

get_target_property(engine_sources chocolate-doom SOURCES)
set(absolute_sources)
foreach(source IN LISTS engine_sources)
    if(NOT IS_ABSOLUTE "${source}")
        set(source "${ENGINE_SOURCE}/src/${source}")
    endif()
    list(APPEND absolute_sources "${source}")
endforeach()
get_target_property(engine_links chocolate-doom LINK_LIBRARIES)
add_library(main SHARED ${absolute_sources} native/doom_touch.c)
target_include_directories(main PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/engine"
    "${ENGINE_SOURCE}/src" "${ENGINE_SOURCE}/src/doom" "${CMAKE_CURRENT_SOURCE_DIR}/native")
target_include_directories(doom PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/native")
target_compile_definitions(main PRIVATE DISABLE_SDL2NET=1)
target_link_libraries(main PRIVATE ${engine_links} log android m)
set_property(TARGET main PROPERTY C_STANDARD 11)
target_link_options(main PRIVATE "-Wl,-z,max-page-size=16384" "-Wl,-z,defs")
target_link_options(SDL2 PRIVATE "-Wl,-z,max-page-size=16384")
target_link_options(SDL2_mixer PRIVATE "-Wl,-z,max-page-size=16384")
