cmake_minimum_required(VERSION 3.28)
project(WaxTypographyPublicBenchmark CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "^(AppleClang|Clang)$")
    message(FATAL_ERROR "The typography benchmark requires Clang C++, got ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} (${CMAKE_CXX_COMPILER})")
endif()

set(WAX_BENCHMARK_C_COMPILER "" CACHE FILEPATH "Clang-compatible driver used to compile Wax-generated C")
set(WAX_BENCHMARK_C_COMPILER_MODE "clang" CACHE STRING "Wax C compiler invocation mode: clang or zig")
set(WAX_BENCHMARK_TARGET "" CACHE STRING "Explicit compiler target triple where the host requires one")
if(NOT WAX_BENCHMARK_C_COMPILER)
    message(FATAL_ERROR "WAX_BENCHMARK_C_COMPILER is required")
endif()
if(NOT WAX_BENCHMARK_C_COMPILER_MODE MATCHES "^(clang|zig)$")
    message(FATAL_ERROR "WAX_BENCHMARK_C_COMPILER_MODE must be clang or zig")
endif()

set(BENCHMARK_ROOT "${CMAKE_CURRENT_LIST_DIR}/../../../../")
set(GENERATED_DIR "${CMAKE_CURRENT_LIST_DIR}/Generated")
set(HARFBUZZ_SRC "${BENCHMARK_ROOT}/Canvas/Vendor/Harfbuzz/src")
if(WIN32)
    set(WAX_APP_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/CanvasTypography.core-profile.wxapp.dll")
elseif(APPLE)
    set(WAX_APP_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/CanvasTypography.core-profile.wxapp.dylib")
else()
    set(WAX_APP_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/CanvasTypography.core-profile.wxapp.so")
endif()

set(WAX_C_COMMAND "${WAX_BENCHMARK_C_COMPILER}")
if(WAX_BENCHMARK_C_COMPILER_MODE STREQUAL "zig")
    list(APPEND WAX_C_COMMAND cc)
endif()
if(WAX_BENCHMARK_TARGET)
    if(WAX_BENCHMARK_C_COMPILER_MODE STREQUAL "zig")
        list(APPEND WAX_C_COMMAND -target "${WAX_BENCHMARK_TARGET}")
    else()
        list(APPEND WAX_C_COMMAND "--target=${WAX_BENCHMARK_TARGET}")
    endif()
endif()
list(APPEND WAX_C_COMMAND -O2 -std=gnu2x -shared -fPIC -ffreestanding -fno-fast-math -ffp-contract=off "${GENERATED_DIR}/CanvasTypography.c")
if(WIN32)
    set(WAX_RUNTIME_IMPORT_LIBRARY "" CACHE FILEPATH "Import library matching the installed WxRuntime.dll")
    if(NOT WAX_RUNTIME_IMPORT_LIBRARY)
        message(FATAL_ERROR "WAX_RUNTIME_IMPORT_LIBRARY is required on Windows")
    endif()
    list(APPEND WAX_C_COMMAND "${WAX_RUNTIME_IMPORT_LIBRARY}")
elseif(APPLE)
    list(APPEND WAX_C_COMMAND -Wl,-undefined,dynamic_lookup "-Wl,-install_name,@rpath/CanvasTypography.core-profile.wxapp.dylib")
endif()
list(APPEND WAX_C_COMMAND -o "${WAX_APP_LIBRARY}")
add_custom_command(OUTPUT "${WAX_APP_LIBRARY}" COMMAND ${WAX_C_COMMAND} DEPENDS "${GENERATED_DIR}/CanvasTypography.c" VERBATIM)
add_custom_target(wax_typography_app DEPENDS "${WAX_APP_LIBRARY}")
configure_file("${GENERATED_DIR}/App.manifest" "${CMAKE_CURRENT_BINARY_DIR}/App.manifest" COPYONLY)

add_library(wax_hb_benchmark_lib STATIC "${HARFBUZZ_SRC}/harfbuzz.cc")
target_include_directories(wax_hb_benchmark_lib PRIVATE "${HARFBUZZ_SRC}")
target_compile_options(wax_hb_benchmark_lib PRIVATE -O2 -fno-fast-math -ffp-contract=off)
add_executable(typography_public_shape_bench "${BENCHMARK_ROOT}/Tools/TypographyParity/PublicShapeBench.cpp")
add_dependencies(typography_public_shape_bench wax_typography_app)
target_include_directories(typography_public_shape_bench PRIVATE "${GENERATED_DIR}" "${HARFBUZZ_SRC}")
target_compile_options(typography_public_shape_bench PRIVATE -O2)
if(WIN32)
    target_compile_definitions(wax_hb_benchmark_lib PRIVATE NOMINMAX)
    target_compile_definitions(typography_public_shape_bench PRIVATE NOMINMAX)
endif()
target_link_libraries(typography_public_shape_bench PRIVATE wax_hb_benchmark_lib)
