Difference between revisions of "CMake/Examples"

From KitwarePublic
Jump to navigationJump to search
Line 102: Line 102:
  
 
=Custom variable=
 
=Custom variable=
 +
 +
Here is a list of supported variable types: http://www.cmake.org/cmake/help/cmake2.6docs.html#command:set
 +
 
==String==
 
==String==
 
<source lang="cmake">
 
<source lang="cmake">

Revision as of 10:37, 16 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

SET(VARIABLE VALUE)

View a CMake variable

MESSAGE("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")

Output (print) statement

MESSAGE("Hello world")

View a system variable

\verb|MESSAGE("$ENV{PATH}")

Check operating system

 IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)


Fix Mininum Version Error/Warning

cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)


Look in the directory that the CMakeLists.txt file is for header and implementation files

INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})


Set Link Directories

LINK_DIRECTORIES(${LINK_DIRECTORIES} /usr/local/lib)

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.

INCLUDE_DIRECTORIES(/some/directory)

View the directories that are set

get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
message("inc_dirs = ${inc_dirs}")

Automate configure and generate

Note 'cmake' instead of 'ccmake' (ccmake is curses cmake (curses is the terminal gui))

cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/mylocation ../

Compiler options

Set a cmake flag

ccmake ../../src/boost -DCMAKE_IS_EXPERIMENTAL=YES_I_KNOW

Set a cpp flag

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__WXGTK__")

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:

set(MySources main.c anotherFile.c)
add_executable(SpinRecognize ${MySource})
set_source_files_properties(${MySources} PROPERTIES LANGUAGE CXX)

Per-target

set_target_properties(myexe_target
                                PROPERTIES COMPILE_FLAGS "-Wall")

Set the default build type

SET(CMAKE_BUILD_TYPE Debug CACHE STRING "default to debug" FORCE)

Custom variable

Here is a list of supported variable types: http://www.cmake.org/cmake/help/cmake2.6docs.html#command:set

String

SET(BUILD_PARAVIEW_PLUGIN ON CACHE STRING "Build Paraview plugin?" FORCE)

Bool

SET(DAI_WITH_BP ON CACHE BOOL "Belief Propagation" FORCE)

Comparison

if(DAI_WITH_BP EQUALS ON)

  1. do something

endif(DAI_WITH_BP EQUALS ON)

Linking to specific libraries

ITK

Add the path to your environment:

export ITK_DIR=/home/doriad/bin/ITK

Then in the CMakeLists.txt use:

FIND_PACKAGE(ITK REQUIRED)
INCLUDE(${ITK_USE_FILE})

ADD_EXECUTABLE(CastImageFilter CastImageFilter.cxx)
TARGET_LINK_LIBRARIES(CastImageFilter
vtkHybrid
ITKIO ITKBasicFilters ITKCommon
)

VXL

Add the path to your environment:

export VXLBIN="/home/doriad/bin/vxl"

Then in the CMakeLists.txt use:

FIND_PACKAGE(VXL REQUIRED)
INCLUDE(${VXL_CMAKE_DIR}/UseVXL.cmake)

VTK

Add the path to your environment:

export VTK_DIR="/home/doriad/bin/VTK"

Then in the CMakeLists.txt use:

FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})

Boost

Add to the environment:

export BOOST_ROOT="/home/doriad/src/boost"
export BOOST_LIBRARYDIR="/home/doriad/bin/boost/lib"

Then in the CMakeLists.txt use:

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})

OpenCV

Add to the environment:

export OpenCV_DIR=/home/doriad/bin/OpenCV

Then in the CMakeLists.txt use:

FIND_PACKAGE(OpenCV REQUIRED )
INCLUDE_DIRECTORIES( ${OPENCV_INCLUDE_DIR} )

ADD_EXECUTABLE(Scalar Scalar.cxx)
TARGET_LINK_LIBRARIES(Scalar ${OpenCV_LIBS})

Get Help Using a Library

cmake --help-module FindBoost

Add new libraries to CMake

/usr/share/cmake/Modules/FindOpenGL.cmake|

Dependency Graph

ccmake ../src/Program/ --graphviz=test.graph 
dotty test.graph

CTest

Run a specific test by number

e.g. Test 622

ctest -I 622,622

Run a range of tests

e.g. Test 622 to 625

ctest -I 622,625

Run a test by name

ctest -R "itkTransformPoint*"|

Link to a library

ADD_EXECUTABLE(ColoredLines ColoredLines.cpp)
TARGET_LINK_LIBRARIES(ColoredLines vtkHybrid)


Create a library

add_library(MatlabLibrary ./MatlabDll/LidarK.cpp)