Vcpkg新增库方法拾遗

说明

之前写了新增头文件库、CMake构建库、MSBuild构建库的示例,但是现实情况中变化总是比较多的,以下列举一些例子来展示应对的方法。

应用patch

有一些库可能在Windows上不能正确编译,需要调整一下代码或者编译配置,但是源代码包又有官方渠道,这就需要打一下代码补丁,譬如freetype库的配置,可以看到对应的方法:

Vcpkg新增库方法拾遗_第1张图片
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)

你可能感兴趣的:(Vcpkg新增库方法拾遗)