![](/img/trans.png)
[英]xcode build project with external libraries that required './configure','make' and 'make install'
[英]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.