|
| 1 | +# ---------------------------------------------------------------------------- |
| 2 | +# Basic Configuration |
| 3 | +# ---------------------------------------------------------------------------- |
| 4 | +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) |
| 5 | + |
| 6 | +PROJECT(cvsba) |
| 7 | +set(PROJECT_VERSION "1.0.0") |
| 8 | +string(REGEX MATCHALL "[0-9]" PROJECT_VERSION_PARTS "${PROJECT_VERSION}") |
| 9 | +list(GET PROJECT_VERSION_PARTS 0 PROJECT_VERSION_MAJOR) |
| 10 | +list(GET PROJECT_VERSION_PARTS 1 PROJECT_VERSION_MINOR) |
| 11 | +list(GET PROJECT_VERSION_PARTS 2 PROJECT_VERSION_PATCH) |
| 12 | +set(PROJECT_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") |
| 13 | + |
| 14 | +#------------------------------------------------------ |
| 15 | +# Build type |
| 16 | +#------------------------------------------------------ |
| 17 | + |
| 18 | +IF(NOT CMAKE_BUILD_TYPE ) |
| 19 | + SET( CMAKE_BUILD_TYPE "Debug" ) |
| 20 | +ENDIF() |
| 21 | + |
| 22 | +#------------------------------------------------------ |
| 23 | +# Lib Names and Dirs |
| 24 | +#------------------------------------------------------ |
| 25 | + |
| 26 | +if(WIN32) |
| 27 | + # Postfix of DLLs: |
| 28 | + SET(PROJECT_DLLVERSION "${PROJECT_VERSION_MAJOR}${PROJECT_VERSION_MINOR}${PROJECT_VERSION_PATCH}") |
| 29 | + SET(RUNTIME_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "Directory for dlls and binaries") |
| 30 | + SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "Directory for binaries") |
| 31 | + SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "Directory for dlls") |
| 32 | +else() |
| 33 | + # Postfix of so's: |
| 34 | + set(PROJECT_DLLVERSION) |
| 35 | + SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_INSTALL_PREFIX}/lib/cmake/ /usr/lib/cmake) |
| 36 | + |
| 37 | +endif() |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +# |
| 42 | +OPTION(BUILD_SHARED_LIBS "Set to OFF to build static libraries" ON) |
| 43 | +OPTION(BUILD_UTILS "Set to OFF to not build utils" ON) |
| 44 | + |
| 45 | +# ---------------------------------------------------------------------------- |
| 46 | +# Find Dependencies |
| 47 | +# ---------------------------------------------------------------------------- |
| 48 | + |
| 49 | +####################### FIND DEPENDENCIES |
| 50 | +find_library(LAPACK_LIB NAMES lapack ) |
| 51 | +IF( ${LAPACK_LIB} STREQUAL "LAPACK_LIB-NOTFOUND") |
| 52 | + message(FATAL_ERROR "lapack library not found") |
| 53 | +ELSE() |
| 54 | + message(STATUS "lapack = ${LAPACK_LIB}") |
| 55 | +ENDIF() |
| 56 | + |
| 57 | +#FIND BLAS |
| 58 | +find_library(BLAS_LIB NAMES blas ) |
| 59 | +IF( ${BLAS_LIB} STREQUAL "BLAS_LIB-NOTFOUND") |
| 60 | + message(FATAL_ERROR "blas library not found") |
| 61 | +ELSE() |
| 62 | + message(STATUS "blas = ${BLAS_LIB}") |
| 63 | +ENDIF() |
| 64 | +#FIND f2c |
| 65 | +find_library(F2C_LIB NAMES f2c ) |
| 66 | +IF(${F2C_LIB} STREQUAL "F2C_LIB-NOTFOUND") |
| 67 | + SET(HAVE_F2C 0) |
| 68 | + find_library(F77_LIB NAMES F77 ) |
| 69 | + find_library(I77_LIB NAMES IF77 ) |
| 70 | + IF( (${F77_LIB} STREQUAL "F77_LIB-NOTFOUND") OR ( ${I77_LIB} STREQUAL "I77_LIB-NOTFOUND")) |
| 71 | + message(FATAL_ERROR "NOT F2C NOR F77/IF77") |
| 72 | + ENDIF() |
| 73 | +ELSE() |
| 74 | + SET(HAVE_F2C 1) |
| 75 | + message(STATUS "f2c = ${F2C_LIB}") |
| 76 | +ENDIF() |
| 77 | + |
| 78 | +#add OpenCV library |
| 79 | +FIND_PACKAGE(OpenCV REQUIRED ) |
| 80 | + |
| 81 | +SET(REQUIRED_LIBRARIES ${BLAS_LIB} ${LAPACK_LIB} ${F2C_LIB} ${OpenCV_LIBS} ) |
| 82 | + |
| 83 | +FIND_PACKAGE(OpenMP) |
| 84 | +if(OPENMP_FOUND) |
| 85 | + message(STATUS "Compiling With openmp support") |
| 86 | + OPTION(ENABLE_OPENMP "Set to OFF to disable OpenMP libraries" ON) |
| 87 | + IF(NOT WIN32) |
| 88 | + SET(REQUIRED_LIBRARIES ${REQUIRED_LIBRARIES} -lgomp) |
| 89 | + ENDIF() |
| 90 | +else() |
| 91 | + message(STATUS "Compiling WithOUT openmp support") |
| 92 | + OPTION(ENABLE_OPENMP "Set to OFF to disable OpenMP libraries" OFF) |
| 93 | +endif() |
| 94 | + |
| 95 | + |
| 96 | + |
| 97 | +# ---------------------------------------------------------------------------- |
| 98 | +# PROJECT CONFIGURATION |
| 99 | +# force some variables that could be defined in the command line to be written to cache |
| 100 | +# ---------------------------------------------------------------------------- |
| 101 | +OPTION(INSTALL_DOC "Set to ON to build/install Documentation" OFF) |
| 102 | +IF (INSTALL_DOC) |
| 103 | + FIND_PACKAGE(Doxygen REQUIRED) |
| 104 | + MESSAGE( STATUS "INSTALL_DOC: ${INSTALL_DOC} ") |
| 105 | + INCLUDE("${PROJECT_SOURCE_DIR}/generateDoc.cmake") |
| 106 | + GENERATE_DOCUMENTATION(${PROJECT_SOURCE_DIR}/dox.in) |
| 107 | +ENDIF() |
| 108 | + |
| 109 | +# ---------------------------------------------------------------------------- |
| 110 | +# Uninstall target, for "make uninstall" |
| 111 | +# ---------------------------------------------------------------------------- |
| 112 | +CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) |
| 113 | +ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") |
| 114 | + |
| 115 | +# ---------------------------------------------------------------------------- |
| 116 | +# create configuration file from .in file (If you use windows take care with paths) |
| 117 | +# ---------------------------------------------------------------------------- |
| 118 | + |
| 119 | +CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/config.cmake.in" "${PROJECT_BINARY_DIR}/Find${PROJECT_NAME}.cmake") |
| 120 | +CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake") |
| 121 | +INSTALL(FILES "${PROJECT_BINARY_DIR}/Find${PROJECT_NAME}.cmake" DESTINATION lib/cmake/ ) |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | + |
| 126 | +# ---------------------------------------------------------------------------- |
| 127 | +# Program Optimization and debug (Extracted from OpenCV) |
| 128 | +# ---------------------------------------------------------------------------- |
| 129 | +set(WARNINGS_ARE_ERRORS OFF CACHE BOOL "Treat warnings as errors") |
| 130 | +set(WHOLE_PROGRAM_OPTIMIZATION OFF CACHE BOOL "Flags for whole program optimization.") |
| 131 | + |
| 132 | +set(EXTRA_C_FLAGS "") |
| 133 | +set(EXTRA_C_FLAGS_RELEASE "") |
| 134 | +set(EXTRA_C_FLAGS_DEBUG "") |
| 135 | +set(EXTRA_EXE_LINKER_FLAGS "") |
| 136 | +set(EXTRA_EXE_LINKER_FLAGS_RELEASE "") |
| 137 | +set(EXTRA_EXE_LINKER_FLAGS_DEBUG "") |
| 138 | + |
| 139 | +IF(CMAKE_COMPILER_IS_GNUCXX OR MINGW) |
| 140 | + set(ENABLE_PROFILING OFF CACHE BOOL "Enable profiling in the GCC compiler (Add flags: -g -pg)") |
| 141 | + set(USE_OMIT_FRAME_POINTER ON CACHE BOOL "Enable -fomit-frame-pointer for GCC") |
| 142 | + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES arm*) # We can use only -O2 because the -O3 causes gcc crash |
| 143 | + set(USE_O2 ON CACHE BOOL "Enable -O2 for GCC") |
| 144 | + set(USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC") |
| 145 | + endif() |
| 146 | + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES powerpc*) |
| 147 | + set(USE_O3 ON CACHE BOOL "Enable -O3 for GCC") |
| 148 | + set(USE_POWERPC ON CACHE BOOL "Enable PowerPC for GCC") |
| 149 | + endif () |
| 150 | + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64* OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES x86_64*) |
| 151 | + set(USE_O3 ON CACHE BOOL "Enable -O3 for GCC") |
| 152 | + set(USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC") |
| 153 | + set(USE_MMX ON CACHE BOOL "Enable MMX for GCC") |
| 154 | + set(USE_SSE ON CACHE BOOL "Enable SSE for GCC") |
| 155 | + set(USE_SSE2 ON CACHE BOOL "Enable SSE2 for GCC") |
| 156 | + set(USE_SSE3 ON CACHE BOOL "Enable SSE3 for GCC") |
| 157 | + endif() |
| 158 | + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES i686* OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES x86) |
| 159 | + set(USE_O3 ON CACHE BOOL "Enable -O3 for GCC") |
| 160 | + set(USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math for GCC") |
| 161 | + set(USE_MMX ON CACHE BOOL "Enable MMX for GCC") |
| 162 | + set(USE_SSE OFF CACHE BOOL "Enable SSE for GCC") |
| 163 | + set(USE_SSE2 OFF CACHE BOOL "Enable SSE2 for GCC") |
| 164 | + set(USE_SSE3 OFF CACHE BOOL "Enable SSE3 for GCC") |
| 165 | + endif () |
| 166 | + |
| 167 | + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wall") |
| 168 | + |
| 169 | + if(WARNINGS_ARE_ERRORS) |
| 170 | + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror") |
| 171 | + endif() |
| 172 | + |
| 173 | + # The -Wno-long-long is required in 64bit systems when including sytem headers. |
| 174 | + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES x86_64* OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64*) |
| 175 | + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-long-long") |
| 176 | + endif() |
| 177 | + |
| 178 | + # Whole program optimization |
| 179 | + if(WHOLE_PROGRAM_OPTIMIZATION) |
| 180 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -fwhole-program --combine") |
| 181 | + endif() |
| 182 | + |
| 183 | + # Other optimizations |
| 184 | + if(USE_OMIT_FRAME_POINTER) |
| 185 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -fomit-frame-pointer") |
| 186 | + endif() |
| 187 | + if(USE_O2) |
| 188 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -O2") |
| 189 | + endif() |
| 190 | + if(USE_O3) |
| 191 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -O3") |
| 192 | + endif() |
| 193 | + if(USE_FAST_MATH) |
| 194 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -ffast-math") |
| 195 | + endif() |
| 196 | + if(USE_POWERPC) |
| 197 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mcpu=G3 -mtune=G5") |
| 198 | + endif() |
| 199 | + if(USE_MMX) |
| 200 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mmmx") |
| 201 | + endif() |
| 202 | + if(USE_SSE) |
| 203 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse") |
| 204 | + endif() |
| 205 | + if(USE_SSE2) |
| 206 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse2") |
| 207 | + endif() |
| 208 | + if(USE_SSE3 AND NOT MINGW) # SSE3 should be disabled under MingW because it generates compiler errors |
| 209 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse3") |
| 210 | + endif() |
| 211 | + |
| 212 | + if(ENABLE_PROFILING) |
| 213 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -pg -g") |
| 214 | + else() |
| 215 | + if(NOT APPLE) |
| 216 | + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -ffunction-sections") |
| 217 | + endif() |
| 218 | + endif() |
| 219 | + |
| 220 | + # Parallel mode |
| 221 | + if(ENABLE_OPENMP) |
| 222 | + add_definitions(-DUSE_OMP) |
| 223 | + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") |
| 224 | + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") |
| 225 | + set(LINKER_LIBS ${LINKER_LIBS} gomp) |
| 226 | + endif() |
| 227 | + IF(${CMAKE_SYSTEM_PROCESSOR} MATCHES armv7l) # In ARM_COrtex8 with neon, enalble vectorized operations |
| 228 | + SET(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=hard -ftree-vectorize ") |
| 229 | + ENDIF() |
| 230 | + |
| 231 | + |
| 232 | + set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -DNDEBUG") |
| 233 | + set(EXTRA_C_FLAGS_DEBUG "-g3 -O0 -DDEBUG -D_DEBUG -W -Wextra -Wno-return-type") |
| 234 | + |
| 235 | + MESSAGE( STATUS "-------------------------------------------------------------------------------" ) |
| 236 | + message( STATUS "GNU COMPILER") |
| 237 | + MESSAGE( STATUS "-------------------------------------------------------------------------------" ) |
| 238 | + |
| 239 | + |
| 240 | + |
| 241 | + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS}") |
| 242 | + SET(CMAKE_CXX_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE}") |
| 243 | + SET(CMAKE_CXX_FLAGS_DEBUG "${EXTRA_C_FLAGS_DEBUG}") |
| 244 | + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EXTRA_EXE_LINKER_FLAGS}") |
| 245 | + SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${EXTRA_EXE_LINKER_FLAGS_RELEASE}") |
| 246 | + SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${EXTRA_EXE_LINKER_FLAGS_DEBUG}") |
| 247 | + |
| 248 | + |
| 249 | +ELSE() # MSVC |
| 250 | + |
| 251 | +if(ENABLE_OPENMP) |
| 252 | + add_definitions( -DUSE_OMP) |
| 253 | + add_definitions( -Dopenmp) |
| 254 | +ENDIF() |
| 255 | + |
| 256 | + |
| 257 | +ENDIF()#END OF COMPILER SPECIFIC OPTIONS |
| 258 | + |
| 259 | + |
| 260 | +# ---------------------------------------------------------------------------- |
| 261 | +# PACKAGE GENERATOR |
| 262 | +# ---------------------------------------------------------------------------- |
| 263 | + |
| 264 | +IF (UNIX) |
| 265 | +SET(CPACK_GENERATOR "DEB") |
| 266 | +SET(CPACK_PACKAGE_CONTACT "rmsalinas@uco.es") |
| 267 | +SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "rmsalinas@uco.es") |
| 268 | +SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "ArUco Library") |
| 269 | +SET(CPACK_PACKAGE_VENDOR "Rafael Munoz-Salinas. AVA Group. University of Cordoba. Spain") |
| 270 | +SET(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) |
| 271 | +SET(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) |
| 272 | +SET(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) |
| 273 | +SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") |
| 274 | +SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) |
| 275 | +SET(CPACK_STRIP_FILES "bin/lib${PROJECT_NAME}") |
| 276 | +SET(CPACK_SOURCE_STRIP_FILES "") |
| 277 | +SET(CPACK_PACKAGING_INSTALL_PREFIX "/usr/") |
| 278 | +IF (CPACK_GENERATOR STREQUAL "DEB") |
| 279 | + SET(CPACK_DEBIAN_PACKAGE_DEPENDS "opencv (>= 2.1.0)") |
| 280 | +ENDIF() |
| 281 | +INCLUDE(CPack) |
| 282 | +ENDIF() |
| 283 | + |
| 284 | +#------------------------------------------------ |
| 285 | +# DIRS |
| 286 | +#------------------------------------------------ |
| 287 | +ADD_SUBDIRECTORY(src) |
| 288 | +ADD_SUBDIRECTORY(utils) |
| 289 | + |
| 290 | + |
| 291 | + |
| 292 | +# ---------------------------------------------------------------------------- |
| 293 | +# display status message for important variables |
| 294 | +# ---------------------------------------------------------------------------- |
| 295 | +message( STATUS ) |
| 296 | +MESSAGE( STATUS "-------------------------------------------------------------------------------" ) |
| 297 | +message( STATUS "General configuration for ${PROJECT_NAME} ${PROJECT_VERSION}") |
| 298 | +MESSAGE( STATUS "-------------------------------------------------------------------------------" ) |
| 299 | +message( STATUS ) |
| 300 | +message(" Built as dynamic libs?:" ${BUILD_SHARED_LIBS}) |
| 301 | +message(" Compiler:" "${CMAKE_COMPILER}" "${CMAKE_CXX_COMPILER}") |
| 302 | +message( STATUS "C++ flags (Release): ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") |
| 303 | +message( STATUS "C++ flags (Debug): ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") |
| 304 | +message( STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") |
| 305 | +message( STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") |
| 306 | + |
| 307 | +MESSAGE( STATUS ) |
| 308 | +MESSAGE( STATUS "CMAKE_SYSTEM_PROCESSOR = ${CMAKE_SYSTEM_PROCESSOR}" ) |
| 309 | +MESSAGE( STATUS "BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}" ) |
| 310 | +MESSAGE( STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}" ) |
| 311 | +MESSAGE( STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}" ) |
| 312 | +MESSAGE( STATUS "CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}" ) |
| 313 | +MESSAGE( STATUS "BUILD_UTILS= ${BUILD_UTILS}" ) |
| 314 | +MESSAGE( STATUS "BUILD_TESTS= ${BUILD_TESTS}" ) |
| 315 | + |
| 316 | + |
| 317 | +MESSAGE( STATUS ) |
| 318 | +MESSAGE( STATUS "--------------------------- Documentation -----------------------------" ) |
| 319 | +MESSAGE( STATUS ) |
| 320 | +MESSAGE( STATUS "INSTALL_DOC = ${INSTALL_DOC}" ) |
| 321 | +MESSAGE( STATUS "USE_LATEX = ${USE_LATEX}" ) |
| 322 | +MESSAGE( STATUS "USE_DOT = ${USE_DOT}" ) |
| 323 | +MESSAGE( STATUS "USE_CHM = ${USE_CHM}" ) |
| 324 | +MESSAGE( STATUS ) |
| 325 | +MESSAGE( STATUS "OpenCV_LIB_DIR=${OpenCV_LIB_DIR}") |
| 326 | +MESSAGE( STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}") |
| 327 | + |
| 328 | +MESSAGE( STATUS ) |
| 329 | +MESSAGE( STATUS ) |
| 330 | +MESSAGE( STATUS "Change a value with: cmake -D<Variable>=<Value>" ) |
| 331 | +MESSAGE( STATUS ) |
0 commit comments