cmake_minimum_required(VERSION 3.14)

project(bsdl
  LANGUAGES C
  VERSION 0.1.0
  DESCRIPTION "Standalone BSDL (IEEE 1149.1) parser — struct + JSON, stable C ABI"
)

# --- top-level detection (PROJECT_IS_TOP_LEVEL needs CMake >= 3.21) ---
if(NOT DEFINED PROJECT_IS_TOP_LEVEL)
  if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
    set(PROJECT_IS_TOP_LEVEL ON)
  else()
    set(PROJECT_IS_TOP_LEVEL OFF)
  endif()
endif()

# This is a dynamic library by nature; build shared unless told otherwise.
if(NOT DEFINED BUILD_SHARED_LIBS)
  set(BUILD_SHARED_LIBS ON)
endif()

option(BSDL_BUILD_CLI   "Build the bsdl2json command-line tool" ON)
option(BSDL_BUILD_TESTS "Build the test suite"                  ${PROJECT_IS_TOP_LEVEL})

# ---------------------------------------------------------------- library ----
add_library(bsdl
  src/bsdl.c
  src/bsdl_parse.c
  src/bsdl_strings.c
  src/bsdl_json.c
)
add_library(bsdl::bsdl ALIAS bsdl)

target_include_directories(bsdl
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
  PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
)

set_target_properties(bsdl PROPERTIES
  C_STANDARD 11
  C_STANDARD_REQUIRED ON
  C_VISIBILITY_PRESET hidden
  VISIBILITY_INLINES_HIDDEN ON
  VERSION   ${PROJECT_VERSION}
  SOVERSION ${PROJECT_VERSION_MAJOR}
  PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/bsdl/bsdl.h
)

# Mark exported symbols (dllexport on Windows; default-visibility on ELF).
if(BUILD_SHARED_LIBS)
  target_compile_definitions(bsdl PRIVATE BSDL_BUILD_SHARED)
endif()

if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
  target_compile_options(bsdl PRIVATE -Wall -Wextra -Wpedantic)
endif()

# -------------------------------------------------------------------- CLI ----
if(BSDL_BUILD_CLI)
  add_executable(bsdl2json tools/bsdl2json.c)
  target_link_libraries(bsdl2json PRIVATE bsdl)
endif()

# ------------------------------------------------------------------ tests ----
if(BSDL_BUILD_TESTS)
  enable_testing()
  add_subdirectory(tests)
endif()

# --------------------------------------------------- install / export -------
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

install(TARGETS bsdl
  EXPORT bsdlTargets
  LIBRARY       DESTINATION ${CMAKE_INSTALL_LIBDIR}
  ARCHIVE       DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME       DESTINATION ${CMAKE_INSTALL_BINDIR}
  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/bsdl
)
if(BSDL_BUILD_CLI)
  install(TARGETS bsdl2json RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()

install(EXPORT bsdlTargets
  FILE      bsdlTargets.cmake
  NAMESPACE bsdl::
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bsdl
)

configure_package_config_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/cmake/bsdlConfig.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/bsdlConfig.cmake
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bsdl
)
write_basic_package_version_file(
  ${CMAKE_CURRENT_BINARY_DIR}/bsdlConfigVersion.cmake
  VERSION       ${PROJECT_VERSION}
  COMPATIBILITY SameMajorVersion
)
install(FILES
  ${CMAKE_CURRENT_BINARY_DIR}/bsdlConfig.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/bsdlConfigVersion.cmake
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bsdl
)
