Upload
dardoonan
View
146
Download
10
Embed Size (px)
DESCRIPTION
cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目
Citation preview
CmakeCmake Practice --Cjacker
cmake 5,6 KDE4 Linux cmake Kitware KDE4cmakecmake KDE cmake KDE cmake cmake cmake KDEcmake KDEautotools cmake KDE4 cmake cmake cmakecmake
2006 KDE cmake cmakecmake cmake Everest QT-4.3 Everest KDE4 cmake: Find FOOFoo_FIND_QUIETLY FOO_FIND_QUIETLY cmakecmake(Cmake Practice) Tutorial${} IF cmake cmake maillist,The `IF(var)' or `IF(NOT var)' command expects `var' to be the name of a variable. This is stated in CMake's manual. So, for your situation `IF(${libX})' is the same as `IF(/usr/lib/xorg)' and then CMake will check the value of the variable named `/usr/lib/xorg'. IF
cmake CC cmake
cmakeCmake.
-- KDE1 cmake kitware(VTK) 2001 www.cmake.org cmakecmake KDE4( svnKDE CVSSVN SVN) KDE 10 autotools KDE4 KDE
KDE(admin/Makefile.common) unsermake, scons cmakeKDE4 cmake cmake KDE4 cmake kdesvn,rosegarden cmake cmake
2cmake1 BSDhttp://cmake.org/HTML/Copyright.html2 native Linux/Unix makefile xcode Windows MSVC3KDE44Cmakecmake+make5 KDECMake KDE4 kdelibs autotools KDE3.5.6 kdelibs 40% Cmake libtool6 cmake cmake
31cmake2cmake autotools CMakeLists.txt() cmake 3cmake pkgconfig
41 cmake
2 Makefile3 C/C++/Java cmake()4 java ant cmake
QT4.3 csharp qyoto5cmake4 qt cmake qmake Qt cmake
cmake
cmake Linux EverestFedora extra( Windows Linux) cmake cmake
http://www.cmake.org/HTML/Download.html
cmake
cmake cmake helloworldHello world
Helloworld cmake cmakeEverest Linux CD gcc-4.2/gtk/qt3/qt4 cmake 2.4.6
1/backup cmakemkdir -p /backup/cmake cmake/backup/cmake()
cmake t1cd /backup/cmakemkdir t1cd t1 t1 main.c CMakeLists.txt()
main.c//main.c#include int main(){
printf(Hello World from t1 Main!\n);return 0;
}
CmakeLists.txtPROJECT (HELLO)SET(SRC_LIST main.c)MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})ADD_EXECUTABLE(hello SRC_LIST)
2t1 main.c CMakeLists.txt
cmake . ()
-- Check for working C compiler: /usr/bin/gcc-- Check for working C compiler: /usr/bin/gcc -- works-- Check size of void*-- Check size of void* - done-- Check for working CXX compiler: /usr/bin/c++-- Check for working CXX compiler: /usr/bin/c++ -- works-- This is BINARY dir /backup/cmake/t1-- This is SOURCE dir /backup/cmake/t1-- Configuring done-- Generating done-- Build files have been written to: /backup/cmake/t1
CMakeFiles, CMakeCache.txt, cmake_install.cmakeMakefile.Makefile. makeScanning dependencies of target hello[100%] Building C object CMakeFiles/hello.dir/main.oLinking C executable hello[100%] Built target hello
make make VERBOSE=1 VERBOSE=1 make
hello./hello
Hello World from Main
cmake
3 CMakeLists.txt cmakeCMakeLists.txt() CMakeLists.txtPROJECT (HELLO)SET(SRC_LIST main.c)MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})ADD_EXECUTABLE(hello ${SRC_LIST})
PROJECTPROJECT(projectname [CXX] [C] [Java]) cmake:_BINARY_DIR_SOURCE_DIRHELLO_BINARY_DIR HELLO_SOURCE_DIR( CMakeLists.txt MESSAGE)/backup/cmake/t1 cmake PROJECT_BINARY_DIR PROJECT_SOURCE_DIR HELLO_BINARY_DIR HELLO_SOURCE_DIR PROJECT_BINARY_DIRPROJECT_SOURCE_DIR_SOURCE_DIR
SETSET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) SET SET(SRC_LIST main.c)SET(SRC_LIST main.c t1.c t2.c)
MESSAGEMESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...):SEND_ERRORSATUS
FATAL_ERROR cmake. STATUS PROJECTHELLO_BINARY_DIR HELLO_SOURCE_DIR
ADD_EXECUTABLE(hello ${SRC_LIST}) hello SRC_LIST
ADD_EXECUTABLE(hello main.c)
${} cmake IF${}${} IF${}
CMakeLists.txtPROJECT(HELLO)ADD_EXECUTABLE(hello main.c)
4cmake cmake cmake 1${} IF2( 1 2...)
ADD_EXECUTABLE func.cADD_EXECUTABLE(hello main.c func.c)ADD_EXECUTABLE(hello main.c;func.c)3
MESSAGEMESSAGE(STATUS This is BINARY dir ${HELLO_BINARY_DIR})
MESSAGE(STATUS This is BINARY dir ${HELLO_BINARY_DIR})
HELLO hellohelloADD_EXECUTABLE(t1 main.c)
t1
5cmakeSET(SRC_LIST main.c) SET(SRC_LIST main.c) fu nc.c() SET(SRC_LIST fu nc.c) fu nc.c:SET(SRC_LIST fu nc.c)
sourceADD_EXECUTABLE(t1 main)cmake main.c main.cpp main.c main.
ADD_EXECUTABLE(t1 main.c t1.c) ADD_EXECUTABLE(t1 main.c;t1.c). CMakeLists.txt
6 autotools:make clean
7?! make distclean cmake
cmake make distclean: CMakeLists.txt make distclean
Some build trees created with GNU autotools have a "make distclean" target that cleans the build and also removes Makefiles and other parts of the generated build system. CMake does not generate a "make distclean" target because CMakeLists.txt files can run scripts and arbitrary commands; CMake has no way of tracking exactly which files are generated as part of running
CMake. Providing a distclean target would give users the false impression that it would work as expected. (CMake does generate a "make clean" target to remove files generated by the compiler and linker.) A "make distclean" target is only necessary if the user performs an in-source build. CMake supports in-source builds, but we strongly encourage users to adopt the notion of an out-of-source build. Using a build tree that is separate from the source tree will prevent CMake from generating any files in the source tree. Because CMake does not change the source tree, there is no need for a distclean target. One can start a fresh build by deleting the build tree or creating a separate build tree.
(in-source build) cmake(out-of-source build)
8:
:-D wxGTK Everest
wxGTK static shared static../configure enable-static;make static wxGTK shared../configure enable-shared;make shared
cmake
1 t1 main.c CmakeLists.txt CMakeCache.txt2 t1 build build
3 build cmake ..(,..CMakeLists.txt build cmake ) build Makefile.4 make(build) hello out-of-source
HELLO_SOURCE_DIR/backup/cmake/t1 HELLO_BINARY_DIR/backup/cmake/t1/build
9 cmake Hello WorldPROJECT/MESSAGE/ADD_EXECUTABLE_SOURCE_DIR_BINARY_DIR Makefile Makefile gcc main.c Makefilekdelibs 50 M
HelloWorld
Hello World
out-of-source build
Hello World1 src;2 doc hello.txt3 COPYRIGHT, README4 runhello.sh hello4 bin5 hello runhello.sh/usr/bin doc COPYRIGHT/README/usr/share/doc/cmake/t2
1/backup/cmake/ t2 t1 main.c CMakeLists.txt t2
2 srcmkdir srcmv main.c src
src CMakeLists.txt
CMakeLists.txt src CMakeLists.txtADD_EXECUTABLE(hello main.c)
t2 CMakeLists.txtPROJECT(HELLO)ADD_SUBDIRECTORY(src bin)
build buildcmake ..make hello build/bin
ADD_SUBDIRECTORYADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])EXCLUDE_FROM_ALL example example()
src()bin bin()build/src( src) bin src bin bin
SUBDIRSSUBDIRS(dir1 dir2...)
ADD_SUBDIRECTORY (src bin) SUBDIRS(src) build src hello src
3 SUBDIRS ADD_SUBDIRECTORY() SET EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH( hello)SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)_BINARY_DIR PROJECT_BINARY_DIR PROJECT_SOURCE_DIR build
build/bin build/lib.
CMakeLists.txt srcCMakeLists.txt ADD_EXECUTABLE ADD_LIBRARY
src CMakeLists.txt
4 make install
MakefileDESTDIR=install:
mkdir -p $(DESTDIR)/usr/bininstall -m 755 hello $(DESTDIR)/usr/bin
:make install hello/usr/bin make install DESTDIR=/tmp/test/tmp/test/usr/bin
PREFIX autotools:./configure prefix=/usr./configure --prefix=/usr/localPREFIX Makefile:DESTDIR=PREFIX=/usrinstall:
mkdir -p $(DESTDIR)/$(PREFIX)/bininstall -m 755 hello $(DESTDIR)/$(PREFIX)/bin
HelloWorld cmake INSTALLCMAKE_INSTALL_PREFIXCMAKE_INSTALL_PREFIX configure prefix
cmake -DCMAKE_INSTALL_PREFIX=/usr .
INSTALL
INSTALL
INSTALL(TARGETS targets... [[ARCHIVE|LIBRARY|RUNTIME] [DESTINATION ] [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT ] [OPTIONAL] ] [...]) TARGETS ADD_EXECUTABLE ADD_LIBRARY
ARCHIVELIBRARYRUNTIME
DESTINATION/CMAKE_INSTALL_PREFIX CMAKE_INSTALL_PREFIX/${CMAKE_INSTALL_PREFIX}/
INSTALL(TARGETS myrun mylib mystaticlibRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION libstatic)
myrun${CMAKE_INSTALL_PREFIX}/bin libmylib${CMAKE_INSTALL_PREFIX}/lib libmystaticlib${CMAKE_INSTALL_PREFIX}/libstatic
TARGETS TARGETS
INSTALL(FILES files... DESTINATION [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT ] [RENAME ] [OPTIONAL]) PERMISSIONSOWNER_WRITE, OWNER_READ, GROUP_READ, WORLD_READ 644
() INSTALL(PROGRAMS files... DESTINATION [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT ] [RENAME ] [OPTIONAL]) FILES:OWNER_EXECUTE, GROUP_EXECUTE, WORLD_EXECUTE 755
INSTALL(DIRECTORY dirs... DESTINATION [FILE_PERMISSIONS permissions...] [DIRECTORY_PERMISSIONS permissions...] [USE_SOURCE_PERMISSIONS] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT ] [[PATTERN | REGEX ] [EXCLUDE] [PERMISSIONS permissions...]] [...])
DIRECTORYPATTERN PERMISSIONSDIRECTORY Sourceabc abc// abc/
PATTERNPERMISSIONS PATTERN
:
INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE PATTERN "scripts/*" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ)
icons /share/myproj scripts//share/myproj CVS scripts/* OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ.
CMAKEINSTALL([[SCRIPT ] [CODE ]] [...])SCRIPT cmake.cmakeCODE CMAKEINSTALL(CODE "MESSAGE(\"Sample install message.\")")
INSTALL_FILES
CMAKE_INSTALL_PREFIX
5 Helloworld
1 src;2 doc hello.txt3 COPYRIGHT, README4 runhello.sh hello4 bin5 hello runhello.sh//bindoc hello.txt COPYRIGHT/README//share/doc/cmake/t2
doc:
cd /backup/cmake/t2 mkdir doc vi doc/hello.txt
runhello.shhello
COPYRIGHT READMEtouch COPYRIGHTtouch README
CMakeLists.txt1 COPYRIGHT/README CMakelists.txtINSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)2 runhello.sh CMakeLists.txtINSTALL(PROGRAMS runhello.sh DESTINATION bin)3 doc hello.txt docCMakeLists.txt doc ADD_SUBDIRECTORY
INSTALL(DIRECTORY) DIRECTORY
hello.txt//share/doc/cmake/t2 doc doc doc/
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2)6 build CMAKE_INSTALL_PREFIX/tmp/t2cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
makemake install/tmp/t2./usr./usr/share./usr/share/doc
./usr/share/doc/cmake
./usr/share/doc/cmake/t2
./usr/share/doc/cmake/t2/hello.txt
./usr/share/doc/cmake/t2/README
./usr/share/doc/cmake/t2/COPYRIGHT
./usr/bin
./usr/bin/hello
./usr/bin/runhello.sh
cmake -DCMAKE_INSTALL_PREFIX=/usr ..7 CMAKE_INSTALL_PREFIXcmake ..;make;make installCMAKE_INSTALL_PREFIX/usr/local8CMAKE_INSTALL_PREFIX() cmake gcc
Hello WorldOK Hello World Hello World
HelloFuncHelloFunc Hello World
/backup/cmake t3
cd /backup/cmake/t3mkdir lib t3 CMakeLists.txtPROJECT(HELLOLIB)ADD_SUBDIRECTORY(lib)
lib hello.c hello.hhello.c#include hello.hvoid HelloFunc(){
printf(Hello World\n);}
hello.h#ifndef HELLO_H#define HELLO_H#include void HelloFunc();#endif
lib CMakeLists.txt
SET(LIBHELLO_SRC hello.c)ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
: out-of-source build build
cmake ..make lib libhello.so
libhello.so CMakeLists.txt ADD_SUBDIRECTORY(lib) lib/CMakeLists.txtSET(LIBRARY_OUTPUT_PATH )
ADD_LIBRARY ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN) libhello.so hellocmakelibhello.X
:SHAREDSTATICMODULE dyld dyld SHARED
EXCLUDE_FROM_ALL
.a
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
build hello target
hello hello_static:ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) libhello_static.a
target ADD_LIBRARY
SET_TARGET_PROPERTIES SET_TARGET_PROPERTIES(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)
API
lib/CMakeLists.txtSET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") libhello.so/libhello.a
GET_TARGET_PROPERTY(VAR target property) lib/CMakeListst.txtGET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)MESSAGE(STATUS This is the hello_static OUTPUT_NAME:${OUTPUT_VALUE})
NOTFOUND.
libhello.abuild/lib libhello.socmake
target libhello.a libhello.so. SET_TARGET_PROPERTIESCLEAN_DIRECT_OUTPUT lib/CMakeLists.txt:SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
build/lib libhello.solibhello.a
libhello.so.1.2libhello.so ->libhello.so.1libhello.so.1->libhello.so.1.2
SET_TARGET_PROPERTIES
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)VERSIONSOVERSION API lib/CMakeLists.txt build/liblibhello.so.1.2libhello.so.1->libhello.so.1.2libhello.so ->libhello.so.1
libhello.a, libhello.so.x hello.h hello/lib hello.h/include/hello
INSTALL lib/CMakeLists.txtINSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello) ARCHIVE:cmake -DCMAKE_INSTALL_PREFIX=/usr ..makemake install/usr/lib/usr/include/hello
ADD_LIBRARY SET_TARGET_PROPERTIES SET_TARGET_PROPERTIES INSTALL
Hello World libhello
Hello World.
libhello
1:/backup/cmake t4 t4
2 src main.c#include int main(){
HelloFunc();return 0;
}
CMakeLists.txtPROJECT(NEWHELLO)ADD_SUBDIRECTORY(src)
src/CMakeLists.txtADD_EXECUTABLE(main main.c)
build cmake ..
cmake ..make
make VERBOSE=1
/backup/cmake/t4/src/main.c:1:19: error: hello.h:
hello.h/usr/include/hello( include glib libX11) hello.hINCLUDE_DIRECTORIESINCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
CMAKE_INCLUDE_DIRECTORIES_BEFORE SET cmake on
AFTER BEFORE
src/CMakeLists.txtINCLUDE_DIRECTORIES(/usr/include/hello)
build hello.h
main.c:(.text+0x12): undefined reference to `HelloFunc'
link libhello
5 target libhelloLINK_DIRECTORIES TARGET_LINK_LIBRARIESLINK_DIRECTORIESLINK_DIRECTORIES(directory1 directory2 ...)
TARGET_LINK_LIBRARIES:TARGET_LINK_LIBRARIES(target library1 library2 ...) target
HelloFuncsrc/CMakeLists.txtTARGET_LINK_LIBRARIES(main hello)
TARGET_LINK_LIBRARIES(main libhello.so) hello libhello.
buildcmake ..make libhello main build/src mainHello World
mainldd src/main linux-gate.so.1 => (0xb7ee7000) libhello.so.1 => /usr/lib/libhello.so.1 (0xb7ece000) libc.so.6 => /lib/libc.so.6 (0xb7d77000) /lib/ld-linux.so.2 (0xb7ee8000)
main libhellolibhello.so.1
TARGET_LINK_LIBRRARIES:TARGET_LINK_LIBRARIES(main libhello.a)
mainldd src/main linux-gate.so.1 => (0xb7fa8000) libc.so.6 => /lib/libc.so.6 (0xb7e3a000) /lib/ld-linux.so.2 (0xb7fa9000)
main libhello.a
6 CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH
cmake bash export csh setCMAKE_INCLUDE_PATH=/home/include cmake ..
autotools--extra-include-dir(/usr/include, /usr/local/include)
hello.h/usr/include/hello
INCLUDE_DIRECTORIES(/usr/include/hello)
CMAKE_INCLUDE_PATH bash
export CMAKE_INCLUDE_PATH=/usr/include/hello INCLUDE_DIRECTORIES(/usr/include/hello)FIND_PATH(myHeader hello.h)IF(myHeader)INCLUDE_DIRECTORIES(${myHeader})ENDIF(myHeader)
FIND_PATHFIND_PATH(myHeader NAMES hello.h PATHS /usr/include /usr/include/hello)cmake hello.h CMAKE_INCLUDE_PATH
FIND_PATHCMAKE_INCLUDE_PATH-ICMAKE_LIBRARY_PATH FIND_LIBRARY FIND_ FIND_ cmake
7
: INCLUDE_DIRECTORIES LINK_DIRECTORIES TARGET_LINK_LIBRARIES
cmake pkgconfig
cmake cmakecmake cmake .
CMAKE
cmake
cmake${} IF${}
cmake PROJECT_BINARY_DIR_SOURCE_DIR
SET:SET(HELLO_SRC main.SOURCE_PATHc) PROJECT_BINARY_DIR${HELLO_SRC}.
cmake1CMAKE_BINARY_DIR PROJECT_BINARY_DIR _BINARY_DIR in source out-of-sourcePROJECT_BINARY_DIR
CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR _SOURCE_DIR
in source CMAKE_BINARY_DIRPROJECT_SOURCE_DIR
CMAKE_CURRENT_SOURCE_DIR CMakeLists.txt src
CMAKE_CURRRENT_BINARY_DIR in-source CMAKE_CURRENT_SOURCE_DIR out-of-source target ADD_SUBDIRECTORY(src bin) SET(EXECUTABLE_OUTPUT_PATH )
CMAKE_CURRENT_LIST_FILE CMakeLists.txt
CMAKE_CURRENT_LIST_LINE
7CMAKE_MODULE_PATH cmake cmake cmake cmakeCMakeLists.txt SET cmake
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) INCLUDE
EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH
9PROJECT_NAME PROJECT
cmake$ENV{NAME}
MESSAGE(STATUS HOME dir: $ENV{HOME})
SET(ENV{} )
1,CMAKE_INCLUDE_CURRENT_DIR CMAKE_CURRENT_BINARY_DIR CMAKE_CURRENT_SOURCE_DIR CMakeLists.txt CMakeLists.txtINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
2,CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
3,CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH
1,CMAKE_MAJOR_VERSIONCMAKE 2.4.6 22,CMAKE_MINOR_VERSIONCMAKE 2.4.6 43,CMAKE_PATCH_VERSIONCMAKE 2.4.6 64,CMAKE_SYSTEM Linux-2.6.225,CMAKE_SYSTEM_NAME Linux6,CMAKE_SYSTEM_VERSION 2.6.227,CMAKE_SYSTEM_PROCESSOR i686.8,UNIX UNIX TRUE OS X cygwin9,WIN32 win32 TRUE cygwin
1CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS IF ELSE
2BUILD_SHARED_LIBS ADD_LIBRARY
SET(BUILD_SHARED_LIBS ON)CMAKE_C_FLAGS C ADD_DEFINITIONS()4CMAKE_CXX_FLAGS C++ ADD_DEFINITIONS()
cmake cmake cmake cmake cmake KDE4
cmake
cmake cmake cmake autotoolscmakePROJECTADD_EXECUTABLEINSTALLADD_SUBDIRECTORYSUBDIRSINCLUDE_DIRECTORIESLINK_DIRECTORIESTARGET_LINK_LIBRARIESSET cmake cmake man pageINSTALL()
1ADD_DEFINITIONS C/C++-D:ADD_DEFINITIONS(-DENABLE_DEBUG -DABC)#ifdef ENABLE_DEBUG #endif CMAKE_C_FLAGS CMAKE_CXX_FLAGS
ADD_DEPENDENCIES target target target target
ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...)
ADD_EXECUTABLEADD_LIBRARYADD_SUBDIRECTORY
ADD_TEST ENABLE_TESTINGENABLE_TESTING Makefile testENABLE_TESTING()CMakeLists.txt.
ADD_TEST:ADD_TEST(testname Exename arg1 arg2 ...)testname testExename CMakeLists.txtENABLE_TESTING() ADD_TEST
Helloworld CMakeLists.txtADD_TEST(mytest ${PROJECT_BINARY_DIR}/bin/main)ENABLE_TESTING()
Makefile make test
AUX_SOURCE_DIRECTORY
AUX_SOURCE_DIRECTORY(dir VARIABLE) cmake
AUX_SOURCE_DIRECTORY(. SRC_LIST)ADD_EXECUTABLE(main ${SRC_LIST})
FOREACH LIST
6CMAKE_MINIMUM_REQUIRED CMAKE_MINIMUM_REQUIRED(VERSION versionNumber [FATAL_ERROR]) CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR) cmake 2.5
7EXEC_PROGRAM CMakeLists.txt Makefile
EXEC_PROGRAM(Executable [directory in which to run] [ARGS ] [OUTPUT_VARIABLE ] [RETURN_VALUE ]) ARGSOUTPUT_VARIABLE RETURN_VALUE. CMakeLists.txt
src ls
src/CMakeLists.txtEXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE LS_RVALUE)IF(not LS_RVALUE)MESSAGE(STATUS "ls result: " ${LS_OUTPUT})ENDIF(not LS_RVALUE)
cmake Makefile ls 0 ls *.c IF
8FILE: FILE(WRITE filename "message to write"... ) FILE(APPEND filename "message to write"... ) FILE(READ filename variable) FILE(GLOB variable [RELATIVE path] [globbing expressions]...) FILE(GLOB_RECURSE variable [RELATIVE path] [globbing expressions]...) FILE(REMOVE [directory]...) FILE(REMOVE_RECURSE [directory]...) FILE(MAKE_DIRECTORY [directory]...) FILE(RELATIVE_PATH variable directory file) FILE(TO_CMAKE_PATH path result) FILE(TO_NATIVE_PATH path result)
9INCLUDE CMakeLists.txt cmake. INCLUDE(file1 [OPTIONAL]) INCLUDE(module [OPTIONAL])OPTIONAL CMAKE_MODULE_PATH
INCLUDE
INSTALLINSTALL
FIND_FIND_
FIND_FILE( name1 path1 path2 ...)VAR
FIND_LIBRARY( name1 path1 path2 ...)VAR
FIND_PATH( name1 path1 path2 ...)VAR
FIND_PROGRAM( name1 path1 path2 ...)VAR
FIND_PACKAGE( [major.minor] [QUIET] [NO_MODULE] [[REQUIRED|COMPONENTS] [componets...]]) CMAKE_MODULE_PATH Find.cmake Find SET(CMAKE_MODULE_PATH dir) FIND_PACKAGE Find
FIND_LIBRARYFIND_LIBRARY(libX X11 /usr/lib)IF(NOT libX)MESSAGE(FATAL_ERROR libX not found)ENDIF(NOT libX)
1,IF IF(expression) # THEN section. COMMAND1(ARGS ...)
COMMAND2(ARGS ...) ... ELSE(expression) # ELSE section. COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... ENDIF(expression) ELSEIF IFENDIF. ELSEIFENDIF
:IF(var)0N, NO, OFF, FALSE, NOTFOUND_NOTFOUND
IF(NOT var )
IF(var1 AND var2)
IF(var1 OR var2)
IF(COMMAND cmd) cmd
IF(EXISTS dir) IF(EXISTS file)
IF(file1 IS_NEWER_THAN file2) file1 file2 file1/file2
IF(IS_DIRECTORY dirname) dirname
IF(variable MATCHES regex)IF(string MATCHES regex) regexIF("hello" MATCHES "ell")MESSAGE("true")ENDIF("hello" MATCHES "ell")
IF(variable LESS number)IF(string LESS number)IF(variable GREATER number)IF(string GREATER number)IF(variable EQUAL number)IF(string EQUAL number)
IF(variable STRLESS string)IF(string STRLESS string)IF(variable STRGREATER string)IF(string STRGREATER string)IF(variable STREQUAL string)IF(string STREQUAL string).IF(DEFINED variable)
IF(WIN32)MESSAGE(STATUS This is windows.)# Windows
ELSE(WIN32)MESSAGE(STATUS This is not windows)# Windows
ENDIF(WIN32)
ELSE(WIN32)
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS
SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON):IF(WIN32)ELSE()ENDIF()
ELSEIF:IF(WIN32)#do something related to WIN32ELSEIF(UNIX)#do something related to UNIXELSEIF(APPLE)#do something related to APPLEENDIF(WIN32)
2,WHILEWHILE WHILE(condition) COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... ENDWHILE(condition) IF3,FOREACHFOREACH1 FOREACH(loop_var arg1 arg2 ...) COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... ENDFOREACH(loop_var) AUX_SOURCE_DIRECTORYAUX_SOURCE_DIRECTORY(. SRC_LIST)FOREACH(F ${SRC_LIST})
MESSAGE(${F})ENDFOREACH(F)
2FOREACH(loop_var RANGE total)ENDFOREACH(loop_var) 0 total
FOREACH(VAR RANGE 10)MESSAGE(${VAR})ENDFOREACH(VAR)
012345678910
FOREACH(loop_var RANGE start stop [step])ENDFOREACH(loop_var) start stop step
FOREACH(A RANGE 5 15 3)MESSAGE(${A})ENDFOREACH(A)
581114
ENDFOREACH
cmake${}
cmake
cmake Find Find INCLUDEFIND_PACKAGE
cmakecmake cmake. cmake FindCURL libhello FindHello.cmake
FindCURL/backup/cmake t5 CURL src src/main.c
#include #include #include #include FILE *fp;int write_data(void *ptr, size_t size, size_t nmemb, void *stream){int written = fwrite(ptr, size, nmemb, (FILE *)fp);return written;}int main(){const char * path = /tmp/curl-test;const char * mode = w;fp = fopen(path,mode);curl_global_init(CURL_GLOBAL_ALL);CURLcode res;CURL *curl = curl_easy_init();curl_easy_setopt(curl, CURLOPT_URL, http://www.linux-ren.org);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);res = curl_easy_perform(curl);curl_easy_cleanup(curl);} curl www.linux-ren.org/tmp/curl-test
CMakeLists.txtPROJECT(CURLTEST)ADD_SUBDIRECTORY(src)
src/CMakeLists.txtADD_EXECUTABLE(curltest main.c)
curl
1 INCLUDE_DIRECTORIES TARGET_LINK_LIBRARIES src/CMakeLists.txtINCLUDE_DIRECTORIES(/usr/include)TARGET_LINK_LIBRARIES(curltest curl) build
cmake FindCURL 2 FindCURL src/CMakeLists.txt
FIND_PACKAGE(CURL)IF(CURL_FOUND) INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY})ELSE(CURL_FOUND)
MESSAGE(FATAL_ERROR CURL library not found)ENDIF(CURL_FOUND) Find.cmake
_FOUND _INCLUDE_DIR or _INCLUDES _LIBRARY or _LIBRARIES
_FOUND
_FOUND_INCLUDE_DIR INCLUDE_DIRECTORIES_LIBRARY TARGET_LINK_LIBRARIES
_FOUNDSET(mySources viewer.c)SET(optionalSources)
SET(optionalLibs)FIND_PACKAGE(JPEG)IF(JPEG_FOUND) SET(optionalSources ${optionalSources} jpegview.c) INCLUDE_DIRECTORIES( ${JPEG_INCLUDE_DIR} ) SET(optionalLibs ${optionalLibs} ${JPEG_LIBRARIES} ) ADD_DEFINITIONS(-DENABLE_JPEG_SUPPORT)ENDIF(JPEG_FOUND)
IF(PNG_FOUND) SET(optionalSources ${optionalSources} pngview.c) INCLUDE_DIRECTORIES( ${PNG_INCLUDE_DIR} ) SET(optionalLibs ${optionalLibs} ${PNG_LIBRARIES} ) ADD_DEFINITIONS(-DENABLE_PNG_SUPPORT)ENDIF(PNG_FOUND)
ADD_EXECUTABLE(viewer ${mySources} ${optionalSources} )TARGET_LINK_LIBRARIES(viewer ${optionalLibs} JPEG JPEG
FindHello t3 t6 FindHELLO/backup/cmake/ t6 cmake FindHELLO.cmake src1 cmake/FindHELLO.cmakeFIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)FIND_LIBRARY(HELLO_LIBRARY NAMES hello PATH /usr/lib /usr/local/lib) IF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) SET(HELLO_FOUND TRUE)ENDIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY)IF (HELLO_FOUND) IF (NOT HELLO_FIND_QUIETLY) MESSAGE(STATUS "Found Hello: ${HELLO_LIBRARY}")
ENDIF (NOT HELLO_FIND_QUIETLY)ELSE (HELLO_FOUND) IF (HELLO_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find hello library") ENDIF (HELLO_FIND_REQUIRED)ENDIF (HELLO_FOUND)
FIND_PACKAGE FIND_PACKAGE( [major.minor] [QUIET] [NO_MODULE] [[REQUIRED|COMPONENTS] [componets...]]) CURL FIND_PACKAGEQUIET FindHELLO HELLO_FIND_QUIETLY
MESSAGE(STATUS "Found Hello: ${HELLO_LIBRARY}")REQUIREDFindHELLO.cmake HELLO_FIND_REQUIRED HELLO_FOUND, HELLO_INCLUDE_DIR,HELLO_LIBRARY FIND_PACKAGEOK src/main.c#include int main(){
HelloFunc();return 0;
}
src/CMakeLists.txtFIND_PACKAGE(HELLO)IF(HELLO_FOUND) ADD_EXECUTABLE(hello main.c) INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(hello ${HELLO_LIBRARY})ENDIF(HELLO_FOUND) FindHELLO.cmake( cmake) CMakeLists.txtSET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
FindHELLO buildcmake ..
Found Hello: /usr/lib/libhello.so FIND_PACKAGE(HELLO) FIND_PACKAGE(HELLO QUIET),
make:./src/helloHello World
hello library/usr/lib/libhello.x/tmp FindHELLO hello librarycmake ..
FIND_PACKAGE(HELLO) FIND_PACKAGE(HELLO REQUIRED) hello library cmake ..
CMake Error: Could not find hello library. libhello.x Makefile
FindFind cmake cmake GTK QT4