|
1 | | -### |
2 | | -# Set minimum version of CMake. Since command 'project' use |
3 | | -# VERSION sub-option we need at least 3.0. |
4 | | -# Note: If you use 2.6 or 2.4, God kills a kitten. Seriously. |
5 | 1 | cmake_minimum_required(VERSION 3.8) |
6 | 2 |
|
7 | | -# THIS HAS TO COME BEFORE THE PROJECT LINE |
8 | | -#set(CMAKE_C_COMPILER "gcc") |
9 | | -#set(CMAKE_CXX_COMPILER "gcc") |
10 | | - |
11 | | -#### |
12 | | -# Set variables: |
13 | | -# * PROJECT_NAME |
14 | | -# * PROJECT_VERSION |
15 | 3 | project(RTControlDualArm VERSION 2.0.0 LANGUAGES C CXX) |
16 | 4 |
|
17 | | -# Use MACOSX_RPATH by default on OS X. This was added in CMake 2.8.12 and |
18 | | -# became default in CMake 3.0. Explicitly setting this policy is necessary to |
19 | | -# suppress a warning in CMake 3.0 and above. |
20 | | -if(POLICY CMP0042) |
21 | | - cmake_policy(SET CMP0042 NEW) |
22 | | -endif() |
23 | | - |
24 | | -# Simplify variable reference and escape sequence evaluation. This was added in |
25 | | -# CMake 3.1. Explicitly setting this policy is necessary to suppress a warning |
26 | | -# in CMake 3.1 and above. |
27 | | -if(POLICY CMP0053) |
28 | | - cmake_policy(SET CMP0053 NEW) |
29 | | -endif() |
30 | | - |
31 | | -cmake_policy(SET CMP0022 NEW) |
32 | | -if (POLICY CMP0048) |
33 | | - cmake_policy(SET CMP0048 NEW) |
| 5 | +# --------------------------------------------------------------------------- |
| 6 | +# Default build type |
| 7 | +# --------------------------------------------------------------------------- |
| 8 | +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
| 9 | + message(STATUS "Build type not set – defaulting to Release") |
| 10 | + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose: Debug Release RelWithDebInfo Profile" FORCE) |
| 11 | + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo Profile) |
34 | 12 | endif() |
35 | 13 |
|
36 | | -if (POLICY CMP0025) |
37 | | - cmake_policy(SET CMP0025 NEW) |
38 | | -endif() |
39 | | - |
40 | | -include(GNUInstallDirs) |
41 | | -include(CMakePackageConfigHelpers) |
| 14 | +# --------------------------------------------------------------------------- |
| 15 | +# Module path |
| 16 | +# --------------------------------------------------------------------------- |
| 17 | +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) |
42 | 18 | include(FindPkgConfig) |
43 | 19 | include(cmake/CMakeFunctions.cmake) |
44 | 20 |
|
45 | | -set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}) |
| 21 | +# --------------------------------------------------------------------------- |
| 22 | +# Install directories (in-source layout: bin/ lib/ bin/inc/) |
| 23 | +# --------------------------------------------------------------------------- |
| 24 | +set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}) |
46 | 25 | set(PROJ_INSTALL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/bin/inc) |
47 | | -set(PROJ_INSTALL_BIN_DIR ${PROJECT_SOURCE_DIR}/bin) |
48 | | -set(PROJ_INSTALL_LIB_DIR ${PROJECT_SOURCE_DIR}/lib) |
49 | | - |
50 | | -set(CMAKE_DEBUG_POSTFIX "d") |
51 | | -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) |
52 | | - |
53 | | -#=============================================================================== |
54 | | -# Compiler flags |
55 | | -#=============================================================================== |
56 | | -include(CheckCXXCompilerFlag) |
57 | | -check_cxx_compiler_flag(-std=c++17 CXX17_SUPPORT) |
58 | | -if(CXX17_SUPPORT) |
59 | | - set(CMAKE_CXX_STANDARD 17) |
60 | | - set(CMAKE_CXX_STANDARD_REQUIRED ON) |
61 | | - set(CMAKE_CXX_EXTENSIONS OFF) |
62 | | - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") |
63 | | -else() |
64 | | - check_cxx_compiler_flag(-std=c++14 CXX14_SUPPORT) |
65 | | - set(CMAKE_CXX_STANDARD 14) |
66 | | - set(CMAKE_CXX_STANDARD_REQUIRED ON) |
67 | | - set(CMAKE_CXX_EXTENSIONS OFF) |
68 | | - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14" ) |
69 | | -endif() |
70 | | - |
71 | | -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fPIC" ) |
| 26 | +set(PROJ_INSTALL_BIN_DIR ${PROJECT_SOURCE_DIR}/bin) |
| 27 | +set(PROJ_INSTALL_LIB_DIR ${PROJECT_SOURCE_DIR}/lib) |
| 28 | +set(CMAKE_DEBUG_POSTFIX "d") |
| 29 | + |
| 30 | +# --------------------------------------------------------------------------- |
| 31 | +# C++ standard (C++17 required for inline variables, constexpr, structured bindings) |
| 32 | +# --------------------------------------------------------------------------- |
| 33 | +set(CMAKE_CXX_STANDARD 17) |
| 34 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 35 | +set(CMAKE_CXX_EXTENSIONS OFF) |
| 36 | + |
| 37 | +# Minimum compiler check |
72 | 38 | execute_process( |
73 | | - COMMAND ${CMAKE_CXX_COMPILER} -dumpfullversion -dumpversion OUTPUT_VARIABLE GCC_VERSION) |
| 39 | + COMMAND ${CMAKE_CXX_COMPILER} -dumpfullversion -dumpversion |
| 40 | + OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) |
74 | 41 | if(GCC_VERSION VERSION_LESS 5.3.1) |
75 | | - message(FATAL_ERROR "The installed g++ version is ${GCC_VERSION}. ${PROJECT_NAME} requires g++ 5.3.1 or greater.") |
| 42 | + message(FATAL_ERROR |
| 43 | + "g++ ${GCC_VERSION} found; ${PROJECT_NAME} requires g++ >= 5.3.1.") |
76 | 44 | endif() |
77 | 45 |
|
78 | | -set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") |
79 | | -set(CMAKE_CXX_FLAGS_DEBUG "-g -fno-omit-frame-pointer -fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls") |
| 46 | +# --------------------------------------------------------------------------- |
| 47 | +# Compiler flags |
| 48 | +# --------------------------------------------------------------------------- |
| 49 | +# Common flags for all build types |
| 50 | +add_compile_options(-Wall -Wextra -fPIC) |
| 51 | + |
| 52 | +set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG -march=native -funroll-loops") |
| 53 | +set(CMAKE_CXX_FLAGS_DEBUG |
| 54 | + "-g -fno-omit-frame-pointer -fno-inline-functions \ |
| 55 | +-fno-inline-functions-called-once -fno-optimize-sibling-calls") |
80 | 56 | set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_DEBUG}") |
81 | | -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_DEBUG} -pg") |
| 57 | +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_DEBUG} -pg") |
| 58 | + |
| 59 | +# Catch undefined symbols at shared-library link time |
82 | 60 | set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined") |
83 | 61 |
|
84 | | -include_directories(include) |
| 62 | +# --------------------------------------------------------------------------- |
| 63 | +# Find Xenomai early (before targets that use it) |
| 64 | +# --------------------------------------------------------------------------- |
| 65 | +find_package(Xenomai 2.6.0 REQUIRED NATIVE) |
| 66 | +message(STATUS "Xenomai found. Skins: ${Xenomai_SKINS}") |
85 | 67 |
|
| 68 | +# --------------------------------------------------------------------------- |
| 69 | +# Sub-libraries |
| 70 | +# --------------------------------------------------------------------------- |
86 | 71 | add_subdirectory(src/control) |
87 | 72 | add_subdirectory(src/ecat) |
88 | 73 | add_subdirectory(src/kdl) |
89 | 74 | add_subdirectory(src/net) |
90 | 75 |
|
91 | | -add_executable(${PROJECT_NAME} |
92 | | - src/main.cpp |
93 | | -) |
| 76 | +# --------------------------------------------------------------------------- |
| 77 | +# Main executable |
| 78 | +# --------------------------------------------------------------------------- |
| 79 | +add_executable(${PROJECT_NAME} src/main.cpp) |
| 80 | + |
| 81 | +# Project-wide include root (src/ files use #include "ecat/...", "kdl/...", etc.) |
| 82 | +target_include_directories(${PROJECT_NAME} PRIVATE include) |
94 | 83 |
|
95 | | -target_link_libraries(${PROJECT_NAME} |
96 | | - sub::CTRL |
97 | | - sub::ECAT |
98 | | - sub::KDL |
99 | | - sub::NETWORK |
| 84 | +target_link_libraries(${PROJECT_NAME} PRIVATE |
| 85 | + sub::CTRL |
| 86 | + sub::ECAT |
| 87 | + sub::KDL |
| 88 | + sub::NETWORK |
100 | 89 | ) |
101 | 90 |
|
102 | | -find_package(Xenomai 2.6.0 REQUIRED NATIVE) |
103 | | -message(STATUS "Xenomai found with theses skins: ${Xenomai_SKINS}") |
| 91 | +# --------------------------------------------------------------------------- |
| 92 | +# Xenomai integration |
| 93 | +# set_target_properties(COMPILE_FLAGS) in a loop would overwrite on each |
| 94 | +# iteration. Use target_compile_options / target_link_libraries instead. |
| 95 | +# --------------------------------------------------------------------------- |
104 | 96 | if(Xenomai_FOUND) |
105 | | - target_include_directories(${PROJECT_NAME} PUBLIC ${KERNELHEADERS_DIR}) |
106 | | - foreach(comp_lists ${Xenomai_FOUND_COMP}) |
107 | | - #message(STATUS "Xenomai ${comp_lists} includes : ${Xenomai_${comp_lists}_INCLUDE_DIRS}" ) |
108 | | - #message(STATUS "Xenomai ${comp_lists} definitions: ${Xenomai_${comp_lists}_DEFINITIONS}") |
109 | | - #message(STATUS "Xenomai ${comp_lists} LIBRARY_DIRS : ${Xenomai_${comp_lists}_LIBRARY_DIRS} ") |
110 | | - #message(STATUS "Xenomai ${comp_lists} LIBRARIES : ${Xenomai_${comp_lists}_LIBRARIES}") |
111 | | - #message(STATUS "Xenomai ${comp_lists} LDFLAGS : ${Xenomai_${comp_lists}_LDFLAGS}") |
112 | | - #message(STATUS "Xenomai ${comp_lists} DL_FLAGS : ${Xenomai_${comp_lists}_DL_FLAGS}") |
113 | | - |
114 | | - target_include_directories(${PROJECT_NAME} PUBLIC ${Xenomai_${comp_lists}_INCLUDE_DIRS}) |
115 | | - #target_link_libraries(${PROJECT_NAME} ${Xenomai_${comp_lists}_LIBRARY_DIRS} ${Xenomai_${comp_lists}_LIBRARIES}) |
116 | | - target_link_libraries(${PROJECT_NAME} ${Xenomai_${comp_lists}_DL_FLAGS}) |
117 | | - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS ${Xenomai_${comp_lists}_DEFINITIONS}) |
118 | | - endforeach(comp_lists ${Xenomai_SKINS}) |
119 | | -endif(Xenomai_FOUND) |
120 | | - |
121 | | -# check if Doxygen is installed |
122 | | -#find_package(Doxygen) |
123 | | -#if (DOXYGEN_FOUND) |
124 | | -# # set input and output files |
125 | | -# set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/ doc/Doxyfile.in) |
126 | | -# set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) |
127 | | -# |
128 | | -# # request to configure the file |
129 | | -# configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) |
130 | | -# message("Doxygen build started") |
131 | | -# |
132 | | -# # note the option ALL which allows to build the docs together with the application |
133 | | -# add_custom_target( doc_doxygen ALL |
134 | | -# COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} |
135 | | -# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} |
136 | | -# COMMENT "Generating API documentation with Doxygen" |
137 | | -# VERBATIM ) |
138 | | -#else (DOXYGEN_FOUND) |
139 | | -# message("Doxygen need to be installed to generate the doxygen documentation") |
140 | | -#endif (DOXYGEN_FOUND) |
141 | | - |
142 | | -#=============================================================================== |
143 | | -# Print build summary |
144 | | -#=============================================================================== |
145 | | -if(Dualarm_VERBOSE) |
146 | | - message(STATUS "") |
147 | | - message(STATUS "[ Build summary ]") |
148 | | - message(STATUS "CMAKE_GENERATOR : ${CMAKE_GENERATOR}") |
149 | | - message(STATUS "Compiler ID : ${CMAKE_CXX_COMPILER_ID}") |
150 | | - message(STATUS "Compiler version : ${CMAKE_CXX_COMPILER_VERSION}") |
151 | | - message(STATUS "Build type : ${CMAKE_BUILD_TYPE}") |
152 | | - message(STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") |
153 | | - message(STATUS "Install path : ${CMAKE_INSTALL_PREFIX}") |
154 | | - message(STATUS "CXX_FLAGS : ${CMAKE_CXX_FLAGS}") |
155 | | - if(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "RELEASE") |
156 | | - message(STATUS "CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}") |
157 | | - elseif(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "DEBUG") |
158 | | - message(STATUS "CXX_FLAGS_DEBUG : ${CMAKE_CXX_FLAGS_DEBUG}") |
159 | | - elseif(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "RELWITHDEBINFO") |
160 | | - message(STATUS "CXX_FLAGS_RELWITHDEBINFO: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") |
161 | | - elseif(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "PROFILE") |
162 | | - message(STATUS "CXX_FLAGS_PROFILE: ${CMAKE_CXX_FLAGS_PROFILE}") |
163 | | - endif() |
164 | | - message(STATUS "CMAKE_SOURCE_DIR : ${CMAKE_SOURCE_DIR}") |
165 | | - message(STATUS "CMAKE_BINARY_DIR : ${CMAKE_BINARY_DIR}") |
166 | | - message(STATUS "") |
167 | | -endif(Dualarm_VERBOSE) |
| 97 | + target_include_directories(${PROJECT_NAME} PRIVATE ${KERNELHEADERS_DIR}) |
| 98 | + foreach(skin ${Xenomai_FOUND_COMP}) |
| 99 | + target_include_directories(${PROJECT_NAME} PRIVATE |
| 100 | + ${Xenomai_${skin}_INCLUDE_DIRS}) |
| 101 | + target_compile_options(${PROJECT_NAME} PRIVATE |
| 102 | + ${Xenomai_${skin}_DEFINITIONS}) |
| 103 | + # DL_FLAGS are raw linker flags (e.g. -Wl,--wrap=...), not libraries |
| 104 | + target_link_libraries(${PROJECT_NAME} PRIVATE |
| 105 | + ${Xenomai_${skin}_DL_FLAGS}) |
| 106 | + endforeach() |
| 107 | +endif() |
168 | 108 |
|
| 109 | +# --------------------------------------------------------------------------- |
| 110 | +# Install |
| 111 | +# --------------------------------------------------------------------------- |
| 112 | +install(TARGETS ${PROJECT_NAME} |
| 113 | + RUNTIME DESTINATION bin) |
| 114 | + |
| 115 | +# --------------------------------------------------------------------------- |
| 116 | +# Build summary (always shown – useful when diagnosing CI failures) |
| 117 | +# --------------------------------------------------------------------------- |
| 118 | +string(TOUPPER "${CMAKE_BUILD_TYPE}" _BUILD_TYPE_UPPER) |
| 119 | +message(STATUS "") |
| 120 | +message(STATUS "[ ${PROJECT_NAME} ${PROJECT_VERSION} – build summary ]") |
| 121 | +message(STATUS " Generator : ${CMAKE_GENERATOR}") |
| 122 | +message(STATUS " Compiler : ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") |
| 123 | +message(STATUS " C++ std : ${CMAKE_CXX_STANDARD}") |
| 124 | +message(STATUS " Build type : ${CMAKE_BUILD_TYPE}") |
| 125 | +message(STATUS " Install : ${CMAKE_INSTALL_PREFIX}") |
| 126 | +message(STATUS " Flags : ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${_BUILD_TYPE_UPPER}}") |
| 127 | +message(STATUS "") |
0 commit comments