Difference between revisions of "CMake/Examples"

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

Latest revision as of 10:40, 30 April 2018


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

This page has moved here.