|
| 1 | +cmake_minimum_required (VERSION 3.23) |
| 2 | + |
| 3 | +set (CMAKE_CXX_STANDARD 11) |
| 4 | +set (CMAKE_CXX_STANDARD_REQUIRED true) |
| 5 | + |
| 6 | + |
| 7 | +if (NOT DEFINED PACKAGE_VERSION) |
| 8 | + message ("-- [CMake Project] WARNING: Package version is not defined, set as 0.0.0") |
| 9 | + set (PACKAGE_VERSION "0.0.0") |
| 10 | +endif () |
| 11 | + |
| 12 | +message ("-- [CMake Project] Package version: ${PACKAGE_VERSION}") |
| 13 | + |
| 14 | +project ("CMake Project" |
| 15 | + VERSION ${PACKAGE_VERSION} |
| 16 | + DESCRIPTION "C/C++ 项目的 CMake 模板。" |
| 17 | +) |
| 18 | + |
| 19 | +# write version file |
| 20 | +file (WRITE "${PROJECT_BINARY_DIR}/.version" "${PACKAGE_VERSION}") |
| 21 | + |
| 22 | + |
| 23 | +# configure unit test |
| 24 | +option (WITH_GTEST "Enable unit tests by GoogleTest" OFF) |
| 25 | + |
| 26 | +if (NOT with_gtest) |
| 27 | + unset (WITH_GTEST CACHE) |
| 28 | + |
| 29 | +endif () |
| 30 | + |
| 31 | +if (WITH_GTEST) |
| 32 | + message ("-- [CMake Project] Unit test by GoogleTest is enabled") |
| 33 | + |
| 34 | +else () |
| 35 | + message ("-- [CMake Project] Unit test by GoogleTest is disabled") |
| 36 | + |
| 37 | +endif () |
| 38 | + |
| 39 | +if (WITH_GTEST) |
| 40 | + find_package (GTest REQUIRED) |
| 41 | + |
| 42 | +endif () |
| 43 | + |
| 44 | + |
| 45 | +# configue included headers |
| 46 | +set (DIR_SRC_ROOT "${PROJECT_SOURCE_DIR}/src") |
| 47 | +include_directories (${DIR_SRC_ROOT}) |
| 48 | + |
| 49 | +# configure compiler cross platform |
| 50 | +if (CMAKE_HOST_WIN32) |
| 51 | + include (config-win32.cmake) |
| 52 | + |
| 53 | +elseif (CMAKE_HOST_UNIX) |
| 54 | + include (config-unix.cmake) |
| 55 | + |
| 56 | +else () |
| 57 | + message (FATAL_ERROR "Unknown platform") |
| 58 | + |
| 59 | +endif () |
| 60 | + |
| 61 | + |
| 62 | +# configure output dir of static and shared library |
| 63 | +include (GNUInstallDirs) |
| 64 | + |
| 65 | +set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") |
| 66 | +set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") |
| 67 | +set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") |
| 68 | + |
| 69 | +# configure targets |
| 70 | +aux_source_directory (${DIR_SRC_ROOT} PROJECT_SOURCE_FILES) |
| 71 | +add_library (cmake-project ${PROJECT_SOURCE_FILES}) |
| 72 | + |
| 73 | +unset (CMAKE_ARCHIVE_OUTPUT_DIRECTORY) |
| 74 | +unset (CMAKE_LIBRARY_OUTPUT_DIRECTORY) |
| 75 | +unset (CMAKE_RUNTIME_OUTPUT_DIRECTORY) |
| 76 | + |
| 77 | + |
| 78 | +add_subdirectory ("snippet") |
| 79 | + |
| 80 | + |
| 81 | +if (WITH_GTEST) |
| 82 | + add_subdirectory (test) |
| 83 | + |
| 84 | +endif () |
| 85 | + |
| 86 | + |
| 87 | +# configure install targets |
| 88 | +option (INSTALL_IN_PLACE "Set CMAKE_INSTALL_PREFIX inside PROJECT_BINARY_DIR" ON) |
| 89 | + |
| 90 | +if (INSTALL_IN_PLACE) |
| 91 | + set (CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/install") |
| 92 | + |
| 93 | +endif () |
| 94 | + |
| 95 | +message ("-- [CMake Project] Install destination would be: ${CMAKE_INSTALL_PREFIX}") |
| 96 | + |
| 97 | + |
| 98 | +include (public-headers.cmake) |
| 99 | +set_target_properties (cmake-project PROPERTIES PUBLIC_HEADER ${CMAKE_PROJECT_PUBLIC_HEADERS}) |
| 100 | + |
| 101 | +install (TARGETS cmake-project |
| 102 | + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 103 | + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 104 | + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} |
| 105 | + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} |
| 106 | +) |
| 107 | + |
| 108 | +install (FILES ${PROJECT_BINARY_DIR}/.version DESTINATION .) |
0 commit comments