簡體   English   中英

為項目配置和安裝所需的包

[英]Configure and Install required packages for a project

來自其他 package 經理,我希望能夠在項目中執行以下操作:

  • 配置所需的庫(在配置文件中,例如CMakelists.txt或 nuget 的packages.config

  • 安裝/升級所有必需的庫

對於 vcpkg 和 CMake,這似乎是不可能的:

我設法設置了 vcpkg 和 CMakefile (linux):

# in ternimal
vcpkg install <package>
# CMakeLists.txt
find_package(nlohmann_json CONFIG REQUIRED)

target_link_libraries(<app> <package>)

然而,這需要手動安裝所有必需的庫( vcpkg install <package> )。

我如何列出所需的軟件包並讓 vcpkg 或 CMake 根據需要管理它們(例如,如果它們丟失,自動安裝它們)?

我最近花了一些時間使用 CMake 和 vcpkg。 我不喜歡將 vcpkg 及其安裝包與我的 CMake 項目分開管理的典型方法,因此我在 CMake 構建過程中編寫了一些 CMake 腳本來處理 vcpkg。

安裝 vcpkg 的 CMake 腳本主要是調用 ExternalProject_Add。

# ./vcpkg_utilities.cmake (part 1)
include(ExternalProject)
function(get_vcpkg)
    ExternalProject_Add(vcpkg
        GIT_REPOSITORY https://github.com/microsoft/vcpkg.git
        CONFIGURE_COMMAND ""
        INSTALL_COMMAND ""
        UPDATE_COMMAND ""
        BUILD_COMMAND "<SOURCE_DIR>/bootstrap-vcpkg.sh"
    )
    ExternalProject_Get_Property(vcpkg SOURCE_DIR)
    set(VCPKG_DIR ${SOURCE_DIR} PARENT_SCOPE)
    set(VCPKG_DEPENDENCIES "vcpkg" PARENT_SCOPE)
endfunction()

讓 vcpkg 安裝 package 的腳本需要自定義命令和目標。

# ./vcpkg_utilities.cmake (part 2)
function(vcpkg_install PACKAGE_NAME)
    add_custom_command(
        OUTPUT ${VCPKG_DIR}/packages/${PACKAGE_NAME}_x64-linux/BUILD_INFO
        COMMAND ${VCPKG_DIR}/vcpkg install ${PACKAGE_NAME}:x64-linux
        WORKING_DIRECTORY ${VCPKG_DIR}
        DEPENDS vcpkg
    )
    add_custom_target(get${PACKAGE_NAME}
        ALL
        DEPENDS ${VCPKG_DIR}/packages/${PACKAGE_NAME}_x64-linux/BUILD_INFO
    )
    list(APPEND VCPKG_DEPENDENCIES "get${PACKAGE_NAME}")
    set(VCPKG_DEPENDENCIES ${VCPKG_DEPENDENCIES} PARENT_SCOPE)
endfunction()

將主項目適當地鏈接到 vcpkg(通過工具鏈文件)要求在配置主項目時 vcpkg 可用,因此主項目配置為 ExternalProject。

# /CMakeLists.txt
cmake_minimum_required(VERSION 3.17)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
project(top LANGUAGES CXX)
include(vcpkg_utilities)
get_vcpkg()
vcpkg_install(nlohmann_json)

include(ExternalProject)
set_property(DIRECTORY PROPERTY EP_BASE main_projectname)
ExternalProject_Add(main_projectname
    DEPENDS ${VCPKG_DEPENDENCIES}
    SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/src
    INSTALL_COMMAND ""
    CMAKE_ARGS --no-warn-unused-cli;
               -DCMAKE_TOOLCHAIN_FILE=${VCPKG_DIR}/scripts/buildsystems/vcpkg.cmake
)

使用此結構,CMake 將管理 vcpkg 及其維護的軟件包的安裝。

請注意,這是一個點解決方案。 我的Github中有一個更通用的模板,涵蓋 Windows 和 Linux,並允許使用單獨維護的 vcpkg 實例。

我在我的項目中使用ExternalProject_Add做了類似的事情。

代碼將類似於以下模式(我已將我的依賴項替換為您的)

  find_package(nlohmann_json CONFIG) # make package not REQUIRED to avoid error...

  if(NOT NLOHMANN_JSON_FOUND)  # or whatever variable indicating _FOUND
    ...
    # here ExternalProject_Add from https://github.com/nlohmann/json.git
    # using specific tag...
    ...
    ExternalProject_Get_Property(... INSTALL_DIR)

    # create imported target here similar to nlohmann_json, as if we found it
    ...

  else()
    # We've found lib already installed... will use it...
    ...

  endif()

另一種選擇是使用FetchContent ,但我還沒有嘗試過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM