diff --git a/CHANGELOG.md b/CHANGELOG.md index b297a7c5a619a28f4883ee23a28c1e0afdddb172..add343fca3c91cf56bd58880a60d0c672ef5cee7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ KleidiAI follows the [Semantic Versioning](https://semver.org/) specification fo ## Upcoming Release +- Add CMake installation and `find_package()` support. + ## v1.5.0 - Extend benchmark tool to support all matrix multiplication micro-kernels. diff --git a/CMakeLists.txt b/CMakeLists.txt index 45c95c397c480c5c45918bacd9016f79295358c4..3d4dbdb47107d5232fcdb93c0a06910b2601da44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,8 @@ set(CMAKE_CXX_EXTENSIONS OFF) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") +include(GNUInstallDirs) + option(KLEIDIAI_BUILD_TESTS "Build unit tests." ON) option(KLEIDIAI_BUILD_BENCHMARK "Build the benchmark tool." OFF) option(KLEIDIAI_ENABLE_CLANG_TIDY "Build with Clang-Tidy checks." OFF) @@ -208,6 +210,8 @@ set(KLEIDIAI_FILES_SME2 ) add_library(kleidiai) +add_library(${PROJECT_NAME}::kleidiai ALIAS kleidiai) + target_sources(kleidiai PRIVATE ${KLEIDIAI_FILES_SCALAR}) # Selectively enable architecture features. @@ -248,8 +252,9 @@ else() set_source_files_properties(${KLEIDIAI_FILES_ASM} PROPERTIES LANGUAGE ASM_MARMASM) endif() -target_include_directories(kleidiai - PUBLIC $ +target_include_directories(kleidiai PUBLIC + $ + $ ) target_compile_options(kleidiai @@ -372,3 +377,48 @@ if(KLEIDIAI_BUILD_BENCHMARK) benchmark::benchmark ) endif() + +install(TARGETS kleidiai + EXPORT ${PROJECT_NAME}Targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" +) + +install(EXPORT ${PROJECT_NAME}Targets + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + NAMESPACE ${PROJECT_NAME}:: +) + +install(DIRECTORY kai + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + FILES_MATCHING + PATTERN *.h +) + +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +set(ConfigContents "@PACKAGE_INIT@\n +include(\"\${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}Targets.cmake\")\n" +) + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in" + "${ConfigContents}" +) + +configure_package_config_file("${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in" + "${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) diff --git a/cmake/FetchGBench.cmake b/cmake/FetchGBench.cmake index 2de00d46ebaaa6d227b6c04e4b324a8a1fb75fb4..9c22a4f3ebd55b9f71b7d14c025b34c28887f949 100644 --- a/cmake/FetchGBench.cmake +++ b/cmake/FetchGBench.cmake @@ -1,5 +1,5 @@ # -# SPDX-FileCopyrightText: Copyright 2024 Arm Limited and/or its affiliates +# SPDX-FileCopyrightText: Copyright 2024-2025 Arm Limited and/or its affiliates # # SPDX-License-Identifier: Apache-2.0 # @@ -15,4 +15,7 @@ fetchcontent_declare(googlebench URL_HASH SHA256=84c49c4c07074f36fbf8b4f182ed7d75191a6fa72756ab4a17848455499f4286 ) +set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "" FORCE) +set(BENCHMARK_INSTALL_DOCS OFF CACHE BOOL "" FORCE) + fetchcontent_makeavailable(googlebench) diff --git a/cmake/FetchGTest.cmake b/cmake/FetchGTest.cmake index 6089594b905f54ca26954912785651de79b62f5f..91ba52f3ef8d4df85521165937abbb849cf81fa8 100644 --- a/cmake/FetchGTest.cmake +++ b/cmake/FetchGTest.cmake @@ -1,5 +1,5 @@ # -# SPDX-FileCopyrightText: Copyright 2024 Arm Limited and/or its affiliates +# SPDX-FileCopyrightText: Copyright 2024-2025 Arm Limited and/or its affiliates # # SPDX-License-Identifier: Apache-2.0 # @@ -16,5 +16,7 @@ fetchcontent_declare(googletest ) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +set(BUILD_GMOCK OFF CACHE BOOL "" FORCE) +set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) fetchcontent_makeavailable(googletest)