# Build utility programs required to build the library.
add_subdirectory(utilities)

set(classes
  string/Token
  string/Manager
  json/Helper
  json/jsonUnits
  grammar/Grammar
  grammar/Functions
  CompatibleUnitOptions
  Conversion
  Converter
  Dimension
  Entity
  Measurement
  Prefix
  PreferredUnits
  System
  Unit
  Visit
)

foreach(class ${classes})
  list(APPEND headers ${class}.h)
  get_filename_component(headerDir "${class}.h" DIRECTORY)
  install(
    FILES "${class}.h"
    DESTINATION "include/units/${units_VERSION}/units/${headerDir}"
  )
  # Accommodate header-only classes.
  if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${class}.cxx")
    list(APPEND sources ${class}.cxx)
  endif()
endforeach()

# Install the generated Version.h header:
install(
  FILES "${CMAKE_CURRENT_BINARY_DIR}/Version.h"
  DESTINATION "include/units/${units_VERSION}/units/${headerDir}"
)

units_encode_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/Data.json"
  DESTINATION "SystemData.h"
  FORMAT "cpp"
  NAME "systemData"
)

add_library(units
  ${sources}
  ${headers}
  "${CMAKE_CURRENT_BINARY_DIR}/SystemData.h"
)
target_link_libraries(units
  PUBLIC nlohmann_json
  PRIVATE Eigen3::Eigen
)
target_include_directories(units
  PUBLIC
    $<BUILD_INTERFACE:${units_SOURCE_DIR}>
    $<BUILD_INTERFACE:${units_BINARY_DIR}>
    $<INSTALL_INTERFACE:include/units/${units_VERSION}>
)
units_install_library(units)

generate_export_header(units EXPORT_FILE_NAME Exports.h)
install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/Exports.h
  DESTINATION include/units/${units_VERSION}/units
)

add_subdirectory(testing)
