aboutsummaryrefslogtreecommitdiff
path: root/scripts/buildsystems/vcpkg.cmake
diff options
context:
space:
mode:
authornicole mazzuca <mazzucan@outlook.com>2020-06-30 10:40:18 -0700
committerGitHub <noreply@github.com>2020-06-30 10:40:18 -0700
commit1d8f0acc9c3085d18152a3f639077a28109196b6 (patch)
tree1daa4780e0d5f51844217dc61dbf275433153abf /scripts/buildsystems/vcpkg.cmake
parent67ab6130b64cce6701c5a95ca3b9bdc4d949cb8a (diff)
downloadvcpkg-1d8f0acc9c3085d18152a3f639077a28109196b6.tar.gz
vcpkg-1d8f0acc9c3085d18152a3f639077a28109196b6.zip
[vcpkg manifest] Manifest Implementation (#11757)
==== Changes Related to manifests ==== * Add the `manifests` feature flag * This only says whether we look for a `vcpkg.json` in the cwd, not whether we support parsing manifests (for ports, for example) * Changes to the manifests RFC * `"authors"` -> `"maintainers"` * `--x-classic-mode` -> `-manifests` \in `vcpkg_feature_flags` * reserve `"core"` in addition to `"default"`, since that's already reserved for features * Add a small helper note about what identifiers must look like * `<license-string>`: SPDX v3.8 -> v3.9 * `"feature"."description"` is allowed to be an array of strings as well * `"version"` -> `"version-string"` for forward-compat with versions RFC * Add the `--feature-flags` option * Add the ability to turn off feature flags via passing `-<feature-flag>` to `VCPKG_FEATURE_FLAGS` or `--feature-flags` * Add CMake toolchain support for manifests * Requires either: * a feature flag of `manifests` in either `Env{VCPKG_FEATURE_FLAGS}` or `VCPKG_FEATURE_FLAGS` * Passing the `VCPKG_ENABLE_MANIFESTS` option * The toolchain will install your packages to `${VCPKG_MANIFEST_DIR}/vcpkg_installed`. * Add MSBuild `vcpkg integrate install` support for manifests * Requires `VcpkgEnableManifest` to be true * `vcpkg create` creates a port that has a `vcpkg.json` instead of a `CONTROL` * argparse, abseil, 3fd, and avisynthplus ports switched to manifest from CONTROL * Add support for `--x-manifest-root`, as well as code for finding it if not passed * Add support for parsing manifests! * Add a filesystem lock! ==== Important Changes which are somewhat unrelated to manifests ==== * Rename `logicexpression.{h,cpp}` to `platform-expression.{h,cpp}` * Add `PlatformExpression` type which takes the place of the old logic expression * Split the parsing of platform expressions from checking whether they're true or not * Eagerly parse PlatformExpressions as opposed to leaving them as strings * Add checking for feature flag consistency * i.e., if `-binarycaching` is passed, you shouldn't be passing `--binarysource` * Add the `Json::Reader` type which, with the help of user-defined visitors, converts JSON to your internal type * VcpkgArgParser: place the switch names into a constant as opposed to using magic constants * In general update the parsing code so that this ^ works * Add `Port-Version` fields to CONTROL files * This replaces the existing practice of `Version: <my-version>-<port-version>` ==== Smaller changes ==== * small drive-by cleanups to some CMake * `${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}` -> `${CURRENT_INSTALLED_DIR}` * Remove `-analyze` when compiling with clang-cl, since that's not a supported flag (vcpkg's build system) * Add a message about which compiler is detected by vcpkg's build system machinery * Fix `Expected::then` * Convert `""` to `{}` for `std::string` and `fs::path`, to avoid a `strlen` (additionally, `.empty()` instead of `== ""`, and `.clear()`) * Add `Strings::strto` which converts strings to numeric types * Support built-in arrays and `StringView` for `Strings::join` * Add `operator<` and friends to `StringView` * Add `substr` to `StringView` * SourceParagraphParser gets some new errors
Diffstat (limited to 'scripts/buildsystems/vcpkg.cmake')
-rw-r--r--scripts/buildsystems/vcpkg.cmake84
1 files changed, 79 insertions, 5 deletions
diff --git a/scripts/buildsystems/vcpkg.cmake b/scripts/buildsystems/vcpkg.cmake
index 03926336b..10be7a423 100644
--- a/scripts/buildsystems/vcpkg.cmake
+++ b/scripts/buildsystems/vcpkg.cmake
@@ -5,6 +5,46 @@ mark_as_advanced(CMAKE_TOOLCHAIN_FILE)
option(VCPKG_VERBOSE "Enables messages from the VCPKG toolchain for debugging purposes." OFF)
mark_as_advanced(VCPKG_VERBOSE)
+function(_vcpkg_get_directory_name_of_file_above OUT DIRECTORY FILENAME)
+ if(DEFINED ${OUT})
+ return()
+ endif()
+
+ set(_vcpkg_get_dir_candidate ${DIRECTORY})
+ while(IS_DIRECTORY ${_vcpkg_get_dir_candidate} AND NOT DEFINED _vcpkg_get_dir_out)
+ if(EXISTS ${_vcpkg_get_dir_candidate}/${FILENAME})
+ set(_vcpkg_get_dir_out ${_vcpkg_get_dir_candidate})
+ else()
+ get_filename_component(_vcpkg_get_dir_candidate_tmp ${_vcpkg_get_dir_candidate} DIRECTORY)
+ if(_vcpkg_get_dir_candidate STREQUAL _vcpkg_get_dir_candidate_tmp) # we've reached the root
+ set(_vcpkg_get_dir_out "${OUT}-NOTFOUND")
+ else()
+ set(_vcpkg_get_dir_candidate ${_vcpkg_get_dir_candidate_tmp})
+ endif()
+ endif()
+ endwhile()
+
+ set(${OUT} ${_vcpkg_get_dir_out} CACHE INTERNAL "_vcpkg_get_directory_name_of_file_above: ${OUT}")
+endfunction()
+
+_vcpkg_get_directory_name_of_file_above(_VCPKG_MANIFEST_DIR ${CMAKE_CURRENT_SOURCE_DIR} "vcpkg.json")
+if(_VCPKG_MANIFEST_DIR)
+ set(_VCPKG_MANIFEST_MODE_DEFAULT ON)
+else()
+ set(_VCPKG_MANIFEST_MODE_DEFAULT OFF)
+endif()
+
+option(VCPKG_MANIFEST_MODE "Set vcpkg to manifest mode" ${_VCPKG_MANIFEST_MODE_DEFAULT})
+
+if(NOT _VCPKG_MANIFEST_DIR AND VCPKG_MANIFEST_MODE)
+ message(FATAL_ERROR
+ "vcpkg manifest mode was enabled, but we couldn't find a manifest file (vcpkg.json) "
+ "in any directories above ${CMAKE_CURRENT_SOURCE_DIR}. Please add a manifest, or "
+ "disable manifests by turning off VCPKG_MANIFEST_MODE.")
+endif()
+
+option(VCPKG_MANIFEST_INSTALL "Install packages from the manifest" ON)
+
# Determine whether the toolchain is loaded during a try-compile configuration
get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
@@ -144,19 +184,28 @@ if(NOT DEFINED _VCPKG_ROOT_DIR)
while(IS_DIRECTORY ${_VCPKG_ROOT_DIR_CANDIDATE} AND NOT EXISTS "${_VCPKG_ROOT_DIR_CANDIDATE}/.vcpkg-root")
get_filename_component(_VCPKG_ROOT_DIR_TEMP ${_VCPKG_ROOT_DIR_CANDIDATE} DIRECTORY)
if (_VCPKG_ROOT_DIR_TEMP STREQUAL _VCPKG_ROOT_DIR_CANDIDATE) # If unchanged, we have reached the root of the drive
- message(FATAL_ERROR "Could not find .vcpkg-root")
else()
SET(_VCPKG_ROOT_DIR_CANDIDATE ${_VCPKG_ROOT_DIR_TEMP})
endif()
endwhile()
set(_VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR_CANDIDATE} CACHE INTERNAL "Vcpkg root directory")
endif()
-if (NOT DEFINED _VCPKG_INSTALLED_DIR)
- set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed)
+
+_vcpkg_get_directory_name_of_file_above(_VCPKG_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR} ".vcpkg-root")
+if(NOT _VCPKG_ROOT_DIR)
+ message(FATAL_ERROR "Could not find .vcpkg-root")
endif()
-if(NOT EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" AND NOT _CMAKE_IN_TRY_COMPILE AND NOT VCPKG_SUPPRESS_INSTALLED_LIBRARIES_WARNING)
- message(WARNING "There are no libraries installed for the Vcpkg triplet ${VCPKG_TARGET_TRIPLET}.")
+if (NOT DEFINED _VCPKG_INSTALLED_DIR)
+ if(_VCPKG_MANIFEST_DIR)
+ set(_VCPKG_INSTALLED_DIR ${_VCPKG_MANIFEST_DIR}/vcpkg_installed)
+ else()
+ set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed)
+ endif()
+
+ set(_VCPKG_INSTALLED_DIR ${_VCPKG_INSTALLED_DIR}
+ CACHE PATH
+ "The directory which contains the installed libraries for each triplet")
endif()
if(CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$" OR NOT DEFINED CMAKE_BUILD_TYPE) #Debug build: Put Debug paths before Release paths.
@@ -218,6 +267,31 @@ foreach(_VCPKG_TOOLS_DIR ${_VCPKG_TOOLS_DIRS})
endif()
endforeach()
+
+# CMAKE_EXECUTABLE_SUFFIX is not yet defined
+if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
+ set(_VCPKG_EXECUTABLE_SUFFIX ".exe")
+else()
+ set(_VCPKG_EXECUTABLE_SUFFIX "")
+endif()
+
+if(VCPKG_MANIFEST_MODE AND VCPKG_MANIFEST_INSTALL AND NOT _CMAKE_IN_TRY_COMPILE)
+ execute_process(
+ COMMAND "${_VCPKG_ROOT_DIR}/vcpkg${_VCPKG_EXECUTABLE_SUFFIX}" install
+ --triplet ${VCPKG_TARGET_TRIPLET}
+ --vcpkg-root ${_VCPKG_ROOT_DIR}
+ --x-manifest-root=${_VCPKG_MANIFEST_DIR}
+ --x-install-root=${_VCPKG_INSTALLED_DIR}
+ --binarycaching
+ RESULT_VARIABLE _VCPKG_INSTALL_RESULT)
+ if (NOT _VCPKG_INSTALL_RESULT EQUAL 0)
+ message(FATAL_ERROR "vcpkg install failed")
+ endif()
+ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
+ "${_VCPKG_MANIFEST_DIR}/vcpkg.json"
+ "${_VCPKG_INSTALLED_DIR}/vcpkg/status")
+endif()
+
option(VCPKG_APPLOCAL_DEPS "Automatically copy dependencies into the output directory for executables." ON)
function(add_executable name)
_add_executable(${ARGV})