install() 用來產生installation rules, 這個章節主要談兩個install指令,install(TARGETS)與install(FILES).cmake的install選像是在3.15之後才支援, 之前的版本請直接用"make install [DESTDIR=<destdir>]
[brook@:~/Projects/cmake/04]$ tree . `-- src |-- CMakeLists.txt |-- Config.h.in |-- hello.c `-- mymath01 |-- CMakeLists.txt |-- mymath01.c `-- mymath01.h 2 directories, 6 files [brook@:~/Projects/cmake/04]$ cat src/CMakeLists.txt # Require a minimum version of cmake. # cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR]) cmake_minimum_required(VERSION 3.10) # Set the name of the project. # project(<PROJECT-NAME< [<anguage-name>...]) # project(<PROJECT-NAME> # [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] # [DESCRIPTION <project-description-string>] # [LANGUAGES <language-name>...]) project(Tutorial VERSION 0.1.2.3 DESCRIPTION "This is Brook 1st CMake Lib") # Add an executable to the project using the specified source files. # add_executable(<name> [WIN32] [MACOSX_BUNDLE] # [EXCLUDE_FROM_ALL] # [source1] [source2 ...]) add_executable(Tutorial hello.c) # option(<variable> "<help_text>" [value]) option(USE_MYMATH "Use tutorial provided math implementation" ON) # configure_file(<input> <output> # [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS | # FILE_PERMISSIONS <permissions>...] # [COPYONLY] [ESCAPE_QUOTES] [@ONLY] # [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) # configure a header file to pass some of the CMake settings # to the source code configure_file(Config.h.in Config.h) if (USE_MYMATH) # Add a subdirectory to the build. # add_subdirectory(source_dir [binary_dir] # [EXCLUDE_FROM_ALL]) add_subdirectory(mymath01) # list(APPEND <list> [<element> ...]) # Appends elements to the list. # If no variable named <list> exists in the current # scope its value is treated as empty and the elements # are appended to that empty list. list(APPEND EXTRA_LIBS MyMathLib1) else() list(APPEND EXTRA_LIBS "m") endif() # Specify libraries or flags to use when linking a given target and/or its dependents. # target_link_libraries(<target> # <PRIVATE|PUBLIC|INTERFACE>- ... # [<PRIVATE|PUBLIC|INTERFACE>
- ...]...) target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS}) # Add include directories to a target. # target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] # <INTERFACE|PUBLIC|PRIVATE> [items1...] # [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}") install(TARGETS Tutorial DESTINATION bin) install(FILES "${PROJECT_BINARY_DIR}/Config.h" DESTINATION include) [brook@:~/Projects/cmake/04]$ cat src/mymath01/CMakeLists.txt # Add a library to the project using the specified source files. # add_library(<name> [STATIC | SHARED | MODULE] # [EXCLUDE_FROM_ALL] # source1 [source2 ...]) add_library(MyMathLib1 mymath01.c) # target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] # <INTERFACE|PUBLIC|PRIVATE> [items1...] # [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) # target_include_directories(MyMathLib1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(MyMathLib1 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # install(TARGETS targets... [EXPORT <export-name>] # [RUNTIME_DEPENDENCIES args...|RUNTIME_DEPENDENCY_SET <set-name>] # [[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE| # PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|FILE_SET <set-name>] # [DESTINATION <dir>] # [PERMISSIONS permissions...] # [CONFIGURATIONS [Debug|Release|...]] # [COMPONENT <component>] # [NAMELINK_COMPONENT <component>] # [OPTIONAL] [EXCLUDE_FROM_ALL] # [NAMELINK_ONLY|NAMELINK_SKIP] # ] [...] # [INCLUDES DESTINATION [<dir> ...]] install(TARGETS MyMathLib1 DESTINATION lib) # install(<FILES|PROGRAMS> files... # TYPE <type> | DESTINATION <dir> # [PERMISSIONS permissions...] # [CONFIGURATIONS [Debug|Release|...]] # [COMPONENT <component>] # [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL]) install(FILES mymath01.h DESTINATION include) [brook@:~/Projects/cmake/04]$ mkdir build && cd build [brook@:~/Projects/cmake/04/build]$ cmake ../src -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /build/brook/Projects/cmake/04/build [brook@:~/Projects/cmake/04/build]$ cmake --build . Scanning dependencies of target MyMathLib1 [ 25%] Building C object mymath01/CMakeFiles/MyMathLib1.dir/mymath01.c.o [ 50%] Linking C static library libMyMathLib1.a [ 50%] Built target MyMathLib1 Scanning dependencies of target Tutorial [ 75%] Building C object CMakeFiles/Tutorial.dir/hello.c.o /build/brook/Projects/cmake/04/src/hello.c:6:9: note: #pragma message: use mymath #pragma message("use mymath") ^~~~~~~ [100%] Linking C executable Tutorial [100%] Built target Tutorial [brook@:~/Projects/cmake/04/build]$ make install [ 50%] Built target MyMathLib1 [100%] Built target Tutorial Install the project... -- Install configuration: "" -- Installing: /usr/local/bin/Tutorial CMake Error at cmake_install.cmake:47 (file): file INSTALL cannot copy file "/build/brook/Projects/cmake/04/build/Tutorial" to "/usr/local/bin/Tutorial". Makefile:117: recipe for target 'install' failed make: *** [install] Error 1 [brook@:~/Projects/cmake/04/build]$ make install DESTDIR=/build/brook/Projects/cmake [ 50%] Built target MyMathLib1 [100%] Built target Tutorial Install the project... -- Install configuration: "" -- Installing: /build/brook/Projects/cmake/usr/local/bin/Tutorial -- Installing: /build/brook/Projects/cmake/usr/local/include/Config.h -- Installing: /build/brook/Projects/cmake/usr/local/lib/libMyMathLib1.a -- Installing: /build/brook/Projects/cmake/usr/local/include/mymath01.h [brook@:~/Projects/cmake/04/build]$ tree /build/brook/Projects/cmake/usr/ /build/brook/Projects/cmake/usr/ `-- local |-- bin | `-- Tutorial |-- include | |-- Config.h | `-- mymath01.h `-- lib `-- libMyMathLib1.a 4 directories, 4 files
這裡的install主要用了Target/FILES兩個選項, 再搭配DESTINATION參數, DESTINATION是指要安裝到哪個目錄去, 可以是相對路徑或是絕對路徑(relative or absolute paths). 可以透過CMAKE_INSTALL_PREFIX在cmake時設定prefix, 或在make時透過DESTDIR去改變
[brook@:~/Projects/cmake/04/src]$ cmake -DCMAKE_INSTALL_PREFIX=/build/brook/Projects/cmake -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /build/brook/Projects/cmake/04/src [brook@:~/Projects/cmake/04/src]$ cmake --build . Scanning dependencies of target MyMathLib1 [ 25%] Building C object mymath01/CMakeFiles/MyMathLib1.dir/mymath01.c.o [ 50%] Linking C static library libMyMathLib1.a [ 50%] Built target MyMathLib1 Scanning dependencies of target Tutorial [ 75%] Building C object CMakeFiles/Tutorial.dir/hello.c.o /build/brook/Projects/cmake/04/src/hello.c:6:9: note: #pragma message: use mymath #pragma message("use mymath") ^~~~~~~ [100%] Linking C executable Tutorial [100%] Built target Tutorial [brook@:~/Projects/cmake/04/src]$ make install [ 50%] Built target MyMathLib1 [100%] Built target Tutorial Install the project... -- Install configuration: "" -- Installing: /build/brook/Projects/cmake/bin/Tutorial -- Installing: /build/brook/Projects/cmake/include/Config.h -- Installing: /build/brook/Projects/cmake/lib/libMyMathLib1.a -- Installing: /build/brook/Projects/cmake/include/mymath01.h [brook@:~/Projects/cmake/04/src]$ make install DESTDIR=/build/brook/Projects/cmake/04 [ 50%] Built target MyMathLib1 [100%] Built target Tutorial Install the project... -- Install configuration: "" -- Installing: /build/brook/Projects/cmake/04/build/brook/Projects/cmake/bin/Tutorial -- Installing: /build/brook/Projects/cmake/04/build/brook/Projects/cmake/include/Config.h -- Installing: /build/brook/Projects/cmake/04/build/brook/Projects/cmake/lib/libMyMathLib1.a -- Installing: /build/brook/Projects/cmake/04/build/brook/Projects/cmake/include/mymath01.h