國家建設(shè)局網(wǎng)站app推廣怎么做
一、簡介
install命令用于指定安裝時的規(guī)則,由于安裝命令比較復(fù)雜,這里做一部分內(nèi)容的介紹,后續(xù)用到再繼續(xù)完善。
1.命令簡介
本文檔基于3.20,目前有6種安裝方式。
install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
首先是通用參數(shù):
1.1 DESTINATION
指定安裝的目標(biāo)目錄。參數(shù)后接路徑,可以是相對路徑也可以是絕對路徑。
相對路徑則是相對于CMAKE_INSTALL_PREFIX變量值。也可以在安裝時通過DESTDIR修改。
make DESTDIR=/package/stage install
實(shí)際上,上述方式是在UNIX系統(tǒng)下,而更加常用的是使用--prefix選項(xiàng)
cmake --install binPath --prefix="destPath"
1.2 PERMISSIONS
指定被安裝文件的權(quán)限。包括OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_WRITE, GROUP_EXECUTE, WORLD_READ, WORLD_WRITE, WORLD_EXECUTE, SETUID, 和 SETGID。對于平臺中不支持的權(quán)限則忽略。
1.3 CONFIGURATIONS
指定一個構(gòu)建配置的列表(Debug,Release等),作用于之后的內(nèi)容,不對之前的內(nèi)容不生效。
對于這個參數(shù),必須要提到的是,cmake的安裝動作(配置)是由外部控制的:
cmake --install srcPath --config Debug|Release...
通過上述命令中的--config參數(shù),來控制執(zhí)行安裝Debug內(nèi)容還是Release內(nèi)容。
而對于當(dāng)前配置CONFIGURATIONS則是表示其后內(nèi)容隸屬的動作(在Debug,Release還是其他動作時執(zhí)行)。比如下面的例子:
install(TARGETS ${PROJECT_NAME} CONFIGURATIONS ReleaseARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/lib/ReleaseLIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/lib/ReleaseCONFIGURATIONS DebugRUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/bin/Debug)
則表示執(zhí)行
cmake --install srcPath --config Debug
命令時,只安裝RUNTIME內(nèi)容,而不安裝ARCHIVE和LIBRARY內(nèi)容。相反的,如果執(zhí)行
cmake --install srcPath --config Release
命令時,只安裝ARCHIVE和LIBRARY內(nèi)容,而不安裝RUNTIME內(nèi)容。
此外,默認(rèn)的安裝動作和安裝配置都是Release的。
1.4 COMPONENT
指定安裝的組件名。目前還不確定組件的創(chuàng)建方式,等待后續(xù)完善。
1.5 EXCLUDE_FROM_ALL
不安裝的內(nèi)容。
1.6 RENAME
1.7 OPTIONAL
表示此安裝命令為可選項(xiàng),找不到也不會報錯。
二、Installing Targets
install(TARGETS targets... [EXPORT <export-name>][[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE][DESTINATION <dir>][PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>][NAMELINK_COMPONENT <component>][OPTIONAL] [EXCLUDE_FROM_ALL][NAMELINK_ONLY|NAMELINK_SKIP]] [...][INCLUDES DESTINATION [<dir> ...]])
1.支持的target
1.1 ARCHIVE
靜態(tài)庫(除了macOS)、dll導(dǎo)入庫(也就是dll對應(yīng)的lib文件)
1.2 LIBRARY
共享庫(lib文件,不包括dll文件)
1.3 RUNTIME
可執(zhí)行文件,dll文件。
1.4 OBJECTS
對象庫的對象文件。參考add_library中的object library。
1.5 FRAMEWORK、BUNDLE、PUBLIC_HEADER、PRIVATE_HEADER、RESOURCE
這些都是與apple平臺相關(guān)的內(nèi)容,沒有環(huán)境,不做解釋。
其中PUBLIC_HEADER、PRIVATE_HEADER、RESOURCE官文解釋非apple平臺也有效,但是實(shí)際使用時沒有反應(yīng)。
HEADER使用方式:
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER src/hello.h)install(TARGETS ${PROJECT_NAME} PUBLIC_HEADER DESTINATION ${PROJECT_SOURCE_DIR}/include)
2 其他參數(shù)
2.1 NAMELINK_COMPONENT、NAMELINK_ONLY、NAMELINK_SKIP
component相關(guān)。
2.2 EXPORT
將庫名導(dǎo)出,與install(EXPORT)共同作用,將target導(dǎo)出。
2.3 INCLUDES DESTINATION
在執(zhí)行install(EXPORT)命令進(jìn)行導(dǎo)出時,將指定目錄列表添加到target的屬性INTERFACE_INCLUDE_DIRECTORIES中。
最后,對于install(targets)命令而言,一條install可以安裝多個target,而一個target也有可能被install多次(都生效,而不是覆蓋)。
三、Installing Files
install(<FILES|PROGRAMS> files...TYPE <type> | DESTINATION <dir>[PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>][RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
1.FILES | PROGRAMS
兩者都是安裝文件,只不過FILES安裝后的文件默認(rèn)權(quán)限為OWNER_WRITE, OWNER_READ, GROUP_READ和WORLD_READ(如果設(shè)置了PERMISSIONS則按PERMISSIONS來);而對PROGRAMS而言,還多了OWNER_EXECUTE, GROUP_EXECUTE和WORLD_EXECUTE三個權(quán)限。
安裝的文件內(nèi)容,可以是生成器表達(dá)式$<...>,但是以任何表達(dá)式開始的文件都要求是完整路徑(實(shí)際上不是表達(dá)式也需要全路徑)。
2.TYPE | DESTINATION
兩者用于指定文件安裝的目標(biāo)目錄,兩者不能同事存在。如果使用TYPE的話則會指定文件的類型,并從GNUInstallDirs中獲取相應(yīng)的變量,而如果沒有定義此變量則使用內(nèi)置的默認(rèn)值。下表則是文件類型對應(yīng)的變量和默認(rèn)路徑。
TYPE Argument | GNUInstallDirs Variable | Built-In Default |
BIN | ${CMAKE_INSTALL_BINDIR} | bin |
SBIN | ${CMAKE_INSTALL_SBINDIR} | sbin |
LIB | ${CMAKE_INSTALL_LIBDIR} | lib |
INCLUDE | ${CMAKE_INSTALL_INCLUDEDIR} | include |
SYSCONF | ${CMAKE_INSTALL_SYSCONFDIR} | etc |
SHAREDSTATE | ${CMAKE_INSTALL_SHARESTATEDIR} | com |
LOCALSTATE | ${CMAKE_INSTALL_LOCALSTATEDIR} | var |
RUNSTATE | ${CMAKE_INSTALL_RUNSTATEDIR} | <LOCALSTATEdir>/run |
DATA | ${CMAKE_INSTALL_DATADIR} | <DATAROOTdir> |
INFO | ${CMAKE_INSTALL_INFODIR} | <DATAROOTdir>/info |
LOCALE | ${CMAKE_INSTALL_LOCALEDIR} | <DATAROOTdir>/locale |
MAN | ${CMAKE_INSTALL_MANDIR} | <DATAROOTdir>/man |
DOC | ${CMAKE_INSTALL_DOCDIR} | <DATAROOTdir>/doc |
如果提供了DESTINATION參數(shù),則使用DESTINATION參數(shù)提供的目錄。
四、Installing Directories
install(DIRECTORY dirs...TYPE <type> | DESTINATION <dir>[FILE_PERMISSIONS permissions...][DIRECTORY_PERMISSIONS permissions...][USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>] [EXCLUDE_FROM_ALL][FILES_MATCHING][[PATTERN <pattern> | REGEX <regex>][EXCLUDE] [PERMISSIONS permissions...]] [...])
用于安裝一個或多個目錄到目標(biāo)目錄,目錄結(jié)構(gòu)被完整的拷貝。每個目錄的最后一項(xiàng)會被添加到目標(biāo)目錄,如果不想這樣則可以以/結(jié)尾,表示最后一項(xiàng)為空。
#表示將build目錄下的內(nèi)容安裝到test目錄下
install(DIRECTORY ${PROJECT_SOURCE_DIR}/build/
DESTINATION ${PROJECT_SOURCE_DIR}/test)#表示將build目錄的內(nèi)容安裝到test目錄下
install(DIRECTORY ${PROJECT_SOURCE_DIR}/build
DESTINATION ${PROJECT_SOURCE_DIR}/test)
如果輸入目錄為空,則創(chuàng)建目標(biāo)目錄,且內(nèi)容為空。
1.權(quán)限
FILE_PERMISSIONS、DIRECTORY_PERMISSIONS 、USE_SOURCE_PERMISSIONS三者用于控制目標(biāo)目錄(DIRECTORY_PERMISSIONS)和文件(FILE_PERMISSIONS)的權(quán)限。如果使用了USE_SOURCE_PERMISSIONS,而FILE_PERMISSIONS沒有指定,則文件權(quán)限與源文件權(quán)限一樣。
如果沒有指定FILE_PERMISSIONS權(quán)限,則文件的權(quán)限與FILES命令的權(quán)限一樣(OWNER_WRITE, OWNER_READ, GROUP_READ和WORLD_READ),而目錄權(quán)限與PROGRAMS一樣(OWNER_WRITE, OWNER_READ, GROUP_READ,WORLD_READ,OWNER_EXECUTE, GROUP_EXECUTE和WORLD_EXECUTE)
2.過濾
目錄的安裝可以通過PATTERN和REGEX選項(xiàng)細(xì)粒度的控制,其中PATTERN匹配完整文件名,REGEX默認(rèn)匹配文件名中的任何一部分(可以通過/或者$實(shí)現(xiàn)與PATTERN相同的效果)。
默認(rèn)情況下,所有文件和目錄都會被install(不論P(yáng)ATTERN和REGEX的匹配結(jié)果),但是我們可以通過設(shè)置FILES_MATCHING過濾沒有匹配的文件。
#目錄全部拷貝,安裝以target開始的文件
install(DIRECTORY ${PROJECT_SOURCE_DIR}/build/ DESTINATION ${PROJECT_SOURCE_DIR}/test
FILES_MATCHINGPATTERN "target*")#目錄全部拷貝,只安裝target文件
install(DIRECTORY ${PROJECT_SOURCE_DIR}/build/ DESTINATION ${PROJECT_SOURCE_DIR}/test
FILES_MATCHINGPATTERN "target")#目錄全部拷貝,安裝文件名包含target的文件
install(DIRECTORY ${PROJECT_SOURCE_DIR}/build/ DESTINATION ${PROJECT_SOURCE_DIR}/test
FILES_MATCHINGREGEX "target")#REGEX通過前綴$或后綴/達(dá)到與PATTERN相同的效果
install(DIRECTORY ${PROJECT_SOURCE_DIR}/build/ DESTINATION ${PROJECT_SOURCE_DIR}/test
FILES_MATCHINGREGEX "target/")
install(DIRECTORY ${PROJECT_SOURCE_DIR}/build/ DESTINATION ${PROJECT_SOURCE_DIR}/test
FILES_MATCHINGREGEX "$target")
五、Installing Exports
install(EXPORT <export-name> DESTINATION <dir>[NAMESPACE <namespace>] [[FILE <name>.cmake]|[PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][EXPORT_LINK_INTERFACE_LIBRARIES][COMPONENT <component>][EXCLUDE_FROM_ALL])
生成并安裝一個CMake文件,該文件包含了將targets從安裝目錄中導(dǎo)入到其他項(xiàng)目的代碼。安裝的內(nèi)容是跟上面install(TARGETS)中EXPORT的選項(xiàng)一樣。
NAMESPACE選項(xiàng)將在目標(biāo)名被寫入導(dǎo)入文件時在前面添加<namespace>。默認(rèn)生成的文件為<export-name>.cmake,而FILE選項(xiàng)可以將其設(shè)置為其他名字,這個名字必須以.cmake結(jié)尾。
下面是一個簡單的例子:
創(chuàng)建一個項(xiàng)目hello:
cmake_minimum_required(VERSION 3.20)
project(target01 VERSION 1.0.0)
file(GLOB SOURCES "src/*")set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/../helloPkg/)add_library(${PROJECT_NAME} SHARED ${SOURCES})set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER src/hello.h)install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}ARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/../helloPkg/lib/ReleaseRUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/../helloPkg/bin/ReleasePUBLIC_HEADER DESTINATION ${PROJECT_SOURCE_DIR}/../helloPkg/include)# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmakeinstall(EXPORT ${PROJECT_NAME} DESTINATION ${PROJECT_SOURCE_DIR}/../helloPkg/lib/cmake/${PROJECT_NAME}NAMESPACE TEST::)
configure_file(${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.cmake.in ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmakeDESTINATION ${PROJECT_SOURCE_DIR}/../helloPkg/lib/cmake/${PROJECT_NAME})
同目錄下創(chuàng)建src文件夾,并創(chuàng)建:
class __declspec(dllexport) Hello
{
public:void print();
};
#include "hello.h"
#include <iostream>void Hello::print() {std::cout << "hello world!" << std::endl;
}
CMakeLists.txt統(tǒng)計目錄下創(chuàng)建target01.cmake.in:
@PACKAGE_INIT@include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@.cmake")
然后在hello同級目錄下創(chuàng)建main項(xiàng)目
cmake_minimum_required(VERSION 3.20)
project(main)set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/../helloPkg/lib/cmake)
set(target01_DIR ${PROJECT_SOURCE_DIR}/../helloPkg/lib/cmake/target01/)find_package(target01 REQUIRED PATHS ${PROJECT_SOURCE_DIR}/../helloPkg/)
add_executable(${PROJECT_NAME} src/main.cpp)target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/../helloPkg/include)
target_link_libraries(${PROJECT_NAME} PRIVATE TEST::target01)
創(chuàng)建src目錄并創(chuàng)建main.cpp
#include "hello.h"int main()
{Hello h;h.print();return 0;
}
最后,在main項(xiàng)目同級目錄下創(chuàng)建helloPkg文件夾。
這里雖然沒搞懂中間的configure_file和*.cmake.in文件的作用,但是試出來了,先記一下。