cmake_minimum_required(VERSION 3.20)
project(AsterXenonAnalysis LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
if(NOT DEFINED XENON_ROOT)
  message(FATAL_ERROR "Pass the reviewed XenonRecomp checkout via XENON_ROOT")
endif()
set(FMT_TEST OFF CACHE BOOL "" FORCE)
set(FMT_DOC OFF CACHE BOOL "" FORCE)
set(FMT_INSTALL OFF CACHE BOOL "" FORCE)
set(XXHASH_BUILD_XXHSUM OFF CACHE BOOL "" FORCE)
add_subdirectory("${XENON_ROOT}" upstream)
# Preserve the decoded image BEFORE upstream swaps descriptors/replaces import thunks.
# Keep the pinned checkout unchanged; generate an instrumented translation unit.
file(READ "${XENON_ROOT}/XenonUtils/xex.cpp" loader)
set(needle "    image.data = std::move(result);")
string(FIND "${loader}" "${needle}" found)
if(found EQUAL -1)
  message(FATAL_ERROR "Upstream export hook changed; review the adapter")
endif()
string(REPLACE "${needle}" "    extern void AsterDecodedImage(const uint8_t*, size_t);\n    AsterDecodedImage(result.get(), imageSize);\n${needle}" loader "${loader}")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/xex_observed.cpp" "${loader}")
get_target_property(sources XenonUtils SOURCES)
list(REMOVE_ITEM sources "xex.cpp")
set_property(TARGET XenonUtils PROPERTY SOURCES "${sources}")
target_sources(XenonUtils PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/xex_observed.cpp" export_sink.cpp)
add_executable(aster-xex-inspect inspect.cpp)
target_link_libraries(aster-xex-inspect PRIVATE XenonUtils)
add_executable(aster-recompile-leaf recompile_leaf.cpp
  "${XENON_ROOT}/XenonRecomp/recompiler.cpp"
  "${XENON_ROOT}/XenonRecomp/recompiler_config.cpp")
target_include_directories(aster-recompile-leaf PRIVATE "${XENON_ROOT}/XenonRecomp")
target_link_libraries(aster-recompile-leaf PRIVATE LibXenonAnalyse XenonUtils fmt::fmt tomlplusplus::tomlplusplus xxHash::xxhash)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  target_compile_options(aster-recompile-leaf PRIVATE -Wno-switch -Wno-unused-variable -Wno-null-arithmetic)
endif()
# The upstream config translation unit intentionally relies on its precompiled header.
target_precompile_headers(aster-recompile-leaf PRIVATE "${XENON_ROOT}/XenonRecomp/pch.h")
