├── README.md ├── app ├── CMakeLists.txt └── src │ └── main.cpp ├── my_libraries ├── CMakeLists.txt ├── cmake │ └── MyLibrariesConfig.cmake ├── include │ └── my_libraries │ │ └── my_library_a.hpp └── src │ └── my_library_a.cpp └── some_libraries ├── CMakeLists.txt ├── cmake └── SomeLibrariesConfig.cmake ├── include └── some_libraries │ ├── some_library_a.hpp │ └── some_library_b.hpp └── src ├── some_library_a.cpp └── some_library_b.cpp /README.md: -------------------------------------------------------------------------------- 1 | # cmake_tutorial 2 | Simple example of Modern CMake 3 | This contains a sample codes used in Simple Modern CMake tutorial. 4 | 5 | Part1: Short introduction of “Object oriented” Modern CMake 6 | https://levelup.gitconnected.com/simple-modern-cmake-tutorial-b0c1c362cd2c 7 | 8 | 9 | Part2: How to set and request specific package version in CMake 10 | https://medium.com/@koheiotsuka701/simple-modern-cmake-tutorial-part-2-285614d6a0ce 11 | 12 | 13 | 14 | 15 | 16 | FYI, Other posts. 17 | 18 | Advanced C++ Templates Tutorial 19 | https://medium.com/@koheiotsuka701/advanced-c-templates-tutorial-7b54259b2671 20 | 21 | Why Floating-Point Numbers are not Always Accurate 22 | https://levelup.gitconnected.com/why-floating-point-numbers-are-not-always-accurate-9a57e812ace1 23 | 24 | Pitfalls of Templates type deduction in C++ 25 | https://levelup.gitconnected.com/pitfalls-of-templates-type-deduction-in-c-272d66bc75aa 26 | -------------------------------------------------------------------------------- /app/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.5) 2 | 3 | project(MyApplication VERSION 1.0 LANGUAGES CXX) 4 | 5 | add_executable(MyApplication src/main.cpp) 6 | 7 | find_package(MyLibraries REQUIRED) 8 | 9 | target_link_libraries(MyApplication PRIVATE MyLibraries::MyLibraryA) -------------------------------------------------------------------------------- /app/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "my_libraries/my_library_a.hpp" 2 | 3 | int main() { 4 | MyLibraries::MyLibraryA mla; 5 | mla.Function(); 6 | 7 | return 0; 8 | } 9 | -------------------------------------------------------------------------------- /my_libraries/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.5) 2 | project(MyLibraries VERSION 1.0 LANGUAGES CXX) 3 | 4 | find_package(SomeLibraries 1.0 REQUIRED) 5 | 6 | add_library(MyLibraryA src/my_library_a.cpp) 7 | 8 | target_include_directories(MyLibraryA 9 | PUBLIC 10 | $ 11 | $ 12 | ) 13 | 14 | target_link_libraries(MyLibraryA 15 | PUBLIC 16 | SomeLibraries::SomeLibraryA 17 | PRIVATE 18 | SomeLibraries::SomeLibraryB 19 | ) 20 | 21 | install(TARGETS MyLibraryA 22 | EXPORT MyLibraries-export 23 | LIBRARY DESTINATION lib 24 | ARCHIVE DESTINATION lib 25 | ) 26 | 27 | install(EXPORT MyLibraries-export 28 | FILE 29 | MyLibrariesTargets.cmake 30 | NAMESPACE 31 | MyLibraries:: 32 | DESTINATION 33 | lib/cmake/MyLibraries 34 | ) 35 | 36 | install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/my_libraries/my_library_a.hpp 37 | DESTINATION "include/my_libraries") 38 | 39 | install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/MyLibrariesConfig.cmake 40 | DESTINATION "lib/cmake/MyLibraries") 41 | 42 | include(CMakePackageConfigHelpers) 43 | write_basic_package_version_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/MyLibrariesConfigVersion.cmake 44 | VERSION ${PROJECT_VERSION} 45 | COMPATIBILITY SameMajorVersion) 46 | install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/MyLibrariesConfigVersion.cmake 47 | DESTINATION "lib/cmake/MyLibraries") 48 | -------------------------------------------------------------------------------- /my_libraries/cmake/MyLibrariesConfig.cmake: -------------------------------------------------------------------------------- 1 | include(CMakeFindDependencyMacro) 2 | 3 | find_dependency(SomeLibraries REQUIRED) 4 | 5 | include("${CMAKE_CURRENT_LIST_DIR}/MyLibrariesTargets.cmake") 6 | -------------------------------------------------------------------------------- /my_libraries/include/my_libraries/my_library_a.hpp: -------------------------------------------------------------------------------- 1 | #ifndef MYLIBRARIES_INCLUDE_MYLIBRARIES_MY_LIBRARY_A_HPP_ 2 | #define MYLIBRARIES_INCLUDE_MYLIBRARIES_MY_LIBRARY_A_HPP_ 3 | 4 | #include "some_libraries/some_library_a.hpp" 5 | 6 | namespace MyLibraries { 7 | 8 | class MyLibraryA { 9 | public: 10 | void Function(); 11 | 12 | private: 13 | SomeLibraries::SomeLibraryA sla; 14 | }; 15 | 16 | } // namespace MyLibraries 17 | 18 | #endif // MYLIBRARIES_INCLUDE_MYLIBRARIES_MY_LIBRARY_A_HPP_ 19 | -------------------------------------------------------------------------------- /my_libraries/src/my_library_a.cpp: -------------------------------------------------------------------------------- 1 | #include "my_libraries/my_library_a.hpp" 2 | #include "some_libraries/some_library_b.hpp" 3 | 4 | namespace MyLibraries { 5 | 6 | void MyLibraryA::Function() { 7 | SomeLibraries::SomeLibraryB slb; 8 | slb.Function(); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /some_libraries/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.5) 2 | project(SomeLibraries VERSION 1.0 LANGUAGES CXX) 3 | 4 | add_library(SomeLibraryA src/some_library_a.cpp) 5 | 6 | target_include_directories(SomeLibraryA 7 | PUBLIC 8 | $ 9 | $ 10 | ) 11 | 12 | add_library(SomeLibraryB src/some_library_b.cpp) 13 | 14 | target_include_directories(SomeLibraryB 15 | PUBLIC 16 | $ 17 | $ 18 | ) 19 | 20 | 21 | install(TARGETS SomeLibraryA SomeLibraryB 22 | EXPORT SomeLibraries-export 23 | LIBRARY DESTINATION lib 24 | ARCHIVE DESTINATION lib 25 | ) 26 | 27 | install(EXPORT SomeLibraries-export 28 | FILE 29 | SomeLibrariesTargets.cmake 30 | NAMESPACE 31 | SomeLibraries:: 32 | DESTINATION 33 | lib/cmake/SomeLibraries 34 | ) 35 | 36 | install(FILES 37 | ${CMAKE_CURRENT_SOURCE_DIR}/include/some_libraries/some_library_a.hpp 38 | ${CMAKE_CURRENT_SOURCE_DIR}/include/some_libraries/some_library_b.hpp 39 | DESTINATION 40 | "include/some_libraries") 41 | 42 | install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/SomeLibrariesConfig.cmake 43 | DESTINATION "lib/cmake/SomeLibraries") 44 | 45 | include(CMakePackageConfigHelpers) 46 | write_basic_package_version_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SomeLibrariesConfigVersion.cmake 47 | VERSION ${PROJECT_VERSION} 48 | COMPATIBILITY SameMajorVersion) 49 | install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/SomeLibrariesConfigVersion.cmake 50 | DESTINATION "lib/cmake/SomeLibraries") 51 | -------------------------------------------------------------------------------- /some_libraries/cmake/SomeLibrariesConfig.cmake: -------------------------------------------------------------------------------- 1 | include(CMakeFindDependencyMacro) 2 | include("${CMAKE_CURRENT_LIST_DIR}/SomeLibrariesTargets.cmake") 3 | -------------------------------------------------------------------------------- /some_libraries/include/some_libraries/some_library_a.hpp: -------------------------------------------------------------------------------- 1 | #ifndef SOMELIBRARIES_INCLUDE_SOMELIBRARIES_SOME_LIBRARY_A_HPP_ 2 | #define SOMELIBRARIES_INCLUDE_SOMELIBRARIES_SOME_LIBRARY_A_HPP_ 3 | 4 | namespace SomeLibraries { 5 | 6 | class SomeLibraryA { 7 | public: 8 | SomeLibraryA(); 9 | private: 10 | int a; 11 | }; 12 | 13 | } // namespace SomeLibraries 14 | 15 | #endif /* SOMELIBRARIES_INCLUDE_SOMELIBRARIES_SOME_LIBRARY_A_HPP_ */ 16 | -------------------------------------------------------------------------------- /some_libraries/include/some_libraries/some_library_b.hpp: -------------------------------------------------------------------------------- 1 | #ifndef SOMELIBRARIES_INCLUDE_SOMELIBRARIES_SOME_LIBRARY_B_HPP_ 2 | #define SOMELIBRARIES_INCLUDE_SOMELIBRARIES_SOME_LIBRARY_B_HPP_ 3 | 4 | namespace SomeLibraries { 5 | 6 | class SomeLibraryB { 7 | public: 8 | void Function(); 9 | }; 10 | 11 | } // namespace SomeLibraries 12 | 13 | #endif /* SOMELIBRARIES_INCLUDE_SOMELIBRARIES_SOME_LIBRARY_B_HPP_ */ 14 | -------------------------------------------------------------------------------- /some_libraries/src/some_library_a.cpp: -------------------------------------------------------------------------------- 1 | #include "some_libraries/some_library_a.hpp" 2 | 3 | namespace SomeLibraries { 4 | 5 | SomeLibraryA::SomeLibraryA() : a(42) { 6 | } 7 | 8 | } 9 | -------------------------------------------------------------------------------- /some_libraries/src/some_library_b.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "some_libraries/some_library_b.hpp" 3 | 4 | namespace SomeLibraries { 5 | 6 | void SomeLibraryB::Function() { 7 | std::cout << "Hello from SomeLibraryA::Function()" << std::endl; 8 | } 9 | 10 | } 11 | --------------------------------------------------------------------------------