diff --git a/.gitignore b/.gitignore index 0258136..de38527 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,7 @@ coverage/ # Demo build output demo/build/ + +# CMake build directories +build/ +build-*/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..49e2d5a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,109 @@ +cmake_minimum_required(VERSION 3.16) + +project(ikv VERSION 0.1.0 LANGUAGES C) + +include(CMakePackageConfigHelpers) +include(GNUInstallDirs) + +option(IKV_BUILD_DEMOS "Build demo executables" ON) +option(IKV_BUILD_TESTS "Build unit tests" OFF) +option(IKV_INSTALL "Install library and CMake package files" ON) + +set(IKV_PUBLIC_HEADERS + include/ikv.h +) + +set(IKV_SOURCES + src/ikv.c + src/loaders/ikv1.c + src/loaders/ikv2.c +) + +add_library(ikv_obj OBJECT ${IKV_SOURCES}) +target_include_directories(ikv_obj + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +target_compile_features(ikv_obj PUBLIC c_std_99) +set_target_properties(ikv_obj PROPERTIES + POSITION_INDEPENDENT_CODE ON +) + +add_library(ikv STATIC) +add_library(ikv::ikv ALIAS ikv) +target_sources(ikv PRIVATE $) +target_include_directories(ikv + PUBLIC + $ + $ +) +target_compile_features(ikv PUBLIC c_std_99) +set_target_properties(ikv PROPERTIES + OUTPUT_NAME ikv + PUBLIC_HEADER "${IKV_PUBLIC_HEADERS}" +) + +if(IKV_BUILD_DEMOS) + add_executable(ikv_demo demo/main.c) + target_link_libraries(ikv_demo PRIVATE ikv) + + add_executable(ikv_unit_test demo/unit_test.c) + target_link_libraries(ikv_unit_test PRIVATE ikv) +endif() + +if(IKV_BUILD_TESTS) + enable_testing() + + add_executable(ikv_tests + demo/unit_test.c + ${IKV_SOURCES} + ) + target_compile_definitions(ikv_tests PRIVATE IKV_TESTING) + target_include_directories(ikv_tests + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src + ) + target_compile_features(ikv_tests PRIVATE c_std_99) + add_test(NAME ikv_tests COMMAND ikv_tests) +endif() + +if(IKV_INSTALL) + install( + TARGETS ikv + EXPORT ikvTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + + install( + EXPORT ikvTargets + FILE ikvTargets.cmake + NAMESPACE ikv:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ikv + ) + + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/ikvConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) + + configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ikvConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/ikvConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/ikv" + ) + + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/ikvConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/ikvConfigVersion.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ikv + ) +endif() diff --git a/cmake/ikvConfig.cmake.in b/cmake/ikvConfig.cmake.in new file mode 100644 index 0000000..9fd6d06 --- /dev/null +++ b/cmake/ikvConfig.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/ikvTargets.cmake")