CMake/Examples: Difference between revisions
Daviddoria (talk | contribs) (→Bool) |
Daviddoria (talk | contribs) |
||
Line 13: | Line 13: | ||
<source lang="cmake"> | <source lang="cmake"> | ||
MESSAGE("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") | MESSAGE("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") | ||
</source> | |||
==Output (print) statement== | |||
<source lang="cmake"> | |||
MESSAGE("Hello world") | |||
</source> | </source> | ||
Revision as of 20:23, 15 March 2011
Welcome to the CMake Wiki Examples! These short snippets which show you how to perform many common CMake procedures. Please see [1] for the verbose documentation.
Please add examples as you find common procedures which are not explained 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>
Output (print) statement
<source lang="cmake"> MESSAGE("Hello world") </source>
View a system variable
<source lang="cmake"> \verb|MESSAGE("$ENV{PATH}") </source>
Check operating system
<source lang="cmake">
IF(WIN32) ...do something... ELSE(WIN32) ...do something else... ENDIF(WIN32)
</source>
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>
Set Link Directories
<source lang="cmake"> LINK_DIRECTORIES(${LINK_DIRECTORIES} /usr/local/lib) </source>
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
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
if(DAI_WITH_BP EQUALS ON)
- do something
endif(DAI_WITH_BP EQUALS ON)
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" </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>
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>