cmake_minimum_required(VERSION 3.15)

project(
  c-libs
  DESCRIPTION "C Libraries for recreational Programming."
  LANGUAGES C ASM)

add_library(c-libs ${CMAKE_CURRENT_SOURCE_DIR}/src/dyn-arr.c
                   ${CMAKE_CURRENT_SOURCE_DIR}/src/string-view.c)
target_include_directories(
  c-libs PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                $<INSTALL_INTERFACE:include>)

add_executable(strings ${CMAKE_CURRENT_SOURCE_DIR}/app/strings.c)
target_link_libraries(strings PRIVATE c-libs)

add_executable(rc ${CMAKE_CURRENT_SOURCE_DIR}/app/rc.c)
target_link_libraries(rc PRIVATE c-libs)

add_executable(nolibc ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.c
                      ${CMAKE_CURRENT_SOURCE_DIR}/app/entry.s)
target_compile_options(
  nolibc PRIVATE -fno-asynchronous-unwind-tables -fno-unwind-tables
                 -fno-stack-protector -ffunction-sections -fdata-sections)
target_link_options(
  nolibc
  PRIVATE
  -nostdlib
  -static
  -T
  ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.ld
  -Wl,--strip-all
  -Wl,--no-dynamic-linker
  -Wl,--gc-sections)

include(CTest)
if(BUILD_TESTING)
  find_package(PkgConfig REQUIRED)
  pkg_check_modules(CRITERION REQUIRED IMPORTED_TARGET GLOBAL criterion)

  add_executable(tests ${CMAKE_CURRENT_SOURCE_DIR}/test/darr.c
                       ${CMAKE_CURRENT_SOURCE_DIR}/test/string-view.c)
  target_link_libraries(tests c-libs PkgConfig::CRITERION)

  add_test(NAME all_tests COMMAND tests)
endif()

# Install Part #################################################################
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

install(
  TARGETS c-libs
  EXPORT c-libs
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/c-libs
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

install(
  EXPORT c-libs
  FILE c-libsTargets.cmake
  NAMESPACE c-libs::
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/c-libs)

configure_package_config_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/c-libsConfig.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/c-libsConfig.cmake
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/c-libs)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/c-libsConfig.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/c-libs)
