cmake_minimum_required(VERSION 3.20)
if(CMAKE_HOST_APPLE AND NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
  set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Oldest supported macOS release")
endif()
project(piarun LANGUAGES C)
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/pyproject.toml" version_line REGEX "^version = ")
string(REGEX REPLACE "version = \"([^\"]+)\"" "\\1" PRN_VERSION "${version_line}")
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(PRN_DISTRIBUTION "local" CACHE STRING "Artifact channel: local, pypi, github, or another label")
set(PRN_SOURCE_REVISION "uncommitted" CACHE STRING "Source commit embedded in this artifact")
if(NOT PRN_DISTRIBUTION MATCHES "^[a-zA-Z0-9._-]+$" OR NOT PRN_SOURCE_REVISION MATCHES "^[a-zA-Z0-9._-]+$")
  message(FATAL_ERROR "Distribution and revision must be plain identifier strings")
endif()
include(cmake/frontend.cmake)
if(Git_FOUND AND PRN_SOURCE_REVISION STREQUAL "uncommitted")
  execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    OUTPUT_VARIABLE revision OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET TIMEOUT 10 RESULT_VARIABLE git_result)
  if(git_result EQUAL 0)
    set(PRN_SOURCE_REVISION "${revision}")
    execute_process(COMMAND "${GIT_EXECUTABLE}" status --porcelain WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
      OUTPUT_VARIABLE dirty ERROR_QUIET TIMEOUT 10)
    if(dirty)
      string(APPEND PRN_SOURCE_REVISION "-dirty")
    endif()
  endif()
endif()
# CMake honors SOURCE_DATE_EPOCH for reproducible release timestamps.
string(TIMESTAMP PRN_BUILD_DATE "%Y-%m-%dT%H:%M:%SZ" UTC)
configure_file(cmake/build_info.h.in generated/build_info.h @ONLY)
add_executable(piarun src/main.c src/output.c src/commands.c src/compiler.c src/support.c)
target_include_directories(piarun PRIVATE src "${CMAKE_CURRENT_BINARY_DIR}/generated/rs2ir-c" "${CMAKE_CURRENT_BINARY_DIR}/generated")
target_compile_definitions(piarun PRIVATE PRN_EMBEDDED _POSIX_C_SOURCE=200809L)
if(MSVC)
  target_compile_options(piarun PRIVATE /W4 /WX /utf-8 /wd4100 /wd4127 /wd4244 /wd4267)
  target_compile_definitions(piarun PRIVATE _CRT_SECURE_NO_WARNINGS)
else()
  target_compile_options(piarun PRIVATE -Wall -Wextra -Werror)
  target_link_libraries(piarun PRIVATE m)
endif()
if(APPLE)
  target_link_options(piarun PRIVATE -Wl,-fatal_warnings)
endif()
if(WIN32)
  if(MSVC)
    target_sources(piarun PRIVATE src/windows.manifest)
  else()
    enable_language(RC)
    target_sources(piarun PRIVATE src/windows.rc)
  endif()
  # The inherited proof analyzer has large bounded automatic arrays.
  if(MSVC)
    target_link_options(piarun PRIVATE /STACK:16777216)
  else()
    target_link_options(piarun PRIVATE -Wl,--stack,16777216)
  endif()
endif()
if(SKBUILD)
  set(cli_destination "${SKBUILD_SCRIPTS_DIR}")
else()
  set(cli_destination bin)
endif()
install(TARGETS piarun RUNTIME DESTINATION "${cli_destination}")
include(CTest)
if(BUILD_TESTING AND NOT CMAKE_CROSSCOMPILING)
  find_package(Python COMPONENTS Interpreter)
  if(Python_FOUND)
    add_test(NAME cli COMMAND "${Python_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_cli.py" --binary "$<TARGET_FILE:piarun>")
    set_tests_properties(cli PROPERTIES TIMEOUT 180)
  endif()
endif()
