CMake/Examples: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
(Replace content with link to new CMake community wiki)
 
(16 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>
 
==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>

Latest revision as of 15:40, 30 April 2018


The CMake community Wiki has moved to the Kitware GitLab Instance.

This page has moved here.