SlideShare a Scribd company logo
1 of 34
Download to read offline
CMake Tutorial


●
    1 – Introduction to CMake
●
    2 – Using CMake for the ILC Software
●
    3 – ILCInstall with CMake


               Jan Engels

                    DESY
             20th September 2007
What is CMake


●
    CMake:
    –   Generates native build environments
         ●
             UNIX/Linux -> Makefiles
         ●
             Windows -> VS Projects/Workspaces
         ●
             Apple -> Xcode
    –   Open-Source :)
    –   Cross-Platform




                          Jan Engels - Introduction to CMake   2
CMake Features
●
    CMake has a lot of nice features:
     –   Manage complex, large build environments (KDE4)
     –   Very Flexible & Extensible
          ●
              Support for Macros
          ●
              Modules for finding/configuring software (bunch of modules already available)
          ●
              Extend CMake for new platforms and languages
          ●
              Create custom targets/commands
          ●
              Run external programs
     –   Very simple, intuitive syntax
     –   Support for regular expressions (*nix style)
     –   Support for “In-Source” and “Out-of-Source” builds
     –   Cross Compiling
     –   Integrated Testing & Packaging (Ctest, CPack)


                                   Jan Engels - Introduction to CMake                     3
Build-System Generator




CMakeLists.txt                         CMake                      Native Build System




   Executables / Libraries                                        Native Build Tools




                             Jan Engels - Introduction to CMake                         4
CMake Basic Concepts
●
    CmakeLists.txt
    –   Input text files that contain the project parameters and
        describe the flow control of the build process in simple
        CMake language.
●
    CMake Modules
    –   Special cmake file written for the purpose of finding a
        certain piece of software and to set it's libraries, include
        files and definitions into appropriate variables so that
        they can be used in the build process of another
        project. (e.g. FindJava.cmake, FindZLIB.cmake,
        FindQt4.cmake)


                           Jan Engels - Introduction to CMake      5
CMake Basic Concepts
●
    The Source Tree contains:
     –   CMake input files (CmakeLists.txt)
     –   Program source files (hello.cc)
     –   Program header files (hello.h)
●
    The Binary Tree contains:
     –   Native build system files (Makefiles)
     –   Output from build process:
           ●
               Libraries
           ●
               Executables
           ●
               Any other build generated file
●
    Source and Binary trees may be:
     –   In the same directory (in-source build)
     –   In different directories (out-of-source build)



                                     Jan Engels - Introduction to CMake   6
CMake Basic Concepts
●
    CMAKE_MODULE_PATH
     –   Path to where the CMake modules are located
●
    CMAKE_INSTALL_PREFIX
     –   Where to put files when calling 'make install'
●
    CMAKE_BUILD_TYPE
     –   Type of build (Debug, Release, ...)
●
    BUILD_SHARED_LIBS
     –   Switch between shared and static libraries


●
    Variables can be changed directly in the build files (CmakeLists.txt) or through
    the command line by prefixing a variable's name with '-D':
     –   cmake -DBUILD_SHARED_LIBS=OFF
●
    GUI also available: ccmake


                                    Jan Engels - Introduction to CMake             7
CMake Cache


●
    Created in the build tree (CMakeCache.txt)
●
    Contains Entries VAR:TYPE=VALUE
●
    Populated/Updated during configuration phase
●
    Speeds up build process
●
    Can be initialized with cmake -C <file>
●
    GUI can be used to change values
●
    There should be no need to edit it manually!!



                      Jan Engels - Introduction to CMake   8
Source Tree Structure

                                                                          Dir3/CMakeLists.txt

                                       Dir1/CMakeLists.txt
                                     SUBDIRS(Dir3 Dir4)
     Project's Top-Level
       CmakeLists.txt                                                     Dir4/CMakeLists.txt

    SUBDIRS(Dir1 Dir2)
                                        Dir2/CMakeLists.txt



●
     Subdirectories added with SUBDIRS/ADD_SUBDIRECTORY
●
     Child inherits from parent (feature that is lacking in traditional Makefiles)
●
     Order of processing: Dir1;Dir3;Dir4;Dir2 (When CMake finds a SUBDIR command it
     stops processing the current file immediately and goes down the tree branch)


                                     Jan Engels - Introduction to CMake                         9
Using CMake

●
    Create a build directory (“out-of-source-build” concept)
     –   mkdir build ; cd build
●
    Configure the package for your system:
     –   cmake [options] <source_tree>
●
    Build the package:
                                                                 Similar to Auto Tools
     –   make
●
    Install it:
     –   make install
●
    The last 2 steps can be merged into one (just “make install”)



                            Jan Engels - Introduction to CMake                           10
Hello World for CMake
●
    Top-level project directory:
     –   CMakeLists.txt                    /*hello.h*/                     /*hello.cc*/
                                           #ifndef _hello_h                #include "hello.h"
     –   Sub-directory Hello:              #define _hello_h                #include <iostream>
                                                                           using namespace std;
           ●
               CMakeLists.txt              class Hello {
                                           public:                         void Hello::Print() {
           ●
               hello.h                       void Print();                   cout<<"Hello, World!”<<endl;
                                           };                              }
           ●
               hello.cc
                                           #endif
     –   Sub-directory Test:
           ●
               CMakeLists.txt                                                       Library Hello
           ●
               test.cc
                                                             /*test.cc*/
                                                             #include <iostream>
                                                             #include "hello.h"

                                                             int main() {
                                                               Hello().Print();
                                                               return 0;
                                                             }                    Test Binary


                                   Jan Engels - Introduction to CMake                                       11
Hello World for CMake
# Top-Level CmakeLists.txt

PROJECT( HELLO )

ADD_SUBDIRECTORY( Hello )
ADD_SUBDIRECTORY( Test )


                   # CmakeLists.txt in Hello dir

                   # Adds a library called Hello (libHello.a under Linux) from the source file hello.cc
                   ADD_LIBRARY( Hello hello )


                                            # CmakeLists.txt in Test dir

                                            # Make sure the compiler can find include files from our Hello library.
                                            INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/Hello)

                                            # Add binary called "helloWorld" that is built from the source file "test.cc".
                                            # The extension is automatically found.
                                            ADD_EXECUTABLE(helloWorld test)

                                            # Link the executable to the Hello library.
                                            TARGET_LINK_LIBRARIES(helloWorld Hello)


                                           Jan Engels - Introduction to CMake                                           12
CmakeLists.txt Files
●
    Very simple syntax:
    –   # This is a comment
    –   Commands syntax: COMMAND( arg1 arg2 ... )
    –   Lists A;B;C # semi-colon separated values
    –   Variables ${VAR}
    –   Conditional constructs
         ●
             IF() ... ELSE()/ELSEIF() ... ENDIF()
              –   Very useful: IF( APPLE ); IF( UNIX ); IF( WIN32 )
         ●
             WHILE() ... ENDWHILE()
         ●
             FOREACH() ... ENDFOREACH()
    –   Regular expressions (check CMake FAQ for details...)


                                 Jan Engels - Introduction to CMake   13
CmakeLists.txt Files
●
    INCLUDE_DIRECTORIES( “dir1” “dir2” ... )
●
    AUX_SOURCE_DIRECTORY( “source” )
●
    ADD_EXECUTABLE
●
    ADD_LIBRARY                                      Check www.cmake.org -> Documentation
●
    ADD_CUSTOM_TARGET
●
    ADD_DEPENDENCIES( target1 t2 t3 ) target1 depends on t2 and t3
●
    ADD_DEFINITIONS( “-Wall -ansi -pedantic”)
●
    TARGET_LINK_LIBRARIES( target-name lib1 lib2 ...) Individual settings for each target
●
    LINK_LIBRARIES( lib1 lib2 ...) All targets link with the same set of libs
●
    SET_TARGET_PROPERTIES( ... ) lots of properties... OUTPUT_NAME, VERSION, ....
●
    MESSAGE( STATUS|FATAL_ERROR “message” )
●
    INSTALL( FILES “f1” “f2” “f3” DESTINATION . )
     –   DESTINATION relative to ${CMAKE_INSTALL_PREFIX}


                                      Jan Engels - Introduction to CMake                    14
CmakeLists.txt Files

●
    SET( VAR value [CACHE TYPE DOCSTRING [FORCE]])
●
    LIST( APPEND|INSERT|LENGTH|GET|REMOVE_ITEM|REMOVE_AT|SORT ...)
●
    STRING( TOUPPER|TOLOWER|LENGTH|SUBSTRING|REPLACE|REGEX ...)
●
    SEPARATE_ARGUMENTS( VAR ) convert space separated string to list
●
    FILE( WRITE|READ|APPEND|GLOB|GLOB_RECURSE|REMOVE|MAKE_DIRECTORY ...)
●
    FIND_FILE
●
    FIND_LIBRARY
                                           Check www.cmake.org -> Documentation
●
    FIND_PROGRAM
●
    FIND_PACKAGE
●
    EXEC_PROGRAM( bin [work_dir] ARGS <..> [OUTPUT_VARIABLE var] [RETURN_VALUE var] )
●
    OPTION( OPTION_VAR “description string” [initial value] )




                                    Jan Engels - Introduction to CMake              15
CMake Tutorial




●
    2 – Using CMake for the ILC Software




                 Jan Engels - Introduction to CMake   16
CMake for the ILC Software
●
    IMPORTANT:
    –   CMake files for the ILC Software were designed, written and tested exclusively for out-of-
        source builds, therefore we strongly disencourage in-source builds!!
    –   A package should be installed first (with 'make install') before it can be used by other
        packages, thus we also strongly disencourage trying to pass the binary-tree from one
        package as the “installation directory” to other packages.


●
    Packages with CMake (build) support:
    –   Marlin, MarlinUtil, MarlinReco, CEDViewer, CED, LCIO, GEAR, LCCD,
        RAIDA, PandoraPFA, LCFIVertex, SiliconDigi, Eutelescope
●
    CMake modules written for external packages:
    –   CLHEP, CERNLIB, CondDBMySQL, GSL, ROOT, JAVA, AIDAJNI




                                     Jan Engels - Introduction to CMake                            17
Special variables
●
    BUILD_WITH=”CLHEP GSL”
    –   Tell package to use the libraries, include files and
        definitions from these packages
●
    <PKG>_HOME
    –   Variable for defining the home path from a pkg
         ●
             Standard CMake Find modules differ slightly from ILC
             Find modules
              –   ILC Find modules require PKG_HOME variable set
                    ●
                      Enforce version consistency (get rid of setting global
                      environment variables for defining local dependencies)
              –   Could instead be called Config<PKG>.cmake


                                Jan Engels - Introduction to CMake         18
Macros
●
    MacroLoadPackage.cmake
    –   To be able to use a package by using a
        “Find<PKG>.cmake” module or by using a
        “<PKG>Config.cmake” file
    –   Assumes the PKG_HOME variable is properly set
●
    MacroCheckDeps.cmake
    –   Uses MacroLoadPackage.cmake to check
        dependencies




                      Jan Engels - Introduction to CMake   19
Find<PKG>.cmake Modules
●
    Do the same as <PKG>Config.cmake generated
    by the cmake build
●
    Returns variables for using the package
    –   <PKG>_INCLUDE_DIRS
    –   <PKG>_LIBRARIES
    –   <PKG>_DEFINITIONS
●
    Using the MacroLoadPackage this is automatically
    done for you



                     Jan Engels - Introduction to CMake   20
BuildSetup.cmake


●
    Script for pre-caching variables/options
     –   SET( VAR “value” CACHE TYPE “description” FORCE )
●
    Easy way to change build parameters without having to pass
    the every time on the cmd line
●
    Use simple steps to build a package:
     –   mkdir build ; cd build
     –   cmake -C ../BuildSetup.cmake ..
     –   make install
●
    Still possible to override options on the cmd line



                           Jan Engels - Introduction to CMake    21
BuildSetup.cmake


●
    Can use more than one -C option:
    –   cmake -C ../BuildSetup.cmake -C ~/ILCSoft.cmake
    –   Next file overwrites values from previous file
    –   Useful for overwriting paths defined in a 'more global' file
         ●
             CMake just ignores redundant variables from global file
         ●
             ILCInstall generates a global file called ILCSoft.cmake


●
    Check /afs/desy.de/group/it/ilcsoft/v01-01/ILCSoft.cmake as
    an example



                             Jan Engels - Introduction to CMake        22
Adapting your processor to CMake
●
    Copy from $Marlin/examples/mymarlin
    –   CmakeLists.txt
         ●
             change the project name and add missing dependencies
             (default are Marlin;LCIO)
    –   mymarlinConfig.cmake.in
         ●
             rename to <MyProcessor>Config.cmake
    –   BuildSetup.cmake
         ●
             change this according to your system setup
    –   cmake_uninstall.cmake.in
         ●
             Script for generating a 'make uninstall' target
              –   No changes needed!

                              Jan Engels - Introduction to CMake   23
CmakeLists.txt template
# cmake file for building Marlin example Package

# CMake compatibility issues: don't modify this, please!
CMAKE_MINIMUM_REQUIRED( VERSION 2.4.6 )
MARK_AS_ADVANCED(CMAKE_BACKWARDS_COMPATIBILITY)
# allow more human readable "if then else" constructs
SET( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE )

# User section
PROJECT( mymarlin )

# project version
SET( ${PROJECT_NAME}_MAJOR_VERSION 0 )                                            You can add here your own options,
SET( ${PROJECT_NAME}_MINOR_VERSION 1 )                                           but don't forget at the end of the file to
SET( ${PROJECT_NAME}_PATCH_LEVEL 0 )                                           display them with a MESSAGE( STATUS)
                                                                                and to also write them properly to cache!
# project options
OPTION( BUILD_SHARED_LIBS "Set to OFF to build static libraries" ON )
OPTION( INSTALL_DOC "Set to OFF to skip build/install Documentation" ON )
# project dependencies e.g. SET( ${PROJECT_NAME}_DEPENDS "Marlin MarlinUtil LCIO GEAR CLHEP GSL" )
SET( ${PROJECT_NAME}_DEPENDS "Marlin LCIO" )
# set default cmake build type to RelWithDebInfo (None Debug Release RelWithDebInfo MinSizeRel)
IF( NOT CMAKE_BUILD_TYPE )
   SET( CMAKE_BUILD_TYPE "RelWithDebInfo" )
ENDIF()
# set default install prefix to project root directory
IF( CMAKE_INSTALL_PREFIX STREQUAL "/usr/local" )
   SET( CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}" )
ENDIF()



                                          Jan Engels - Introduction to CMake                                          24
CmakeLists.txt template
#include directories
INCLUDE_DIRECTORIES( "${PROJECT_SOURCE_DIR}/include" )                       Include directories here
# install include files
INSTALL( DIRECTORY "${PROJECT_SOURCE_DIR}/include"
     DESTINATION . PATTERN "*~" EXCLUDE PATTERN "*CVS*" EXCLUDE )

# require proper c++
ADD_DEFINITIONS( "-Wall -ansi -pedantic" )
# add debug definitions
#IF( CMAKE_BUILD_TYPE STREQUAL "Debug" OR                                 Add your Debug definitions here!
# CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" )
# ADD_DEFINITIONS( "-DDEBUG" )
#ENDIF()

# get list of all source files                                      If you have more sources you
AUX_SOURCE_DIRECTORY( src library_sources )                       should add them here (see for ex.
( .... )                                                              LCFIVertex CMakeLists.txt)
# DEPENDENCIES: this code has to be placed before adding any library or
# executable so that these are linked properly against the dependencies
IF( DEFINED ${PROJECT_NAME}_DEPENDS OR DEFINED BUILD_WITH OR DEFINED LINK_WITH )
   # load macro
   IF( NOT EXISTS "${CMAKE_MODULE_PATH}/MacroCheckDeps.cmake" )
      MESSAGE( FATAL_ERROR                                                    Dependencies are
        "nSorry, could not find MacroCheckDeps.cmake...n"
        "Please set CMAKE_MODULE_PATH correctly with: "                          checked here!
        "cmake -DCMAKE_MODULE_PATH=<path_to_cmake_modules>" )
   ENDIF()
   INCLUDE( "${CMAKE_MODULE_PATH}/MacroCheckDeps.cmake" )
   CHECK_DEPS()
ENDIF()


                                     Jan Engels - Introduction to CMake                                 25
CmakeLists.txt template
# LIBRARY
ADD_LIBRARY( lib_${PROJECT_NAME} ${library_sources} )
# create symbolic lib target for calling target lib_XXX
ADD_CUSTOM_TARGET( lib DEPENDS lib_${PROJECT_NAME} )
# change lib_target properties
SET_TARGET_PROPERTIES( lib_${PROJECT_NAME} PROPERTIES
                                                                                     Library
   # create *nix style library versions + symbolic links
   VERSION ${${PROJECT_NAME}_VERSION}
   SOVERSION ${${PROJECT_NAME}_SOVERSION}
   # allow creating static and shared libs without conflicts
   CLEAN_DIRECT_OUTPUT 1
   # avoid conflicts between library and binary target names
   OUTPUT_NAME ${PROJECT_NAME} )

# install library
INSTALL( TARGETS lib_${PROJECT_NAME} DESTINATION lib PERMISSIONS
     OWNER_READ OWNER_WRITE OWNER_EXECUTE
     GROUP_READ GROUP_EXECUTE
     WORLD_READ WORLD_EXECUTE )

# create uninstall configuration file
CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/cmake_uninstall.cmake.in"
           "${PROJECT_BINARY_DIR}/cmake_uninstall.cmake"
           IMMEDIATE @ONLY )
# create uninstall target
ADD_CUSTOM_TARGET( uninstall
 "${CMAKE_COMMAND}" -P "${PROJECT_BINARY_DIR}/cmake_uninstall.cmake" )
# create configuration file from .in file
CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in"
           "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY )
# install configuration file
INSTALL( FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" DESTINATION . )


                                     Jan Engels - Introduction to CMake                        26
CmakeLists.txt template
# display status message for important variables
MESSAGE( STATUS )
MESSAGE( STATUS "-------------------------------------------------------------------------------" )
MESSAGE( STATUS "BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}" )                                          Here you can display your
MESSAGE( STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}" )
MESSAGE( STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}" )                                               own project options
MESSAGE( STATUS "CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}" )
MESSAGE( STATUS "${PROJECT_NAME}_DEPENDS = "${${PROJECT_NAME}_DEPENDS}"" )
MESSAGE( STATUS "BUILD_WITH = "${BUILD_WITH}"" )
MESSAGE( STATUS "INSTALL_DOC = ${INSTALL_DOC}" )
MESSAGE( STATUS "Change a value with: cmake -D<Variable>=<Value>" )
MESSAGE( STATUS "-------------------------------------------------------------------------------" )
MESSAGE( STATUS )

# force some variables that could be defined in the command line to be written to cache     And here you should also add
SET( BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS}" CACHE BOOL
   "Set to OFF to build static libraries" FORCE )                                           your own project options to be
SET( CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH                                properly written to cache!
   "Where to install ${PROJECT_NAME}" FORCE )
SET( CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
   "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE )
SET( CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" CACHE PATH
   "Path to custom CMake Modules" FORCE )
SET( INSTALL_DOC "${INSTALL_DOC}" CACHE BOOL
   "Set to OFF to skip build/install Documentation" FORCE )

# export build settings
INCLUDE( CMakeExportBuildSettings )
CMAKE_EXPORT_BUILD_SETTINGS( "${PROJECT_NAME}BuildSettings.cmake" )
# export library dependencies (keep this as the last line in the file)
EXPORT_LIBRARY_DEPENDENCIES( "${PROJECT_NAME}LibDeps.cmake" )



                                                  Jan Engels - Introduction to CMake                                       27
Loading Processors in Marlin
●
    MARLIN_DLL environment variable
     –   $ export MARLIN_DLL=”/path1/lib1.so:/path2/lib2.so:$MARLIN_DLL”
     –   $ ./Marlin steer.xml
     –   Using ILCInstall this information is already added to the generated file
         build_env.sh for the processors found in the config file
●
    Linking Marlin with other shared libraries
     –   Add to your Marlin BuildSetup.cmake
           ●
               SET( LINK_WITH "MarlinReco CEDViewer” CACHE STRING “Link Marlin with
               these optional packages" FORCE )
     –   Or pass it on the command line:
           ●
               $ cmake -C ../BuildSetup.cmake
                –   -DLINK_WITH="mymarlin PandoraPFA"
                –   -Dmymarlin_HOME="path_to_mymarlin
                –   -DPandoraPFA_HOME="path_to_pandora" ..


                                   Jan Engels - Introduction to CMake               28
Loading Processors in Marlin




●
    Linking static libraries (Only works under linux!)
    –   -DLINK_STATIC_WHOLE_LIBS="path_to_library/libMyprocessor.a"
    –   Library gets fully included into the Marlin binary
    –   For more than one library:
          ●
              -DLINK_STATIC_WHOLE_LIBS="/path1/lib1.a;/path2/lib2.a"




                                   Jan Engels - Introduction to CMake   29
CMake Tutorial




●
    3 – ILCInstall with cmake




                 Jan Engels - Introduction to CMake   30
ILCInstall
ilcsoft = ILCSoft("/data/ilcsoft")
ilcsoft.useCMake = True

# python variable for referring the ILC Home directory                    CMake variables to be
ilcPath = "/afs/desy.de/group/it/ilcsoft/"                                passed on the cmd line
                                                                           when building RAIDA
# install RAIDA v01-03
ilcsoft.install( RAIDA( "v01-03" ))
# example for setting cmake variables (“ON”/”OFF” is equivalent to 1/0)
ilcsoft.module( “RAIDA” ).envcmake[“BUILD_RAIDA_EXAMPLE”] = “ON”
ilcsoft.module( “RAIDA” ).envcmake[“RAIDA_DEBUG_VERBOSE_FACTORY”] = 1

# use ROOT at: /afs/desy.de/group/it/ilcsoft/root/5.08.00
ilcsoft.link( ROOT( ilcPath + "root/5.08.00" ))
# use CMakeModules at: /afs/desy.de/group/it/ilcsoft/CMakeModules/v01-00
ilcsoft.use( CMakeModules( ilcPath + "CMakeModules/v01-00" ))
# use CMake at: /afs/desy.de/group/it/ilcsoft/CMake/2.4.6
ilcsoft.use( CMake( ilcPath + "CMake/2.4.6" ))
# End of configuration file



                                     Jan Engels - Introduction to CMake                       31
ILCInstall
●
    After creating the file call:
    –   ilcsoft-install RAIDA.cfg (display summary)
    –   ilcsoft-install RAIDA.cfg -i (install RAIDA)

●
    ILCSoft.cmake is generated by installation script
    –   Placed in the root directory of installation
    –   Contains paths for all packages defined in cfg file
         ●
             Only the ones that are supported by the cmake modules!




                               Jan Engels - Introduction to CMake     32
ILCInstall (Dev)
●
    Under the directory “releases” you find the AFS
    reference-installation configuration files
    –   Copy one of them:
         ●
             Only install packages you want to work on
              –   ilcsoft.module("RAIDA").download.type="ccvssh"
              –   ilcsoft.module("RAIDA").download.username="engels"
         ●
             Change the package dependencies install -> link
              –   ilcsoft.link( ROOT( "/data/myILCSoftware/root/5.08.00" ))
         ●
             Set needed options
              –   ilcsoft.module(“RAIDA”).envcmake[“BUILD_RAIDA_EXAMPLE”] = 1
              –   ilcsoft.module(“RAIDA”).envcmake[“RAIDA_DEBUG_VERBOSE_FAC
                  TORY”] = 1


                                Jan Engels - Introduction to CMake         33
References
●
    http://ilcsoft.desy.de -> General Documentation -> “How to use the CMake
    building tool for the ILC Software”
●
    http://www.cmake.org
     –   Documentation
     –   FAQ
●
    Mastering CMake
     –   Ken Martin, Bill Hoffman
     –   Published by Kitware, Inc.
     –   ISBN: 1-930934-16-5
●
    This talk: http://ilcsoft.desy.de -> General Documentation



                                         Thank you!


                                Jan Engels - Introduction to CMake             34

More Related Content

What's hot

Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014biicode
 
Configuration Surgery with Augeas
Configuration Surgery with AugeasConfiguration Surgery with Augeas
Configuration Surgery with AugeasPuppet
 
Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)Michele Orselli
 
Usage Note of SWIG for PHP
Usage Note of SWIG for PHPUsage Note of SWIG for PHP
Usage Note of SWIG for PHPWilliam Lee
 
Usage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on LinuxUsage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on LinuxWilliam Lee
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Rafael Dohms
 
How to deploy PHP projects with docker
How to deploy PHP projects with dockerHow to deploy PHP projects with docker
How to deploy PHP projects with dockerRuoshi Ling
 
Dependency management with Composer
Dependency management with ComposerDependency management with Composer
Dependency management with ComposerJason Grimes
 
Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3William Lee
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is DockerNick Belhomme
 
Programming in Linux Environment
Programming in Linux EnvironmentProgramming in Linux Environment
Programming in Linux EnvironmentDongho Kang
 
Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5 Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5 William Lee
 
Introducing DeploYii 0.5
Introducing DeploYii 0.5Introducing DeploYii 0.5
Introducing DeploYii 0.5Giovanni Derks
 
Using Puppet to Create a Dynamic Network - PuppetConf 2013
Using Puppet to Create a Dynamic Network - PuppetConf 2013Using Puppet to Create a Dynamic Network - PuppetConf 2013
Using Puppet to Create a Dynamic Network - PuppetConf 2013Puppet
 
Ansible 實戰:top down 觀點
Ansible 實戰:top down 觀點Ansible 實戰:top down 觀點
Ansible 實戰:top down 觀點William Yeh
 

What's hot (20)

Cmake
CmakeCmake
Cmake
 
C++ for the Web
C++ for the WebC++ for the Web
C++ for the Web
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
Configuration Surgery with Augeas
Configuration Surgery with AugeasConfiguration Surgery with Augeas
Configuration Surgery with Augeas
 
Puppet modules for Fun and Profit
Puppet modules for Fun and ProfitPuppet modules for Fun and Profit
Puppet modules for Fun and Profit
 
Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)
 
Usage Note of SWIG for PHP
Usage Note of SWIG for PHPUsage Note of SWIG for PHP
Usage Note of SWIG for PHP
 
Usage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on LinuxUsage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on Linux
 
Puppet evolutions
Puppet evolutionsPuppet evolutions
Puppet evolutions
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
 
How to deploy PHP projects with docker
How to deploy PHP projects with dockerHow to deploy PHP projects with docker
How to deploy PHP projects with docker
 
Dependency management with Composer
Dependency management with ComposerDependency management with Composer
Dependency management with Composer
 
Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
Programming in Linux Environment
Programming in Linux EnvironmentProgramming in Linux Environment
Programming in Linux Environment
 
Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5 Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5
 
Docker Starter Pack
Docker Starter PackDocker Starter Pack
Docker Starter Pack
 
Introducing DeploYii 0.5
Introducing DeploYii 0.5Introducing DeploYii 0.5
Introducing DeploYii 0.5
 
Using Puppet to Create a Dynamic Network - PuppetConf 2013
Using Puppet to Create a Dynamic Network - PuppetConf 2013Using Puppet to Create a Dynamic Network - PuppetConf 2013
Using Puppet to Create a Dynamic Network - PuppetConf 2013
 
Ansible 實戰:top down 觀點
Ansible 實戰:top down 觀點Ansible 實戰:top down 觀點
Ansible 實戰:top down 觀點
 

Similar to C make tutorial

LOSS_C11- Programming Linux 20221006.pdf
LOSS_C11- Programming Linux 20221006.pdfLOSS_C11- Programming Linux 20221006.pdf
LOSS_C11- Programming Linux 20221006.pdfThninh2
 
An Introduction to CMake
An Introduction to CMakeAn Introduction to CMake
An Introduction to CMakeICS
 
Docker in a JS Developer’s Life
Docker in a JS Developer’s LifeDocker in a JS Developer’s Life
Docker in a JS Developer’s LifeGlobalLogic Ukraine
 
Yocto: Training in English
Yocto: Training in EnglishYocto: Training in English
Yocto: Training in EnglishOtavio Salvador
 
Red Teaming macOS Environments with Hermes the Swift Messenger
Red Teaming macOS Environments with Hermes the Swift MessengerRed Teaming macOS Environments with Hermes the Swift Messenger
Red Teaming macOS Environments with Hermes the Swift MessengerJustin Bui
 
Introduction To Linux Kernel Modules
Introduction To Linux Kernel ModulesIntroduction To Linux Kernel Modules
Introduction To Linux Kernel Modulesdibyajyotig
 
Privilege Escalation with Metasploit
Privilege Escalation with MetasploitPrivilege Escalation with Metasploit
Privilege Escalation with Metasploitegypt
 
Introduction to Apache Ant
Introduction to Apache AntIntroduction to Apache Ant
Introduction to Apache AntShih-Hsiang Lin
 
Autoconf&Automake
Autoconf&AutomakeAutoconf&Automake
Autoconf&Automakeniurui
 
Useful Linux and Unix commands handbook
Useful Linux and Unix commands handbookUseful Linux and Unix commands handbook
Useful Linux and Unix commands handbookWave Digitech
 

Similar to C make tutorial (20)

CMake_Tutorial.pdf
CMake_Tutorial.pdfCMake_Tutorial.pdf
CMake_Tutorial.pdf
 
CMake best practices
CMake best practicesCMake best practices
CMake best practices
 
cmake.pdf
cmake.pdfcmake.pdf
cmake.pdf
 
LOSS_C11- Programming Linux 20221006.pdf
LOSS_C11- Programming Linux 20221006.pdfLOSS_C11- Programming Linux 20221006.pdf
LOSS_C11- Programming Linux 20221006.pdf
 
An Introduction to CMake
An Introduction to CMakeAn Introduction to CMake
An Introduction to CMake
 
Install guide
Install guideInstall guide
Install guide
 
Install guide
Install guideInstall guide
Install guide
 
Simple build tool
Simple build toolSimple build tool
Simple build tool
 
Linux unix-commands
Linux unix-commandsLinux unix-commands
Linux unix-commands
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker in a JS Developer’s Life
Docker in a JS Developer’s LifeDocker in a JS Developer’s Life
Docker in a JS Developer’s Life
 
Introduction to CMake
Introduction to CMakeIntroduction to CMake
Introduction to CMake
 
Yocto: Training in English
Yocto: Training in EnglishYocto: Training in English
Yocto: Training in English
 
Red Teaming macOS Environments with Hermes the Swift Messenger
Red Teaming macOS Environments with Hermes the Swift MessengerRed Teaming macOS Environments with Hermes the Swift Messenger
Red Teaming macOS Environments with Hermes the Swift Messenger
 
Introduction To Linux Kernel Modules
Introduction To Linux Kernel ModulesIntroduction To Linux Kernel Modules
Introduction To Linux Kernel Modules
 
Docker_AGH_v0.1.3
Docker_AGH_v0.1.3Docker_AGH_v0.1.3
Docker_AGH_v0.1.3
 
Privilege Escalation with Metasploit
Privilege Escalation with MetasploitPrivilege Escalation with Metasploit
Privilege Escalation with Metasploit
 
Introduction to Apache Ant
Introduction to Apache AntIntroduction to Apache Ant
Introduction to Apache Ant
 
Autoconf&Automake
Autoconf&AutomakeAutoconf&Automake
Autoconf&Automake
 
Useful Linux and Unix commands handbook
Useful Linux and Unix commands handbookUseful Linux and Unix commands handbook
Useful Linux and Unix commands handbook
 

More from Institute of Computing Technology, Chinese Academy of Sciences (9)

Distributedsystems 100912185813-phpapp01
Distributedsystems 100912185813-phpapp01Distributedsystems 100912185813-phpapp01
Distributedsystems 100912185813-phpapp01
 
Gfs andmapreduce
Gfs andmapreduceGfs andmapreduce
Gfs andmapreduce
 
二叉查找树范围查询算法
二叉查找树范围查询算法二叉查找树范围查询算法
二叉查找树范围查询算法
 
leveldb Log format
leveldb Log formatleveldb Log format
leveldb Log format
 
随即存储引擎Bitcask
随即存储引擎Bitcask随即存储引擎Bitcask
随即存储引擎Bitcask
 
Skip list
Skip listSkip list
Skip list
 
Five minuterule
Five minuteruleFive minuterule
Five minuterule
 
Lsm
LsmLsm
Lsm
 
Hfile格式详细介绍
Hfile格式详细介绍Hfile格式详细介绍
Hfile格式详细介绍
 

Recently uploaded

Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetEnjoy Anytime
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 

Recently uploaded (20)

Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 

C make tutorial

  • 1. CMake Tutorial ● 1 – Introduction to CMake ● 2 – Using CMake for the ILC Software ● 3 – ILCInstall with CMake Jan Engels DESY 20th September 2007
  • 2. What is CMake ● CMake: – Generates native build environments ● UNIX/Linux -> Makefiles ● Windows -> VS Projects/Workspaces ● Apple -> Xcode – Open-Source :) – Cross-Platform Jan Engels - Introduction to CMake 2
  • 3. CMake Features ● CMake has a lot of nice features: – Manage complex, large build environments (KDE4) – Very Flexible & Extensible ● Support for Macros ● Modules for finding/configuring software (bunch of modules already available) ● Extend CMake for new platforms and languages ● Create custom targets/commands ● Run external programs – Very simple, intuitive syntax – Support for regular expressions (*nix style) – Support for “In-Source” and “Out-of-Source” builds – Cross Compiling – Integrated Testing & Packaging (Ctest, CPack) Jan Engels - Introduction to CMake 3
  • 4. Build-System Generator CMakeLists.txt CMake Native Build System Executables / Libraries Native Build Tools Jan Engels - Introduction to CMake 4
  • 5. CMake Basic Concepts ● CmakeLists.txt – Input text files that contain the project parameters and describe the flow control of the build process in simple CMake language. ● CMake Modules – Special cmake file written for the purpose of finding a certain piece of software and to set it's libraries, include files and definitions into appropriate variables so that they can be used in the build process of another project. (e.g. FindJava.cmake, FindZLIB.cmake, FindQt4.cmake) Jan Engels - Introduction to CMake 5
  • 6. CMake Basic Concepts ● The Source Tree contains: – CMake input files (CmakeLists.txt) – Program source files (hello.cc) – Program header files (hello.h) ● The Binary Tree contains: – Native build system files (Makefiles) – Output from build process: ● Libraries ● Executables ● Any other build generated file ● Source and Binary trees may be: – In the same directory (in-source build) – In different directories (out-of-source build) Jan Engels - Introduction to CMake 6
  • 7. CMake Basic Concepts ● CMAKE_MODULE_PATH – Path to where the CMake modules are located ● CMAKE_INSTALL_PREFIX – Where to put files when calling 'make install' ● CMAKE_BUILD_TYPE – Type of build (Debug, Release, ...) ● BUILD_SHARED_LIBS – Switch between shared and static libraries ● Variables can be changed directly in the build files (CmakeLists.txt) or through the command line by prefixing a variable's name with '-D': – cmake -DBUILD_SHARED_LIBS=OFF ● GUI also available: ccmake Jan Engels - Introduction to CMake 7
  • 8. CMake Cache ● Created in the build tree (CMakeCache.txt) ● Contains Entries VAR:TYPE=VALUE ● Populated/Updated during configuration phase ● Speeds up build process ● Can be initialized with cmake -C <file> ● GUI can be used to change values ● There should be no need to edit it manually!! Jan Engels - Introduction to CMake 8
  • 9. Source Tree Structure Dir3/CMakeLists.txt Dir1/CMakeLists.txt SUBDIRS(Dir3 Dir4) Project's Top-Level CmakeLists.txt Dir4/CMakeLists.txt SUBDIRS(Dir1 Dir2) Dir2/CMakeLists.txt ● Subdirectories added with SUBDIRS/ADD_SUBDIRECTORY ● Child inherits from parent (feature that is lacking in traditional Makefiles) ● Order of processing: Dir1;Dir3;Dir4;Dir2 (When CMake finds a SUBDIR command it stops processing the current file immediately and goes down the tree branch) Jan Engels - Introduction to CMake 9
  • 10. Using CMake ● Create a build directory (“out-of-source-build” concept) – mkdir build ; cd build ● Configure the package for your system: – cmake [options] <source_tree> ● Build the package: Similar to Auto Tools – make ● Install it: – make install ● The last 2 steps can be merged into one (just “make install”) Jan Engels - Introduction to CMake 10
  • 11. Hello World for CMake ● Top-level project directory: – CMakeLists.txt /*hello.h*/ /*hello.cc*/ #ifndef _hello_h #include "hello.h" – Sub-directory Hello: #define _hello_h #include <iostream> using namespace std; ● CMakeLists.txt class Hello { public: void Hello::Print() { ● hello.h void Print(); cout<<"Hello, World!”<<endl; }; } ● hello.cc #endif – Sub-directory Test: ● CMakeLists.txt Library Hello ● test.cc /*test.cc*/ #include <iostream> #include "hello.h" int main() { Hello().Print(); return 0; } Test Binary Jan Engels - Introduction to CMake 11
  • 12. Hello World for CMake # Top-Level CmakeLists.txt PROJECT( HELLO ) ADD_SUBDIRECTORY( Hello ) ADD_SUBDIRECTORY( Test ) # CmakeLists.txt in Hello dir # Adds a library called Hello (libHello.a under Linux) from the source file hello.cc ADD_LIBRARY( Hello hello ) # CmakeLists.txt in Test dir # Make sure the compiler can find include files from our Hello library. INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/Hello) # Add binary called "helloWorld" that is built from the source file "test.cc". # The extension is automatically found. ADD_EXECUTABLE(helloWorld test) # Link the executable to the Hello library. TARGET_LINK_LIBRARIES(helloWorld Hello) Jan Engels - Introduction to CMake 12
  • 13. CmakeLists.txt Files ● Very simple syntax: – # This is a comment – Commands syntax: COMMAND( arg1 arg2 ... ) – Lists A;B;C # semi-colon separated values – Variables ${VAR} – Conditional constructs ● IF() ... ELSE()/ELSEIF() ... ENDIF() – Very useful: IF( APPLE ); IF( UNIX ); IF( WIN32 ) ● WHILE() ... ENDWHILE() ● FOREACH() ... ENDFOREACH() – Regular expressions (check CMake FAQ for details...) Jan Engels - Introduction to CMake 13
  • 14. CmakeLists.txt Files ● INCLUDE_DIRECTORIES( “dir1” “dir2” ... ) ● AUX_SOURCE_DIRECTORY( “source” ) ● ADD_EXECUTABLE ● ADD_LIBRARY Check www.cmake.org -> Documentation ● ADD_CUSTOM_TARGET ● ADD_DEPENDENCIES( target1 t2 t3 ) target1 depends on t2 and t3 ● ADD_DEFINITIONS( “-Wall -ansi -pedantic”) ● TARGET_LINK_LIBRARIES( target-name lib1 lib2 ...) Individual settings for each target ● LINK_LIBRARIES( lib1 lib2 ...) All targets link with the same set of libs ● SET_TARGET_PROPERTIES( ... ) lots of properties... OUTPUT_NAME, VERSION, .... ● MESSAGE( STATUS|FATAL_ERROR “message” ) ● INSTALL( FILES “f1” “f2” “f3” DESTINATION . ) – DESTINATION relative to ${CMAKE_INSTALL_PREFIX} Jan Engels - Introduction to CMake 14
  • 15. CmakeLists.txt Files ● SET( VAR value [CACHE TYPE DOCSTRING [FORCE]]) ● LIST( APPEND|INSERT|LENGTH|GET|REMOVE_ITEM|REMOVE_AT|SORT ...) ● STRING( TOUPPER|TOLOWER|LENGTH|SUBSTRING|REPLACE|REGEX ...) ● SEPARATE_ARGUMENTS( VAR ) convert space separated string to list ● FILE( WRITE|READ|APPEND|GLOB|GLOB_RECURSE|REMOVE|MAKE_DIRECTORY ...) ● FIND_FILE ● FIND_LIBRARY Check www.cmake.org -> Documentation ● FIND_PROGRAM ● FIND_PACKAGE ● EXEC_PROGRAM( bin [work_dir] ARGS <..> [OUTPUT_VARIABLE var] [RETURN_VALUE var] ) ● OPTION( OPTION_VAR “description string” [initial value] ) Jan Engels - Introduction to CMake 15
  • 16. CMake Tutorial ● 2 – Using CMake for the ILC Software Jan Engels - Introduction to CMake 16
  • 17. CMake for the ILC Software ● IMPORTANT: – CMake files for the ILC Software were designed, written and tested exclusively for out-of- source builds, therefore we strongly disencourage in-source builds!! – A package should be installed first (with 'make install') before it can be used by other packages, thus we also strongly disencourage trying to pass the binary-tree from one package as the “installation directory” to other packages. ● Packages with CMake (build) support: – Marlin, MarlinUtil, MarlinReco, CEDViewer, CED, LCIO, GEAR, LCCD, RAIDA, PandoraPFA, LCFIVertex, SiliconDigi, Eutelescope ● CMake modules written for external packages: – CLHEP, CERNLIB, CondDBMySQL, GSL, ROOT, JAVA, AIDAJNI Jan Engels - Introduction to CMake 17
  • 18. Special variables ● BUILD_WITH=”CLHEP GSL” – Tell package to use the libraries, include files and definitions from these packages ● <PKG>_HOME – Variable for defining the home path from a pkg ● Standard CMake Find modules differ slightly from ILC Find modules – ILC Find modules require PKG_HOME variable set ● Enforce version consistency (get rid of setting global environment variables for defining local dependencies) – Could instead be called Config<PKG>.cmake Jan Engels - Introduction to CMake 18
  • 19. Macros ● MacroLoadPackage.cmake – To be able to use a package by using a “Find<PKG>.cmake” module or by using a “<PKG>Config.cmake” file – Assumes the PKG_HOME variable is properly set ● MacroCheckDeps.cmake – Uses MacroLoadPackage.cmake to check dependencies Jan Engels - Introduction to CMake 19
  • 20. Find<PKG>.cmake Modules ● Do the same as <PKG>Config.cmake generated by the cmake build ● Returns variables for using the package – <PKG>_INCLUDE_DIRS – <PKG>_LIBRARIES – <PKG>_DEFINITIONS ● Using the MacroLoadPackage this is automatically done for you Jan Engels - Introduction to CMake 20
  • 21. BuildSetup.cmake ● Script for pre-caching variables/options – SET( VAR “value” CACHE TYPE “description” FORCE ) ● Easy way to change build parameters without having to pass the every time on the cmd line ● Use simple steps to build a package: – mkdir build ; cd build – cmake -C ../BuildSetup.cmake .. – make install ● Still possible to override options on the cmd line Jan Engels - Introduction to CMake 21
  • 22. BuildSetup.cmake ● Can use more than one -C option: – cmake -C ../BuildSetup.cmake -C ~/ILCSoft.cmake – Next file overwrites values from previous file – Useful for overwriting paths defined in a 'more global' file ● CMake just ignores redundant variables from global file ● ILCInstall generates a global file called ILCSoft.cmake ● Check /afs/desy.de/group/it/ilcsoft/v01-01/ILCSoft.cmake as an example Jan Engels - Introduction to CMake 22
  • 23. Adapting your processor to CMake ● Copy from $Marlin/examples/mymarlin – CmakeLists.txt ● change the project name and add missing dependencies (default are Marlin;LCIO) – mymarlinConfig.cmake.in ● rename to <MyProcessor>Config.cmake – BuildSetup.cmake ● change this according to your system setup – cmake_uninstall.cmake.in ● Script for generating a 'make uninstall' target – No changes needed! Jan Engels - Introduction to CMake 23
  • 24. CmakeLists.txt template # cmake file for building Marlin example Package # CMake compatibility issues: don't modify this, please! CMAKE_MINIMUM_REQUIRED( VERSION 2.4.6 ) MARK_AS_ADVANCED(CMAKE_BACKWARDS_COMPATIBILITY) # allow more human readable "if then else" constructs SET( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE ) # User section PROJECT( mymarlin ) # project version SET( ${PROJECT_NAME}_MAJOR_VERSION 0 ) You can add here your own options, SET( ${PROJECT_NAME}_MINOR_VERSION 1 ) but don't forget at the end of the file to SET( ${PROJECT_NAME}_PATCH_LEVEL 0 ) display them with a MESSAGE( STATUS) and to also write them properly to cache! # project options OPTION( BUILD_SHARED_LIBS "Set to OFF to build static libraries" ON ) OPTION( INSTALL_DOC "Set to OFF to skip build/install Documentation" ON ) # project dependencies e.g. SET( ${PROJECT_NAME}_DEPENDS "Marlin MarlinUtil LCIO GEAR CLHEP GSL" ) SET( ${PROJECT_NAME}_DEPENDS "Marlin LCIO" ) # set default cmake build type to RelWithDebInfo (None Debug Release RelWithDebInfo MinSizeRel) IF( NOT CMAKE_BUILD_TYPE ) SET( CMAKE_BUILD_TYPE "RelWithDebInfo" ) ENDIF() # set default install prefix to project root directory IF( CMAKE_INSTALL_PREFIX STREQUAL "/usr/local" ) SET( CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}" ) ENDIF() Jan Engels - Introduction to CMake 24
  • 25. CmakeLists.txt template #include directories INCLUDE_DIRECTORIES( "${PROJECT_SOURCE_DIR}/include" ) Include directories here # install include files INSTALL( DIRECTORY "${PROJECT_SOURCE_DIR}/include" DESTINATION . PATTERN "*~" EXCLUDE PATTERN "*CVS*" EXCLUDE ) # require proper c++ ADD_DEFINITIONS( "-Wall -ansi -pedantic" ) # add debug definitions #IF( CMAKE_BUILD_TYPE STREQUAL "Debug" OR Add your Debug definitions here! # CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" ) # ADD_DEFINITIONS( "-DDEBUG" ) #ENDIF() # get list of all source files If you have more sources you AUX_SOURCE_DIRECTORY( src library_sources ) should add them here (see for ex. ( .... ) LCFIVertex CMakeLists.txt) # DEPENDENCIES: this code has to be placed before adding any library or # executable so that these are linked properly against the dependencies IF( DEFINED ${PROJECT_NAME}_DEPENDS OR DEFINED BUILD_WITH OR DEFINED LINK_WITH ) # load macro IF( NOT EXISTS "${CMAKE_MODULE_PATH}/MacroCheckDeps.cmake" ) MESSAGE( FATAL_ERROR Dependencies are "nSorry, could not find MacroCheckDeps.cmake...n" "Please set CMAKE_MODULE_PATH correctly with: " checked here! "cmake -DCMAKE_MODULE_PATH=<path_to_cmake_modules>" ) ENDIF() INCLUDE( "${CMAKE_MODULE_PATH}/MacroCheckDeps.cmake" ) CHECK_DEPS() ENDIF() Jan Engels - Introduction to CMake 25
  • 26. CmakeLists.txt template # LIBRARY ADD_LIBRARY( lib_${PROJECT_NAME} ${library_sources} ) # create symbolic lib target for calling target lib_XXX ADD_CUSTOM_TARGET( lib DEPENDS lib_${PROJECT_NAME} ) # change lib_target properties SET_TARGET_PROPERTIES( lib_${PROJECT_NAME} PROPERTIES Library # create *nix style library versions + symbolic links VERSION ${${PROJECT_NAME}_VERSION} SOVERSION ${${PROJECT_NAME}_SOVERSION} # allow creating static and shared libs without conflicts CLEAN_DIRECT_OUTPUT 1 # avoid conflicts between library and binary target names OUTPUT_NAME ${PROJECT_NAME} ) # install library INSTALL( TARGETS lib_${PROJECT_NAME} DESTINATION lib PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) # create uninstall configuration file CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${PROJECT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY ) # create uninstall target ADD_CUSTOM_TARGET( uninstall "${CMAKE_COMMAND}" -P "${PROJECT_BINARY_DIR}/cmake_uninstall.cmake" ) # create configuration file from .in file CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY ) # install configuration file INSTALL( FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" DESTINATION . ) Jan Engels - Introduction to CMake 26
  • 27. CmakeLists.txt template # display status message for important variables MESSAGE( STATUS ) MESSAGE( STATUS "-------------------------------------------------------------------------------" ) MESSAGE( STATUS "BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}" ) Here you can display your MESSAGE( STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}" ) MESSAGE( STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}" ) own project options MESSAGE( STATUS "CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}" ) MESSAGE( STATUS "${PROJECT_NAME}_DEPENDS = "${${PROJECT_NAME}_DEPENDS}"" ) MESSAGE( STATUS "BUILD_WITH = "${BUILD_WITH}"" ) MESSAGE( STATUS "INSTALL_DOC = ${INSTALL_DOC}" ) MESSAGE( STATUS "Change a value with: cmake -D<Variable>=<Value>" ) MESSAGE( STATUS "-------------------------------------------------------------------------------" ) MESSAGE( STATUS ) # force some variables that could be defined in the command line to be written to cache And here you should also add SET( BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS}" CACHE BOOL "Set to OFF to build static libraries" FORCE ) your own project options to be SET( CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH properly written to cache! "Where to install ${PROJECT_NAME}" FORCE ) SET( CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE ) SET( CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" CACHE PATH "Path to custom CMake Modules" FORCE ) SET( INSTALL_DOC "${INSTALL_DOC}" CACHE BOOL "Set to OFF to skip build/install Documentation" FORCE ) # export build settings INCLUDE( CMakeExportBuildSettings ) CMAKE_EXPORT_BUILD_SETTINGS( "${PROJECT_NAME}BuildSettings.cmake" ) # export library dependencies (keep this as the last line in the file) EXPORT_LIBRARY_DEPENDENCIES( "${PROJECT_NAME}LibDeps.cmake" ) Jan Engels - Introduction to CMake 27
  • 28. Loading Processors in Marlin ● MARLIN_DLL environment variable – $ export MARLIN_DLL=”/path1/lib1.so:/path2/lib2.so:$MARLIN_DLL” – $ ./Marlin steer.xml – Using ILCInstall this information is already added to the generated file build_env.sh for the processors found in the config file ● Linking Marlin with other shared libraries – Add to your Marlin BuildSetup.cmake ● SET( LINK_WITH "MarlinReco CEDViewer” CACHE STRING “Link Marlin with these optional packages" FORCE ) – Or pass it on the command line: ● $ cmake -C ../BuildSetup.cmake – -DLINK_WITH="mymarlin PandoraPFA" – -Dmymarlin_HOME="path_to_mymarlin – -DPandoraPFA_HOME="path_to_pandora" .. Jan Engels - Introduction to CMake 28
  • 29. Loading Processors in Marlin ● Linking static libraries (Only works under linux!) – -DLINK_STATIC_WHOLE_LIBS="path_to_library/libMyprocessor.a" – Library gets fully included into the Marlin binary – For more than one library: ● -DLINK_STATIC_WHOLE_LIBS="/path1/lib1.a;/path2/lib2.a" Jan Engels - Introduction to CMake 29
  • 30. CMake Tutorial ● 3 – ILCInstall with cmake Jan Engels - Introduction to CMake 30
  • 31. ILCInstall ilcsoft = ILCSoft("/data/ilcsoft") ilcsoft.useCMake = True # python variable for referring the ILC Home directory CMake variables to be ilcPath = "/afs/desy.de/group/it/ilcsoft/" passed on the cmd line when building RAIDA # install RAIDA v01-03 ilcsoft.install( RAIDA( "v01-03" )) # example for setting cmake variables (“ON”/”OFF” is equivalent to 1/0) ilcsoft.module( “RAIDA” ).envcmake[“BUILD_RAIDA_EXAMPLE”] = “ON” ilcsoft.module( “RAIDA” ).envcmake[“RAIDA_DEBUG_VERBOSE_FACTORY”] = 1 # use ROOT at: /afs/desy.de/group/it/ilcsoft/root/5.08.00 ilcsoft.link( ROOT( ilcPath + "root/5.08.00" )) # use CMakeModules at: /afs/desy.de/group/it/ilcsoft/CMakeModules/v01-00 ilcsoft.use( CMakeModules( ilcPath + "CMakeModules/v01-00" )) # use CMake at: /afs/desy.de/group/it/ilcsoft/CMake/2.4.6 ilcsoft.use( CMake( ilcPath + "CMake/2.4.6" )) # End of configuration file Jan Engels - Introduction to CMake 31
  • 32. ILCInstall ● After creating the file call: – ilcsoft-install RAIDA.cfg (display summary) – ilcsoft-install RAIDA.cfg -i (install RAIDA) ● ILCSoft.cmake is generated by installation script – Placed in the root directory of installation – Contains paths for all packages defined in cfg file ● Only the ones that are supported by the cmake modules! Jan Engels - Introduction to CMake 32
  • 33. ILCInstall (Dev) ● Under the directory “releases” you find the AFS reference-installation configuration files – Copy one of them: ● Only install packages you want to work on – ilcsoft.module("RAIDA").download.type="ccvssh" – ilcsoft.module("RAIDA").download.username="engels" ● Change the package dependencies install -> link – ilcsoft.link( ROOT( "/data/myILCSoftware/root/5.08.00" )) ● Set needed options – ilcsoft.module(“RAIDA”).envcmake[“BUILD_RAIDA_EXAMPLE”] = 1 – ilcsoft.module(“RAIDA”).envcmake[“RAIDA_DEBUG_VERBOSE_FAC TORY”] = 1 Jan Engels - Introduction to CMake 33
  • 34. References ● http://ilcsoft.desy.de -> General Documentation -> “How to use the CMake building tool for the ILC Software” ● http://www.cmake.org – Documentation – FAQ ● Mastering CMake – Ken Martin, Bill Hoffman – Published by Kitware, Inc. – ISBN: 1-930934-16-5 ● This talk: http://ilcsoft.desy.de -> General Documentation Thank you! Jan Engels - Introduction to CMake 34