cmake_minimum_required(VERSION 3.20)
project(PolarisUI VERSION 0.1.0 LANGUAGES C CXX)
if(NOT WIN32)
  message(FATAL_ERROR "PolarisUI C++ 0.1.0 currently ships the Windows x64 host/font backend only.")
endif()
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
  message(FATAL_ERROR "PolarisUI C++ currently supports 64-bit builds only.")
endif()
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
add_library(polaris_ui STATIC src/ui.cpp src/windows.cpp src/gpu.c)
add_library(PolarisUI::ui ALIAS polaris_ui)
target_compile_features(polaris_ui PUBLIC cxx_std_17)
set_target_properties(polaris_ui PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED YES)
target_include_directories(polaris_ui PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
target_link_libraries(polaris_ui PUBLIC opengl32 gdi32 user32 imm32 ole32 windowscodecs)
if(MSVC)
  target_compile_options(polaris_ui PRIVATE /W4 /utf-8)
else()
  target_compile_options(polaris_ui PRIVATE -Wall -Wextra -Wno-unused-parameter -Wno-misleading-indentation)
endif()
option(POLARIS_BUILD_EXAMPLES "Build native desktop demos" ON)
option(POLARIS_BUILD_TESTS "Build regression tests" ON)
if(POLARIS_BUILD_EXAMPLES)
  add_executable(polaris_showcase examples/showcase.cpp)
  add_executable(polaris_hello examples/hello.cpp)
  target_link_libraries(polaris_showcase PRIVATE PolarisUI::ui)
  target_link_libraries(polaris_hello PRIVATE PolarisUI::ui)
endif()
if(POLARIS_BUILD_TESTS)
  enable_testing()
  add_executable(polaris_core_test tests/core_test.cpp)
  target_link_libraries(polaris_core_test PRIVATE PolarisUI::ui)
  add_test(NAME core COMMAND polaris_core_test)
  add_executable(polaris_gpu_test tests/gpu_test.cpp)
  target_link_libraries(polaris_gpu_test PRIVATE PolarisUI::ui)
  add_test(NAME native_gpu COMMAND polaris_gpu_test)
  if(POLARIS_BUILD_EXAMPLES)
    add_test(NAME window_smoke COMMAND polaris_showcase --smoke)
  endif()
endif()
install(TARGETS polaris_ui EXPORT PolarisUITargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT PolarisUITargets NAMESPACE PolarisUI:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PolarisUI)
set_target_properties(polaris_ui PROPERTIES EXPORT_NAME ui)
configure_package_config_file(cmake/PolarisUIConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/PolarisUIConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PolarisUI)
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/PolarisUIConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/PolarisUIConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/PolarisUIConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PolarisUI)
install(FILES LICENSE THIRD-PARTY-NOTICES.md README.md DESTINATION ${CMAKE_INSTALL_DATADIR}/PolarisUI)
install(DIRECTORY licenses/ DESTINATION ${CMAKE_INSTALL_DATADIR}/PolarisUI/licenses)
