|
|
(15 intermediate revisions by 3 users not shown) |
Line 1: |
Line 1: |
| Welcome to the CMake Wiki Examples! These short snippets which show you how to perform many common CMake procedures. Please see [http://www.cmake.org/cmake/help/cmake-2-8-docs.html] for the verbose documentation.
| | {{CMake/Template/Moved}} |
|
| |
|
| Please add examples as you find common procedures which are not explained here!
| | This page has moved [https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Examples here]. |
| | |
| ==Basics==
| |
| | |
| ===Set a CMake variable===
| |
| <source lang="cmake">
| |
| SET(VARIABLE VALUE)
| |
| </source>
| |
| | |
| ===View a CMake variable===
| |
| <source lang="cmake">
| |
| MESSAGE("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
| |
| </source>
| |
| | |
| ===View a system variable===
| |
| <source lang="cmake">
| |
| MESSAGE("$ENV{PATH}")
| |
| </source>
| |
| | |
| ===Check operating system===
| |
| <source lang="cmake">
| |
| IF(WIN32)
| |
| ...do something...
| |
| ELSE(WIN32)
| |
| ...do something else...
| |
| ENDIF(WIN32)
| |
| </source>
| |
| | |
| ===Check operating system===
| |
| <source lang="cmake">
| |
| IF(CMAKE_SYSTEM_NAME STREQUAL Linux)
| |
| </source>
| |
| | |
| ==Outputs==
| |
| ===Message===
| |
| <source lang="cmake">
| |
| MESSAGE("Hello world")
| |
| </source>
| |
| | |
| ===Error===
| |
| <source lang="cmake">
| |
| MESSAGE(FATAL_ERROR "An error occured.")
| |
| </source>
| |
| | |
| ==Conditional Statement (if)==
| |
| There are two allowable syntaxes:
| |
| | |
| <source lang="cmake">
| |
| if(something)
| |
| do something
| |
| else(something) # the argument must match the if(...)
| |
| do something else
| |
| endif(something) # the argument must match the if(...)
| |
| </source>
| |
| | |
| The following is also allowed. It is easier to read (because "else(the same thing)" doesn't really make sense if you read it like c++, for example), but it is also easier to confuse yourself with nested ifs.
| |
| <source lang="cmake">
| |
| if(something)
| |
| do something
| |
| else()
| |
| do something else
| |
| endif()
| |
| </source>
| |
| | |
| ==Logical Operators==
| |
| These operators work exactly as you would expect.
| |
| | |
| ===AND===
| |
| if(A AND B)
| |
| | |
| ===OR===
| |
| if(A OR B)
| |
| | |
| ===NOT===
| |
| if(NOT A)
| |
| | |
| ===Compound===
| |
| if(NOT(A AND B))
| |
| | |
| ==Finding Packages==
| |
| Most of the time large packages will have their Find[PackageName].cmake file included in the cmake distribution. If that is the case, all you must do it:
| |
| | |
| FIND_PACKAGE(Eigen3)
| |
| | |
| ===Checking if a package was found===
| |
| Most of the time the [PackageName]_FOUND variable is defined. You can use it like this:
| |
| FIND_PACKAGE(Eigen3)
| |
| if(EIGEN3_FOUND)
| |
| ... do something ...
| |
| endif(EIGEN3_FOUND)
| |
| | |
| ===Suppress warnings===
| |
| Sometimes you may want to optionally include a package. You can suppress the warning about the package not being found with:
| |
| FIND_PACKAGE(Eigen3 QUIET)
| |
| | |
| ==Fix Mininum Version Error/Warning==
| |
| <source lang="cmake">
| |
| cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
| |
| </source>
| |
| | |
| | |
| ==Look in the directory that the CMakeLists.txt file is for header and implementation files==
| |
| <source lang="cmake">
| |
| INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
| |
| </source>
| |
| | |
| or
| |
| | |
| <source lang="cmake">
| |
| INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
| |
| </source>
| |
| | |
| ==Set Link Directories==
| |
| If a library you are using does not have a [LibraryName].cmake, you can do
| |
| <source lang="cmake">
| |
| find_library(OPENSSL_LIB ssl $ENV{OPENSSL_LIB_PATH})
| |
| </source>
| |
| This will check the environment for a variable named OPENSSL_LIB_PATH. If it exists, you can then use
| |
| <source lang="cmake">
| |
| target_link_libraries(mytarget ${OPENSSL_LIB})
| |
| </source>
| |
| | |
| If it does not, it can be set through the CMake GUI.
| |
| | |
| ==Set Include Directories==
| |
| This command adds a path to the include directories, you do NOT have to do the 'export' style ``keep everything that is here and add this one'' syntax.
| |
| <source lang="cmake">
| |
| INCLUDE_DIRECTORIES(/some/directory)
| |
| </source>
| |
| | |
| ==View the directories that are set==
| |
| <source lang="cmake">
| |
| get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
| |
| message("inc_dirs = ${inc_dirs}")
| |
| </source>
| |
| | |
| ==Automate configure and generate==
| |
| Note 'cmake' instead of 'ccmake' (ccmake is curses cmake (curses is the terminal gui))
| |
| <source lang="cmake">
| |
| cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/mylocation ../
| |
| </source>
| |
| | |
| ==Compiler options==
| |
| ===Set a cmake flag===
| |
| <source lang="cmake">
| |
| ccmake ../../src/boost -DCMAKE_IS_EXPERIMENTAL=YES_I_KNOW
| |
| </source>
| |
| | |
| ===Set a cpp flag===
| |
| <source lang="cmake">
| |
| SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__WXGTK__")
| |
| </source>
| |
| | |
| ===Force g++===
| |
| Ocassionally you will come across files with the extension .c that actually contain c++ code. CMake treats the file based on its extension. If you want to override this behavior (in this case, compile .c files with your c++ compiler), do the following:
| |
| | |
| <source lang="cmake">
| |
| set(MySources main.c anotherFile.c)
| |
| add_executable(SpinRecognize ${MySource})
| |
| set_source_files_properties(${MySources} PROPERTIES LANGUAGE CXX)
| |
| </source>
| |
| | |
| ===Per-target===
| |
| <source lang="cmake">
| |
| set_target_properties(myexe_target
| |
| PROPERTIES COMPILE_FLAGS "-Wall")
| |
| </source>
| |
| | |
| ==Set the default build type==
| |
| <source lang="cmake">
| |
| SET(CMAKE_BUILD_TYPE Debug CACHE STRING "default to debug" FORCE)
| |
| </source>
| |
| | |
| ==Custom variable==
| |
| | |
| Here is a list of supported variable types: http://www.cmake.org/cmake/help/cmake2.6docs.html#command:set
| |
| | |
| ===String===
| |
| <source lang="cmake">
| |
| SET(BUILD_PARAVIEW_PLUGIN ON CACHE STRING "Build Paraview plugin?" FORCE)
| |
| </source>
| |
| ===Bool===
| |
| <source lang="cmake">
| |
| SET(DAI_WITH_BP ON CACHE BOOL "Belief Propagation" FORCE)
| |
| </source>
| |
| | |
| ====Comparison====
| |
| <source lang="cmake">
| |
| if(DAI_WITH_BP EQUALS ON)
| |
| #do something
| |
| endif(DAI_WITH_BP EQUALS ON)
| |
| </source>
| |
| | |
| This is equivalent to
| |
| | |
| <source lang="cmake">
| |
| if(DAI_WITH_BP)
| |
| #do something
| |
| endif(DAI_WITH_BP)
| |
| </source>
| |
| | |
| ==Linking to specific libraries==
| |
| ===ITK===
| |
| Add the path to your environment:
| |
| <source lang="text">
| |
| export ITK_DIR=/home/doriad/bin/ITK
| |
| </source>
| |
| | |
| Then in the CMakeLists.txt use:
| |
| <source lang="cmake">
| |
| FIND_PACKAGE(ITK REQUIRED)
| |
| INCLUDE(${ITK_USE_FILE})
| |
| | |
| ADD_EXECUTABLE(CastImageFilter CastImageFilter.cxx)
| |
| TARGET_LINK_LIBRARIES(CastImageFilter
| |
| vtkHybrid
| |
| ITKIO ITKBasicFilters ITKCommon
| |
| )
| |
| </source>
| |
| | |
| ===VXL===
| |
| Add the path to your environment:
| |
| <source lang="text">
| |
| export VXLBIN="/home/doriad/bin/vxl"
| |
| </source>
| |
| | |
| Then in the CMakeLists.txt use:
| |
| <source lang="cmake">
| |
| FIND_PACKAGE(VXL REQUIRED)
| |
| INCLUDE(${VXL_CMAKE_DIR}/UseVXL.cmake)
| |
| </source>
| |
| | |
| ===VTK===
| |
| Add the path to your environment:
| |
| <source lang="text">
| |
| export VTK_DIR="/home/doriad/bin/VTK"
| |
| </source>
| |
| | |
| Then in the CMakeLists.txt use:
| |
| <source lang="cmake">
| |
| FIND_PACKAGE(VTK REQUIRED)
| |
| INCLUDE(${VTK_USE_FILE})
| |
| </source>
| |
| | |
| ===Boost===
| |
| | |
| Add to the environment:
| |
| <source lang="text">
| |
| export BOOST_ROOT="/home/doriad/src/boost"
| |
| export BOOST_LIBRARYDIR="/home/doriad/bin/boost/lib" #maybe don't have to set this one? Verify.
| |
| </source>
| |
| | |
| Then in the CMakeLists.txt use:
| |
| <source lang="cmake">
| |
| SET(Boost_USE_MULTITHREAD ON) #set a flag
| |
| FIND_PACKAGE(Boost 1.34.1 COMPONENTS date_time filesystem)
| |
| INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${Boost_INCLUDE_DIRS})
| |
| LINK_DIRECTORIES(${LINK_DIRECTORIES} ${Boost_LIBRARY_DIRS})
| |
| </source>
| |
| | |
| ===OpenCV===
| |
| | |
| Add to the environment:
| |
| <source lang="text">
| |
| export OpenCV_DIR=/home/doriad/bin/OpenCV
| |
| </source>
| |
| | |
| Then in the CMakeLists.txt use:
| |
| <source lang="cmake">
| |
| FIND_PACKAGE(OpenCV REQUIRED )
| |
| INCLUDE_DIRECTORIES( ${OPENCV_INCLUDE_DIR} )
| |
| | |
| ADD_EXECUTABLE(Scalar Scalar.cxx)
| |
| TARGET_LINK_LIBRARIES(Scalar ${OpenCV_LIBS})
| |
| </source>
| |
| | |
| ===Get Help Using a Library===
| |
| <source lang="cmake">
| |
| cmake --help-module FindBoost
| |
| </source>
| |
| | |
| ===Add new libraries to CMake===
| |
| <source lang="cmake">
| |
| /usr/share/cmake/Modules/FindOpenGL.cmake|
| |
| </source>
| |
| | |
| ==Dependency Graph==
| |
| <source lang="cmake">
| |
| ccmake ../src/Program/ --graphviz=test.graph
| |
| dotty test.graph
| |
| </source>
| |
| | |
| ==CTest==
| |
| ===Run a specific test by number===
| |
| e.g. Test 622
| |
| <source lang="cmake">
| |
| ctest -I 622,622
| |
| </source>
| |
| | |
| ===Run a range of tests===
| |
| e.g. Test 622 to 625
| |
| <source lang="cmake">
| |
| ctest -I 622,625
| |
| </source>
| |
| | |
| ===Run a test by name===
| |
| <source lang="cmake">
| |
| ctest -R "itkTransformPoint*"|
| |
| </source>
| |
| | |
| ===Show verbose output of a test===
| |
| <source lang="cmake">
| |
| ctest -V -R "itkTransformPoint*"|
| |
| </source>
| |
| | |
| ===Create a Test===
| |
| <source lang="cmake">
| |
| cmake_minimum_required(VERSION 2.6)
| |
| | |
| project(simple)
| |
| ENABLE_TESTING()
| |
| | |
| add_executable(simple simple.cpp)
| |
| add_test(SimpleTest simple)
| |
| </source>
| |
| | |
| ==Link to a library==
| |
| <source lang="cmake">
| |
| ADD_EXECUTABLE(ColoredLines ColoredLines.cpp)
| |
| TARGET_LINK_LIBRARIES(ColoredLines vtkHybrid)
| |
| </source>
| |
| | |
| | |
| ==Create a library==
| |
| <source lang="cmake">
| |
| add_library(MatlabLibrary ./MatlabDll/LidarK.cpp)
| |
| </source>
| |