不同编译器下共享库的复用 - VCPKG_DISABLE_COMPILER_TRACKING

  背景

在开启bianrycache 使用vcpkg构建的库,尤其是在多人合作的共享项目中, 不一定能保证每一个人使用一样版本的编译器,迁移或者共享项目时有可能会面对不同编译器或者不同版本的编译器导致的构建失败的问题。这是因为vcpkg有abi 跟踪机制,vcpkg会把当前构建的库所用到的工具和文件的版本以及triplet通过计算得到的哈希值记录到xxx_vcpkg_abi_info.txt 这个文件中,这样当这些库安装的版本比较低的时候,通过比较这个文件,vcpkg会把这些库都重新构建一遍,得到最新的版本。那么在使用不同编译器版本时,如何做到重复利用这些库,而不重新构建这些库呢?

我们可以通过设置选项VCPKG_DISABLE_COMPILER_TRACKING来实现。

使用示例
现有2台机器:一台安装VS2017, 另一台安装VS2022。

在安装VS2017的机器使用vcpkg构建zlib库
1. git clone https://github.com/microsoft/vcpkg
2. cd vcpkg
3. ./bootstrap-vcpkg.bat
4. 打开.\vcpkg\triplets\x64-windows.cmake 文件,设置 VCPKG_DISABLE_COMPILER_TRACKING 为 ON。

set(VCPKG_DISABLE_COMPILER_TRACKING ON)

 5. 安装zlib库

PS F:\vcpkg\clean\vcpkg> ./vcpkg install zlib:x64-windows
Computing installation plan...
The following packages will be built and installed:
  * vcpkg-cmake[core]:x64-windows -> 2022-07-18
    zlib[core]:x64-windows -> 1.2.12#1
Additional packages (*) will be modified to complete this operation.
Restored 0 package(s) from C:\Users\phoebe\AppData\Local\vcpkg\archives in 231.3 us. Use --debug to see more details.
Installing 1/2 vcpkg-cmake:x64-windows...
Building vcpkg-cmake[core]:x64-windows...
-- Installing: F:/VCPKG/clean/vcpkg/packages/vcpkg-cmake_x64-windows/share/vcpkg-cmake/vcpkg_cmake_configure.cmake
-- Installing: F:/VCPKG/clean/vcpkg/packages/vcpkg-cmake_x64-windows/share/vcpkg-cmake/vcpkg_cmake_build.cmake
-- Installing: F:/VCPKG/clean/vcpkg/packages/vcpkg-cmake_x64-windows/share/vcpkg-cmake/vcpkg_cmake_install.cmake
-- Installing: F:/VCPKG/clean/vcpkg/packages/vcpkg-cmake_x64-windows/share/vcpkg-cmake/vcpkg-port-config.cmake
-- Installing: F:/VCPKG/clean/vcpkg/packages/vcpkg-cmake_x64-windows/share/vcpkg-cmake/copyright
-- Performing post-build validation
-- Performing post-build validation done
Stored binary cache: "C:\Users\phoebe\AppData\Local\vcpkg\archives\b9\b93209b59af62748d713681e093768af8f31524e4b64205ba57efdf36044bbe3.zip"
Elapsed time to handle vcpkg-cmake:x64-windows: 1.054 s
Installing 2/2 zlib:x64-windows...
Building zlib[core]:x64-windows...
-- Using cached madler-zlib-v1.2.12.tar.gz.
-- Cleaning sources at F:/VCPKG/clean/vcpkg/buildtrees/zlib/src/v1.2.12-f2d39b538c.clean. Use --editable to skip cleaning for the packages you specify.
-- Extracting source F:/VCPKG/clean/vcpkg/downloads/madler-zlib-v1.2.12.tar.gz
-- Applying patch cmake_dont_build_more_than_needed.patch
-- Applying patch 0001-Prevent-invalid-inclusions-when-HAVE_-is-set-to-0.patch
-- Applying patch debug-postfix-mingw.patch
-- Applying patch 0002-android-build-mingw.patch
-- Using source at F:/VCPKG/clean/vcpkg/buildtrees/zlib/src/v1.2.12-f2d39b538c.clean
-- Configuring x64-windows
-- Building x64-windows-dbg
-- Building x64-windows-rel
-- Installing: F:/VCPKG/clean/vcpkg/packages/zlib_x64-windows/share/zlib/vcpkg-cmake-wrapper.cmake
-- Fixing pkgconfig file: F:/VCPKG/clean/vcpkg/packages/zlib_x64-windows/lib/pkgconfig/zlib.pc
-- Using cached msys-mingw-w64-i686-pkg-config-0.29.2-3-any.pkg.tar.zst.
-- Using cached msys-mingw-w64-i686-libwinpthread-git-9.0.0.6373.5be8fcd83-1-any.pkg.tar.zst.
-- Using msys root at F:/VCPKG/clean/vcpkg/downloads/tools/msys2/9a1ec3f33446b195
-- Fixing pkgconfig file: F:/VCPKG/clean/vcpkg/packages/zlib_x64-windows/debug/lib/pkgconfig/zlib.pc
-- Installing: F:/VCPKG/clean/vcpkg/packages/zlib_x64-windows/share/zlib/copyright
-- Performing post-build validation
-- Performing post-build validation done
Stored binary cache: "C:\Users\phoebe\AppData\Local\vcpkg\archives\3f\3f6d1bff0568fa64072da8158b0dcc8ef9e0c9e23712a4e083ece1833a1137b3.zip"
Elapsed time to handle zlib:x64-windows: 11 s

Total elapsed time: 12.56 s

The package zlib is compatible with built-in CMake targets:

    find_package(ZLIB REQUIRED)
    target_link_libraries(main PRIVATE ZLIB::ZLIB)

在安装VS2022的机器上复用从VS2017上安装的库

1. git clone https://github.com/microsoft/vcpkg
2. cd vcpkg
3. ./bootstrap-vcpkg.bat
4. 打开.\vcpkg\triplets\x64-windows.cmake 文件,设置VCPKG_DISABLE_COMPILER_TRACKING 为 ON

set(VCPKG_DISABLE_COMPILER_TRACKING ON)

5. 把 C:\Users\phoebe\AppData\Local\vcpkg\archives (VS2017)文件夹拷贝到 C:\Users\hui\AppData\Local\vcpkg\ (VS2022)。在实际的项目中可以放入共享目录,只需要指定binarycache的目录。

6. 安装zlib库

PS F:\vcpkg\clean\vcpkg> ./vcpkg install zlib:x64-windows
Computing installation plan...
The following packages will be built and installed:
  * vcpkg-cmake[core]:x64-windows -> 2022-07-18
    zlib[core]:x64-windows -> 1.2.12#1
Additional packages (*) will be modified to complete this operation.
Restored 2 package(s) from C:\Users\hui\AppData\Local\vcpkg\archives in 72.36 ms. Use --debug to see more details.
Installing 1/2 vcpkg-cmake:x64-windows...
Elapsed time to handle vcpkg-cmake:x64-windows: 12.85 ms
Installing 2/2 zlib:x64-windows...
Elapsed time to handle zlib:x64-windows: 73.67 ms

Total elapsed time: 470.6 ms

The package zlib is compatible with built-in CMake targets:

    find_package(ZLIB REQUIRED)
    target_link_libraries(main PRIVATE ZLIB::ZLIB)

 

通过日志可以发现,vcpkg-cmake 与zlib 并没有重新构建,而是直接复用了从安装VS2017的机器上拷贝过来的二进制文件,从而为用户节省了时间,原本需要12.56s, 现在只需要 470.6ms。这对于源文件比较大且构建时间较长的库有很大的意义,比如 qt,vtk,llvm 这些库, 能节省很多时间。

注意: 

在实际使用中,如果发现设置了这个变量后,使用的库还是被重新构建,那么,可以通过对比binary cache share 目录中的 vcpkg_abi_info.txt和当前构件库所生成的 vcpkg_abi_info.txt 文件来查找是哪一个部分引起的。

在vcpkg_abi_info.txt文件中, 特别注意triplet_abi 哈希值是由Triplet 文件,Toolchain 文件,Compiler 信息这三部分依次计算所得,如果设置VCPKG_DISABLE_COMPILER_TRACKING 为ture 后,它只会计算记录 Triplet 和 Toolchain 文件的哈希值。

posted @ 2022-09-30 11:12  vcpkg_C++包管理器  阅读(361)  评论(1编辑  收藏  举报