這邊開始寫了一些 vcpkg 的文章,但是實際上個人還沒真的開始實際使用。至於 vcpkg 到底好不好用?個人只能說碰到的問題其實不少…
像前幾個月在測試 VulkanSceneGraph(GitHub)的時候,想試著用 vcpkg 來建置,在 Windows 環境就出現問題:
CMake Error at scripts/cmake/vcpkg_execute_required_process.cmake:127 (message):
Command failed: "C:/Program Files/CMake/bin/cmake.exe" -E tar xjf S:/vcpkg/downloads/KhronosGroup-Vulkan-Loader-vulkan-sdk-1.4.328.0.tar.gz
Working Directory: S:/vcpkg/buildtrees/vulkan-loader/src/-1.4.328.0-551ad2104d.clean.tmp
Error code: 1
See logs for more information:
S:\vcpkg\buildtrees\vulkan-loader\extract-err.log
嚴格來說,個人會覺得這個問題其實不是 vsg 的問題、而是 Vulkan-Loader(GitHub)的問題。他不知道在想什麼,在測試裡面有一個名為「.def」的檔案(連結)、用來測試 Unicode…
(以你的專案性質、有必要測試這東西嗎?)
結果 vcpkg 在試著要求 cmake 解壓縮檔案的時候,就爆炸了。
而實際上,這個問題好像也不能怪 vcpkg,因為這個似乎算是 CMake 的問題(參考)?(或是說 Windows 糟糕的支援性的問題)
總之,研究了一陣子,後來是決定直接讓 AI 幫忙去改 vcpkg 解壓縮的腳本。
要修改的檔案是 vcpkg 根目錄(%VCPKG_ROOT%)下的「scripts\cmake\vcpkg_extract_source_archive.cmake」這個 CMake 腳本。
本來解壓縮的腳本是寫成:
message(STATUS "Extracting source ${arg_ARCHIVE}") cmake_path(APPEND_STRING source_path ".tmp" OUTPUT_VARIABLE temp_dir) file(REMOVE_RECURSE "${temp_dir}") file(MAKE_DIRECTORY "${temp_dir}") vcpkg_execute_required_process( ALLOW_IN_DOWNLOAD_MODE COMMAND "${CMAKE_COMMAND}" -E tar xjf "${arg_ARCHIVE}" WORKING_DIRECTORY "${temp_dir}" LOGNAME extract )
可以看到這邊是透過 cmake -E tar xjf 來把 .tar.gz 一次解開。
而這邊則是要把它改成用相容性比較好的 7z 來做,修改後是:
vcpkg_find_acquire_program(7Z) message(STATUS "Extracting source ${arg_ARCHIVE}") cmake_path(APPEND_STRING source_path ".tmp" OUTPUT_VARIABLE temp_dir) file(REMOVE_RECURSE "${temp_dir}") file(MAKE_DIRECTORY "${temp_dir}") vcpkg_execute_required_process( ALLOW_IN_DOWNLOAD_MODE COMMAND "${7Z}" x "${arg_ARCHIVE}" -y WORKING_DIRECTORY "${temp_dir}" LOGNAME extract-gz ) file(GLOB TAR_FILES "${temp_dir}/*.tar") list(GET TAR_FILES 0 THE_TAR_FILE) vcpkg_execute_required_process( ALLOW_IN_DOWNLOAD_MODE COMMAND "${7Z}" x "${THE_TAR_FILE}" -y WORKING_DIRECTORY "${temp_dir}" LOGNAME extract-tar ) file(REMOVE "${THE_TAR_FILE}")
這邊會先把 .tar.gz 解壓縮成 .tar、找出 .tar 檔的檔案名稱後、再把內部的檔案拿出來。
目前 Heresy 這樣是可以正確使用,但是老實說如果遇到一些更特別的檔案會不會出問題?這就還不知道了。
老實說,這個修改方法其實不算好,因為如果之後 vcpkg 更新的時候,要不是直接被蓋掉、不然就是會有衝突。
不過基本上,這邊也就是等 vcpkg 或 CMake 修好這個問題(CMake 似乎是預計在 4.3.0 修復?)之前的 walkaround 了。這邊算是簡單紀錄以下,以後碰到類似的問題,也可以知道可以怎麼惡搞了。
