說(shuō)明
之前寫了新增頭文件庫(kù)滓窍、CMake構(gòu)建庫(kù)、MSBuild構(gòu)建庫(kù)的示例,但是現(xiàn)實(shí)情況中變化總是比較多的校哎,以下列舉一些例子來(lái)展示應(yīng)對(duì)的方法。
應(yīng)用patch
有一些庫(kù)可能在Windows上不能正確編譯,需要調(diào)整一下代碼或者編譯配置闷哆,但是源代碼包又有官方渠道腰奋,這就需要打一下代碼補(bǔ)丁,譬如freetype庫(kù)的配置抱怔,可以看到對(duì)應(yīng)的方法:
vcpkg_apply_patches(
SOURCE_PATH ${SOURCE_PATH}
PATCHES ${CMAKE_CURRENT_LIST_DIR}/0001-Support-Windows-DLLs-via-CMAKE_WINDOWS_EXPORT_ALL_SY.patch
${CMAKE_CURRENT_LIST_DIR}/0002-Add-CONFIG_INSTALL_PATH-option.patch
)
其中${CMAKE_CURRENT_LIST_DIR}
用來(lái)獲取上述的portfile.cmake
所在路徑劣坊,vcpkg_apply_patches
即為應(yīng)用代碼補(bǔ)丁的方法。
CMake構(gòu)建靜態(tài)庫(kù)
庫(kù)是否能夠被構(gòu)建為靜態(tài)庫(kù)屈留,是由配置決定的局冰,在支持構(gòu)建為靜態(tài)庫(kù)時(shí),需要查看CMakeLists.txt中控制靜態(tài)庫(kù)的選項(xiàng)灌危,譬如curl庫(kù)的配置:
if (VCPKG_CRT_LINKAGE STREQUAL dynamic)
SET(CURL_STATICLIB OFF)
else()
SET(CURL_STATICLIB ON)
endif()
vcpkg_configure_cmake(
SOURCE_PATH ${SOURCE_PATH}
OPTIONS
-DBUILD_TESTING=OFF
-DBUILD_CURL_EXE=OFF
-DENABLE_MANUAL=OFF
-DCURL_STATICLIB=${CURL_STATICLIB}
OPTIONS_DEBUG
-DENABLE_DEBUG=ON
)
根據(jù)當(dāng)前的VCPKG_CRT_LINKAGE
判斷,然后設(shè)置對(duì)應(yīng)的CURL_STATICLIB
康二,即可支持靜態(tài)庫(kù)創(chuàng)建。
替換源代碼中的內(nèi)容
在一些情況下勇蝙,需要替換CMakeList.txt等構(gòu)建腳本或者代碼沫勿,可以采用類似cairo庫(kù)的方式:
vcpkg_extract_source_archive(${ARCHIVE})
file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt DESTINATION ${SOURCE_PATH})
file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_cairo.txt DESTINATION ${SOURCE_PATH}/src)
file(RENAME ${SOURCE_PATH}/src/CMakeLists_cairo.txt ${SOURCE_PATH}/src/CMakeLists.txt)
file(COPY ${CURRENT_PORT_DIR}/cairo-features.h DESTINATION ${SOURCE_PATH}/src)
在構(gòu)建過(guò)程中替換掉原先的文件。
現(xiàn)有Binary庫(kù)的處理
在一些情況下使用的庫(kù)是現(xiàn)成的dll和lib味混,并不需要進(jìn)行構(gòu)建产雹,那么庫(kù)配置portfile.cmake
只需要完成獲取和安裝步驟即可,類似于頭文件庫(kù):
譬如opengl庫(kù)的安裝:
file(MAKE_DIRECTORY
${CURRENT_PACKAGES_DIR}/include/gl
${CURRENT_PACKAGES_DIR}/lib
${CURRENT_PACKAGES_DIR}/debug/lib
${CURRENT_PACKAGES_DIR}/share/opengl
)
file(COPY ${LICENSEPATH} DESTINATION ${CURRENT_PACKAGES_DIR}/include/gl)
file(COPY
"${HEADERSPATH}\\gl\\GL.h"
"${HEADERSPATH}\\gl\\GLU.h"
DESTINATION ${CURRENT_PACKAGES_DIR}/include
)
file(COPY ${OPENGLPATH} DESTINATION ${CURRENT_PACKAGES_DIR}/lib)
file(COPY ${OPENGLPATH} DESTINATION ${CURRENT_PACKAGES_DIR}/debug/lib)
file(COPY ${LICENSEPATH} DESTINATION ${CURRENT_PACKAGES_DIR}/share/opengl)
或者是tbb庫(kù)的安裝:
file(COPY
${LIB_PATH}/tbb.lib
${LIB_PATH}/tbb_preview.lib
${LIB_PATH}/tbbmalloc.lib
${LIB_PATH}/tbbmalloc_proxy.lib
${LIB_PATH}/tbbproxy.lib
${LIB_PATH}/tbbproxy.pdb
DESTINATION ${CURRENT_PACKAGES_DIR}/lib)
file(COPY
${LIB_PATH}/tbb_debug.lib
${LIB_PATH}/tbb_preview_debug.lib
${LIB_PATH}/tbbmalloc_debug.lib
${LIB_PATH}/tbbmalloc_proxy_debug.lib
${LIB_PATH}/tbbproxy_debug.lib
${LIB_PATH}/tbbproxy_debug.pdb
DESTINATION ${CURRENT_PACKAGES_DIR}/debug/lib)