vcpkg 是一个跨平台的 C++ 包管理工具,可以帮助用户在 Windows、 Linux 和 MacOS 上管理 C 和 C++ 库。目前 vcpkg port清单包含上千个 C++ 库,基本能够满足 C++开发者的使用需求。
但难免会遇到需要的库没有被 vcpkg收录的情况,这时候可以自定义 port文件。
这里用 安装 NVIDIA 的 CUTLASS
为例。
CUTLASS
是一个 CUDA C++ 模板库,用于在 CUDA 中 实现 所有等级的 高性能矩阵乘法 (GEMM)。CUTLASS 本身是一个 头文件模板库,使用的话只需要 包含头文件,无需链接操作。如果需要和 vcpkg管理的库方便的集成,可以自定义 vcpkg库安装文件。
在 目录 ${vcpkgDIR}/ports
创建目录 cutlass(vcpkgDIR代表 vcpkg的安装目录)。
在 ${vcpkgDIR}/ports/cutlass
创建 文件 vcpkg.json
内容如下
{
"name": "cutlass",
"version-string": "v2.4.0",
"description": "CUTLASS is a collection of CUDA C++ template abstractions for implementing high-performance matrix-multiplication (GEMM) at all levels and scales within CUDA."
}
之后使用 vcpkg format-manifest ports/cutlass/vcpkg.json
.
编写 portfile.cmake
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO NVIDIA/cutlass
REF v2.4.0
SHA512 4ef625ccb47e25f033754848f8b02680281760b2d8afd6ffd2ec2392ae7c6809889e6559e387de472cc833f8cf029540bc5dcd9d1751bf0b2b33e91464e8e645
HEAD_REF master
)
vcpkg_from_github
vcpkg 通过这个设置从 github 上下载源码 下载地址是 https://github.com/${REPO}/archive/${REF}.tar.gz.
可以使用 vcpkg hash <file> [alg]
命令计算文件的 sha512.
vcpkg_configure_cmake(
SOURCE_PATH ${SOURCE_PATH}
PREFER_NINJA
OPTIONS
-DCUTLASS_NVCC_ARCHS=75
-DCUTLASS_ENABLE_HEADERS_ONLY=ON
)
用于配置 cmake选项 ,由于我只需要安装 头文件,不需要 编译 test 和 example,所以设置了 -DCUTLASS_ENABLE_HEADERS_ONLY=ON
.
余下的配置
vcpkg_install_cmake()
vcpkg_fixup_cmake_targets(CONFIG_PATH lib/cmake) # 应该是目录
file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/test ${CURRENT_PACKAGES_DIR}/debug ${CURRENT_PACKAGES_DIR}/lib)
vcpkg_copy_pdbs()
file(INSTALL ${SOURCE_PATH}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright)
vcpkg_fixup_cmake_targets
用于安装 cmake 搜索文件, config_path 是 *config.cmake
文件的所在目录,默认会被复制到 TARGET_PATH <share/${PORT}>]
file(REMOVE_RECURSE) 用于删除 空目录,和冲突的目录,例如debug/include
配置好之后 直接vcpkg install cutlass
即可。
需要在vcpkg\installed\x64-windows\share\cutlass
目录中 将NvidiaCutlassConfig.cmake
、NvidiaCutlassTargets.cmake
分别改名为 CutlassConfig.cmake
、CutlassTargets.cmake
。
就可以在使用 cutlass
的项目 CMakeLists
中使用以下命令
find_package(cutlass CONFIG REQUIRED)
target_link_libraries(main PRIVATE nvidia::cutlass::cutlass)
2 构建预编译的 cutlass library
修改如下
vcpkg_configure_cmake(
SOURCE_PATH ${SOURCE_PATH}
PREFER_NINJA
OPTIONS
-DCUTLASS_NVCC_ARCHS=75
# -DCUTLASS_ENABLE_HEADERS_ONLY=ON
-DCUTLASS_ENABLE_EXAMPLES=OFF
-DCUTLASS_ENABLE_TOOLS=ON
-DCUTLASS_ENABLE_LIBRARY=ON
-DCUTLASS_ENABLE_PROFILER=OFF
-DCUTLASS_ENABLE_TESTS=OFF
)
vcpkg_fixup_cmake_targets(CONFIG_PATH lib/cmake TARGET_PATH share/NvidiaCutlass) # 应该是目录 ,
${CURRENT_PACKAGES_DIR}/lib)
file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/test ${CURRENT_PACKAGES_DIR}/debug/test
"${CURRENT_PACKAGES_DIR}/debug/include")
The software license must be available at ${CURRENT_PACKAGES_DIR}/share/cutlass/copyright
configure_file("${CURRENT_BUILDTREES_DIR}/C:/INclude/vcpkg/buildtrees/cutlass//LICENSE.txt" "${CURRENT_PACKAGES_DIR}/share/cutlass/copyright" COPYONLY)
由于 cutlass 包产生的cmake 文件 名是 NvidiaCutlass
开头,要改下 target_path。
使用时也需要变更为
find_package(NvidiaCutlass CONFIG REQUIRED)
# Note: 1 target(s) were omitted.
target_link_libraries(main PRIVATE nvidia::cutlass::cutlass nvidia::cutlass::library nvidia::cutlass::tools::util nvidia::cutlass::library_static)
`