diff --git a/.travis.yml b/.travis.yml index c827e42..e6cbb00 100644 --- a/.travis.yml +++ b/.travis.yml @@ -255,6 +255,20 @@ script: # scan-build make ; # fi + # Test package installation + - cd .. + - rm -r build/* + - cmake -H. -Bbuild -DCMAKE_C_STANDARD=99 -DCMAKE_CXX_STANDARD=11 -DCMAKE_INSTALL_PREFIX=`pwd`/install + - cmake --build build --target all + - cmake --build build -- install + - ls `pwd`/install + - cd tests/package_tests + - cmake -H. -B_build -DCMAKE_PREFIX_PATH=../../install -DCMAKE_C_STANDARD=99 -DCMAKE_CXX_STANDARD=11 + - cmake --build _build -- -j3 + - ./_build/app + - rm -rf _build + - cd ../../build + # Build for coveralls (should be the last) - | if [ "${CC}" = 'gcc' ]; then diff --git a/CMakeLists.txt b/CMakeLists.txt index 4103408..a5ba808 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,3 +260,12 @@ list(APPEND ${PROJECT_NAME}_ctests foreach(exe ${${PROJECT_NAME}_ctests}) add_test(NAME ${exe} COMMAND ${exe}) endforeach() + +# ------------------------------------------------------------------------------ +# Exported targets for outer applications. +# ------------------------------------------------------------------------------ +export( + TARGETS fort + FILE ${PROJECT_NAME}-targets.cmake +) + diff --git a/ChangeLog.md b/ChangeLog.md index 992046d..21595de 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -15,6 +15,7 @@ ### Internal - Refactoring of code that uses vectors. +- Add target export in cmake. ### Docs diff --git a/cmake/libfort-config.cmake.in b/cmake/libfort-config.cmake.in new file mode 100644 index 0000000..5e76e5d --- /dev/null +++ b/cmake/libfort-config.cmake.in @@ -0,0 +1,5 @@ +if(NOT TARGET @PROJECT_NAME@::fort) + include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") +endif() + +set(@PROJECT_NAME@_LIBRARIES @PROJECT_NAME@::fort) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index e065284..0ed5b4a 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -6,7 +6,8 @@ add_library(fort target_include_directories(fort PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR} + $ + $ ) set_target_properties(fort @@ -30,14 +31,45 @@ endif() include(GNUInstallDirs) install( - TARGETS - fort + TARGETS fort + EXPORT ${PROJECT_NAME}-targets + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) - -install(FILES fort.h fort.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install( + FILES fort.h fort.hpp + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) configure_file(libfort.pc.in libfort.pc @ONLY) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libfort.pc DESTINATION lib/pkgconfig) +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/libfort.pc + DESTINATION lib/pkgconfig +) + +include(CMakePackageConfigHelpers) +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/${PROJECT_NAME}-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake + COMPATIBILITY SameMajorVersion +) +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) + +install( + EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) + diff --git a/tests/package_tests/1-simple_table.cpp b/tests/package_tests/1-simple_table.cpp new file mode 100644 index 0000000..6cd3cd9 --- /dev/null +++ b/tests/package_tests/1-simple_table.cpp @@ -0,0 +1,16 @@ +#include + +#include "fort.hpp" + + +int main() +{ + fort::char_table table; + table << fort::header + << "N" << "Driver" << "Time" << "Avg Speed" << fort::endr + << "1" << "Ricciardo" << "1:25.945" << "47.362" << fort::endr + << "2" << "Hamilton" << "1:26.373" << "35.02" << fort::endr + << "3" << "Verstappen" << "1:26.469" << "29.78" << fort::endr; + + std::cout << table.to_string() << std::endl; +} diff --git a/tests/package_tests/CMakeLists.txt b/tests/package_tests/CMakeLists.txt new file mode 100644 index 0000000..cc9fd01 --- /dev/null +++ b/tests/package_tests/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.0) + +find_package(libfort) + +# Assert exports of libfort +if (NOT libfort_FOUND) + message(FATAL_ERROR "libfort was not found") +endif() +if (NOT TARGET libfort::fort) + message(FATAL_ERROR "TARGET libfort::fort not found") +endif() +if (NOT DEFINED libfort_LIBRARIES) + message(FATAL_ERROR "libfort_LIBRARIES are not defined") +endif() +if (NOT ${libfort_VERSION} EQUAL "0.4.0") + message(FATAL_ERROR "libfort_VERSION is incorrect") +endif() + +add_executable(app + 1-simple_table.cpp) + +target_link_libraries(app + libfort::fort)