说明
之前写了新增头文件库、CMake构建库、MSBuild构建库的示例,但是现实情况中变化总是比较多的,以下列举一些例子来展示应对的方法。
应用patch
有一些库可能在Windows上不能正确编译,需要调整一下代码或者编译配置,但是源代码包又有官方渠道,这就需要打一下代码补丁,譬如freetype库的配置,可以看到对应的方法:
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}
用来获取上述的portfile.cmake
所在路径,vcpkg_apply_patches
即为应用代码补丁的方法。
CMake构建静态库
库是否能够被构建为静态库,是由配置决定的,在支持构建为静态库时,需要查看CMakeLists.txt中控制静态库的选项,譬如curl库的配置:
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
)
根据当前的VCPKG_CRT_LINKAGE
判断,然后设置对应的CURL_STATICLIB
,即可支持静态库创建。
替换源代码中的内容
在一些情况下,需要替换CMakeList.txt等构建脚本或者代码,可以采用类似cairo库的方式:
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)
在构建过程中替换掉原先的文件。
现有Binary库的处理
在一些情况下使用的库是现成的dll和lib,并不需要进行构建,那么库配置portfile.cmake
只需要完成获取和安装步骤即可,类似于头文件库:
譬如opengl库的安装:
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库的安装:
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)