Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
rodolfo@digitok.com.br
CMake
Behind the Scenes of Code Development
Outline
Motivation
CMake features
Basic usage
Medium-sized projects
FLTK-based projects
CMake scripting
Multi-platform environments
Troubleshooting
Conclusion
eferences
Motivation
GNU Autotools
ed / vi / emacs
CMakeLists.txt
cmake
Makefile
make
Develoer
User
CMake
ed / vi / emacs
Makefile
make
Develoer
User
Make
Kitware's CMake Features
Multi-environment ! Multi-platform
/igh scalabilit'
7utomated testsuites
clean-
depends-
cmake . -DCMAKE_BUILD_TYPE=(Debug|RelW!"DebI#$%|...&
Aou can 3rite 'our o3n finder 1not for the faint-hearted.
root
src
lib
lib9
lib:
lib<
testsuite
res
doc
addCsubdirector'1DsubdirE.
);ample
co&fig.!.i&
#define QK.#9OJK2 F
(( #undef WQH.#9OJK2
#define QE7VE.H#KE8H ima/e#suite
#define TH0L3OK U.
Ge&erated co&fig.!
#include confi/.h
#if WQH.#9OJK2
(( do "pe/ stuff
#endif
co&vert.c excert
Custom argets
);ample 9
Command to be used-
add#custom#tar/et(parser.c %ison So parser.c parser.@
LOJ07HL parser.@)
add#e$ecuta%le(hello main.c parser.c)
);ample :
add#custom#tar/et(car.pn/.c %in5c car.pn/
LOJ07HL car.pn/)
add#e$ecuta%le(%in5c %in5c.c)
add#e$ecuta%le(hello main.c car.pn/.c)
F$K(Based &ro'ects
pro"ect(ima/e#suite)
find#pac*a/e(9DMV)
find#pac*a/e(WQH.)
find#pac*a/e(QK. 0HIJ30H2)
add#li%rar@(con:ert con:ert.cpp)
tar/et#lin*#li%raries(con:ert ){QK.#D360E03HL!)
include#directories(){QK.#3K7DJ2H#230!)
if(WQH.#9OJK2)
tar/et#lin*#li%raries(con:ert ){WQH.#D360E03HL!)
include#directories(){WQH.#3K7DJ2H#230!)
endif()
if(9DMV#9OJK2)
flt*#?rap#ui(:ie?er :ie?er.fl)
add#e$ecuta%le(:ie?er :ie?er.cpp ){:ie?er#9DMV#J3#L07L!)
tar/et#lin*#li%raries(:ie?er con:ert ){9DMV#D360E03HL!)
include#directories(){9DMV#3K7DJ2H#230L!)
lin*#directories(){9DMV#D360E0R#230L!)
endif()
);ample-
CMake Scripting
Loops
Condition
"ariables
Lists
Macros
+Functions,
);ample-
macro(add#tool name)
add#custom#tar/et(){name!.c create#tool ){name!)
add#e$ecuta%le(){name! ){name!.c)
tar/et#lin*#li%raries(){name! ){6oost#D360E03HL!)
endmacro()
add#tool(resiAe)
add#tool(in:ert)
add#tool(mirror)
add#tool(crop)
For loop
foreach(tool resiAe in:ert mirror crop)
messa/e(Qreparin/ tool ){tool!)
add#custom#tar/et(){tool!.c create#tool ){tool!)
add#e$ecuta%le(){tool! ){tool!.c)
tar/et#lin*#li%raries(){tool! ){6oost#D360E03HL!)
endforeach()
5f clause
if(13KU5)
do#somethin/#?eird()
elseif(EQQDH O0 JK3G)
do#somethin/#neat()
endif()
if(HG3LML some#file.dat)
process(some#file.dat)
endif()
if(additional#file 8EM7HHL Xfile#.Y))
process(){additional#file!)
endif()
Some Useful Statements
$ists
);ample-
set(sources :ie?er.cpp confi/.cpp)
if(13KU5)
list(EQQHK2 sources :ie?er#mfc.cpp)
elseif(JK3G)
list(EQQHK2 sources :ie?er#/t*.cpp)
else
messa/e(9EMED Qlatform not supported)
endif()
add#e$ecuta%le(:ie?er ){sources!)
list(DHK.MH sources srclen)
messa/e(){srclen! source files)
foreach(src ){sources!)
messa/e(Lource; ){src!)
endforeach()
Multi(platform "nvironments
CMakeCache(t;t e;cerpt-
((Mhe 6oost 93DHLRLMH8 li%rar@
6oost#93DHLRLMH8#D360E0R;93DHQEMHP(usr(li%(li%%oost#files@stemSmtSF#B.so
((Qath to a li%rar@.
6oost#93DHLRLMH8#D360E0R#2H6J.;93DHQEMHP6oost#93DHLRLMH8#D360E0R#2H6J.SKOM9OJK2
((Qath to a li%rar@.
6oost#93DHLRLMH8#D360E0R#0HDHELH;93DHQEMHP(usr(li%(li%%oost#files@stemSmtSF#B.so
((Qath to a file.
6oost#3K7DJ2H#230;QEMHP(usr(include(%oostSF#B
6hen not thought out 3ell$ development time shifts to3ards build s'stem
t3eaking instead of source file coding(