CMake Practice

47
Cmake 实践 Cmake Practice --Cjacker

description

cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目

Transcript of CMake Practice

  • 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