aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornicole mazzuca <mazzucan@outlook.com>2020-11-12 10:16:24 -0800
committerGitHub <noreply@github.com>2020-11-12 10:16:24 -0800
commit2dc708898ad89c2a74461fa50cb907bcd5b92305 (patch)
tree4788b042e34f1cd1756a25cc234eccbfc8febe42
parent11b4a16bcadd252fd9721204262ab2bb6d09464e (diff)
downloadvcpkg-2dc708898ad89c2a74461fa50cb907bcd5b92305.tar.gz
vcpkg-2dc708898ad89c2a74461fa50cb907bcd5b92305.zip
[vcpkg] Add x-ignore-lock-failures (#14397)
* [vcpkg] Add disable-lock options This should fix #14281 at least as a stopgap. Additionally, adds better errors. * billy CRs * change from "disable-lock" to "allow-spurious-lock-failures" * billy cr
-rw-r--r--scripts/buildsystems/vcpkg.cmake135
-rw-r--r--toolsrc/include/vcpkg/vcpkgcmdarguments.h4
-rw-r--r--toolsrc/src/vcpkg/vcpkgcmdarguments.cpp11
-rw-r--r--toolsrc/src/vcpkg/vcpkgpaths.cpp13
4 files changed, 107 insertions, 56 deletions
diff --git a/scripts/buildsystems/vcpkg.cmake b/scripts/buildsystems/vcpkg.cmake
index 2a8942297..ecacaf066 100644
--- a/scripts/buildsystems/vcpkg.cmake
+++ b/scripts/buildsystems/vcpkg.cmake
@@ -25,6 +25,24 @@ function(_vcpkg_get_directory_name_of_file_above OUT DIRECTORY FILENAME)
set(${OUT} ${_vcpkg_get_dir_out} CACHE INTERNAL "_vcpkg_get_directory_name_of_file_above: ${OUT}")
endfunction()
+#[===[
+We use this system, instead of `message(FATAL_ERROR)`,
+since cmake prints a lot of nonsense if the toolchain errors out before it's found the build tools.
+
+This `_VCPKG_HAS_FATAL_ERROR` must be checked before any filesystem operations are done,
+since otherwise you might be doing something with bad variables set up.
+#]===]
+set(_VCPKG_FATAL_ERROR)
+set(_VCPKG_HAS_FATAL_ERROR OFF)
+function(_vcpkg_add_fatal_error ERROR)
+ if(NOT _VCPKG_HAS_FATAL_ERROR)
+ set(_VCPKG_HAS_FATAL_ERROR ON PARENT_SCOPE)
+ set(_VCPKG_FATAL_ERROR "${ERROR}" PARENT_SCOPE)
+ else()
+ string(APPEND _VCPKG_FATAL_ERROR "\n${ERROR}")
+ endif()
+endfunction()
+
if(NOT DEFINED VCPKG_MANIFEST_DIR)
if(EXISTS "${CMAKE_SOURCE_DIR}/vcpkg.json")
set(_VCPKG_MANIFEST_DIR "${CMAKE_SOURCE_DIR}")
@@ -39,7 +57,7 @@ if(NOT DEFINED VCPKG_MANIFEST_MODE)
set(VCPKG_MANIFEST_MODE OFF)
endif()
elseif(VCPKG_MANIFEST_MODE AND NOT _VCPKG_MANIFEST_DIR)
- message(FATAL_ERROR
+ _vcpkg_add_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.")
@@ -51,7 +69,7 @@ if(NOT DEFINED _INTERNAL_CHECK_VCPKG_MANIFEST_MODE)
endif()
if(NOT VCPKG_MANIFEST_MODE STREQUAL _INTERNAL_CHECK_VCPKG_MANIFEST_MODE)
- message(FATAL_ERROR [[
+ _vcpkg_add_fatal_error([[
vcpkg manifest mode was enabled for a build directory where it was initially disabled.
This is not supported. Please delete the build directory and reconfigure.
]])
@@ -228,7 +246,7 @@ endif()
_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")
+ _vcpkg_add_fatal_error("Could not find .vcpkg-root")
endif()
if (NOT DEFINED _VCPKG_INSTALLED_DIR)
@@ -322,75 +340,84 @@ else()
set(_VCPKG_BOOTSTRAP_SCRIPT "${_VCPKG_ROOT_DIR}/bootstrap-vcpkg.sh")
endif()
-if(VCPKG_MANIFEST_MODE AND VCPKG_MANIFEST_INSTALL AND NOT _CMAKE_IN_TRY_COMPILE)
+if(VCPKG_MANIFEST_MODE AND VCPKG_MANIFEST_INSTALL AND NOT _CMAKE_IN_TRY_COMPILE AND NOT _VCPKG_HAS_FATAL_ERROR)
set(VCPKG_BOOTSTRAP_OPTIONS "${VCPKG_BOOTSTRAP_OPTIONS}" CACHE STRING "Additional options to bootstrap vcpkg" FORCE)
mark_as_advanced(VCPKG_BOOTSTRAP_OPTIONS)
if(NOT EXISTS "${_VCPKG_EXECUTABLE}")
message(STATUS "Bootstrapping vcpkg before install")
+ file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/vcpkg-bootstrap.log" _VCPKG_BOOTSTRAP_LOG)
execute_process(
COMMAND "${_VCPKG_BOOTSTRAP_SCRIPT}" ${VCPKG_BOOTSTRAP_OPTIONS}
+ OUTPUT_FILE "${_VCPKG_BOOTSTRAP_LOG}"
+ ERROR_FILE "${_VCPKG_BOOTSTRAP_LOG}"
RESULT_VARIABLE _VCPKG_BOOTSTRAP_RESULT)
- if (NOT _VCPKG_BOOTSTRAP_RESULT EQUAL 0)
- message(FATAL_ERROR "Bootstrapping vcpkg before install - failed")
+ if (_VCPKG_BOOTSTRAP_RESULT EQUAL 0)
+ message(STATUS "Bootstrapping vcpkg before install - done")
+ else()
+ message(STATUS "Bootstrapping vcpkg before install - failed")
+ _vcpkg_add_fatal_error("vcpkg install failed. See logs for more information: ${_VCPKG_BOOTSTRAP_LOG}")
endif()
-
- message(STATUS "Bootstrapping vcpkg before install - done")
endif()
- set(VCPKG_OVERLAY_PORTS "${VCPKG_OVERLAY_PORTS}" CACHE STRING "Overlay ports to use for vcpkg install in manifest mode" FORCE)
- mark_as_advanced(VCPKG_OVERLAY_PORTS)
- set(VCPKG_OVERLAY_TRIPLETS "${VCPKG_OVERLAY_TRIPLETS}" CACHE STRING "Overlay triplets to use for vcpkg install in manifest mode" FORCE)
- mark_as_advanced(VCPKG_OVERLAY_TRIPLETS)
- set(VCPKG_INSTALL_OPTIONS "${VCPKG_INSTALL_OPTIONS}" CACHE STRING "Additional install options to pass to vcpkg" FORCE)
- mark_as_advanced(VCPKG_INSTALL_OPTIONS)
-
- message(STATUS "Running vcpkg install")
+ if (NOT _VCPKG_HAS_FATAL_ERROR)
+ set(VCPKG_OVERLAY_PORTS "${VCPKG_OVERLAY_PORTS}" CACHE STRING "Overlay ports to use for vcpkg install in manifest mode" FORCE)
+ mark_as_advanced(VCPKG_OVERLAY_PORTS)
+ set(VCPKG_OVERLAY_TRIPLETS "${VCPKG_OVERLAY_TRIPLETS}" CACHE STRING "Overlay triplets to use for vcpkg install in manifest mode" FORCE)
+ mark_as_advanced(VCPKG_OVERLAY_TRIPLETS)
+ set(VCPKG_INSTALL_OPTIONS "${VCPKG_INSTALL_OPTIONS}" CACHE STRING "Additional install options to pass to vcpkg" FORCE)
+ mark_as_advanced(VCPKG_INSTALL_OPTIONS)
+
+ message(STATUS "Running vcpkg install")
+
+ set(_VCPKG_ADDITIONAL_MANIFEST_PARAMS)
+ if(VCPKG_OVERLAY_PORTS)
+ foreach(_overlay_port IN LISTS VCPKG_OVERLAY_PORTS)
+ list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--overlay-ports=${_overlay_port}")
+ endforeach()
+ endif()
+ if(VCPKG_OVERLAY_TRIPLETS)
+ foreach(_overlay_triplet IN LISTS VCPKG_OVERLAY_TRIPLETS)
+ list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--overlay-triplets=${_overlay_triplet}")
+ endforeach()
+ endif()
- set(_VCPKG_ADDITIONAL_MANIFEST_PARAMS)
- if(VCPKG_OVERLAY_PORTS)
- foreach(_overlay_port IN LISTS VCPKG_OVERLAY_PORTS)
- list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--overlay-ports=${_overlay_port}")
+ foreach(feature IN LISTS VCPKG_MANIFEST_FEATURES)
+ list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--x-feature=${feature}")
endforeach()
- endif()
- if(VCPKG_OVERLAY_TRIPLETS)
- foreach(_overlay_triplet IN LISTS VCPKG_OVERLAY_TRIPLETS)
- list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--overlay-triplets=${_overlay_triplet}")
- endforeach()
- endif()
- foreach(feature IN LISTS VCPKG_MANIFEST_FEATURES)
- list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--x-feature=${feature}")
- endforeach()
+ if(VCPKG_MANIFEST_NO_DEFAULT_FEATURES)
+ list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--x-no-default-features")
+ endif()
- if(VCPKG_MANIFEST_NO_DEFAULT_FEATURES)
- list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--x-no-default-features")
- endif()
+ file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/vcpkg-manifest-install.log" _VCPKG_MANIFEST_INSTALL_LOG)
+ execute_process(
+ COMMAND "${_VCPKG_EXECUTABLE}" install
+ --triplet "${VCPKG_TARGET_TRIPLET}"
+ --vcpkg-root "${_VCPKG_ROOT_DIR}"
+ "--x-wait-for-lock"
+ "--x-manifest-root=${_VCPKG_MANIFEST_DIR}"
+ "--x-install-root=${_VCPKG_INSTALLED_DIR}"
+ ${_VCPKG_ADDITIONAL_MANIFEST_PARAMS}
+ ${VCPKG_INSTALL_OPTIONS}
+ OUTPUT_FILE "${_VCPKG_MANIFEST_INSTALL_LOG}"
+ ERROR_FILE "${_VCPKG_MANIFEST_INSTALL_LOG}"
+ RESULT_VARIABLE _VCPKG_INSTALL_RESULT
+ )
- execute_process(
- COMMAND "${_VCPKG_EXECUTABLE}" install
- --triplet "${VCPKG_TARGET_TRIPLET}"
- --vcpkg-root "${_VCPKG_ROOT_DIR}"
- "--x-manifest-root=${_VCPKG_MANIFEST_DIR}"
- "--x-install-root=${_VCPKG_INSTALLED_DIR}"
- ${_VCPKG_ADDITIONAL_MANIFEST_PARAMS}
- ${VCPKG_INSTALL_OPTIONS}
- OUTPUT_FILE "${CMAKE_BINARY_DIR}/vcpkg-manifest-install-out.log"
- ERROR_FILE "${CMAKE_BINARY_DIR}/vcpkg-manifest-install-err.log"
- RESULT_VARIABLE _VCPKG_INSTALL_RESULT
- )
+ if (_VCPKG_INSTALL_RESULT EQUAL 0)
+ message(STATUS "Running vcpkg install - done")
- if (NOT _VCPKG_INSTALL_RESULT EQUAL 0)
- message(FATAL_ERROR "Running vcpkg install - failed")
+ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
+ "${_VCPKG_MANIFEST_DIR}/vcpkg.json"
+ "${_VCPKG_INSTALLED_DIR}/vcpkg/status")
+ else()
+ message(STATUS "Running vcpkg install - failed")
+ _vcpkg_add_fatal_error("vcpkg install failed. See logs for more information: ${_VCPKG_MANIFEST_INSTALL_LOG}")
+ endif()
endif()
-
- message(STATUS "Running vcpkg install - done")
-
- 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)
@@ -588,3 +615,7 @@ if(NOT _CMAKE_IN_TRY_COMPILE)
)
endif()
endif()
+
+if(_VCPKG_HAS_FATAL_ERROR)
+ message(FATAL_ERROR "${_VCPKG_FATAL_ERROR}")
+endif()
diff --git a/toolsrc/include/vcpkg/vcpkgcmdarguments.h b/toolsrc/include/vcpkg/vcpkgcmdarguments.h
index 6759e63cf..db0d96316 100644
--- a/toolsrc/include/vcpkg/vcpkgcmdarguments.h
+++ b/toolsrc/include/vcpkg/vcpkgcmdarguments.h
@@ -163,6 +163,10 @@ namespace vcpkg
constexpr static StringLiteral WAIT_FOR_LOCK_SWITCH = "x-wait-for-lock";
Optional<bool> wait_for_lock = nullopt;
+ constexpr static StringLiteral IGNORE_LOCK_FAILURES_SWITCH = "x-ignore-lock-failures";
+ constexpr static StringLiteral IGNORE_LOCK_FAILURES_ENV = "X_VCPKG_IGNORE_LOCK_FAILURES";
+ Optional<bool> ignore_lock_failures = nullopt;
+
constexpr static StringLiteral JSON_SWITCH = "x-json";
Optional<bool> json = nullopt;
diff --git a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp
index 8c393a1cf..b3f42e6c7 100644
--- a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp
+++ b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp
@@ -293,6 +293,7 @@ namespace vcpkg
{FEATURE_PACKAGES_SWITCH, &VcpkgCmdArguments::feature_packages},
{BINARY_CACHING_SWITCH, &VcpkgCmdArguments::binary_caching},
{WAIT_FOR_LOCK_SWITCH, &VcpkgCmdArguments::wait_for_lock},
+ {IGNORE_LOCK_FAILURES_SWITCH, &VcpkgCmdArguments::ignore_lock_failures},
{JSON_SWITCH, &VcpkgCmdArguments::json},
};
@@ -663,6 +664,14 @@ namespace vcpkg
from_env(DEFAULT_VISUAL_STUDIO_PATH_ENV, default_visual_studio_path);
{
+ const auto vcpkg_disable_lock = System::get_environment_variable(IGNORE_LOCK_FAILURES_ENV);
+ if (vcpkg_disable_lock.has_value() && !ignore_lock_failures.has_value())
+ {
+ ignore_lock_failures = true;
+ }
+ }
+
+ {
const auto vcpkg_overlay_ports_env = System::get_environment_variable(OVERLAY_PORTS_ENV);
if (const auto unpacked = vcpkg_overlay_ports_env.get())
{
@@ -923,6 +932,8 @@ namespace vcpkg
constexpr StringLiteral VcpkgCmdArguments::PRINT_METRICS_SWITCH;
constexpr StringLiteral VcpkgCmdArguments::WAIT_FOR_LOCK_SWITCH;
+ constexpr StringLiteral VcpkgCmdArguments::IGNORE_LOCK_FAILURES_SWITCH;
+ constexpr StringLiteral VcpkgCmdArguments::IGNORE_LOCK_FAILURES_ENV;
constexpr StringLiteral VcpkgCmdArguments::JSON_SWITCH;
diff --git a/toolsrc/src/vcpkg/vcpkgpaths.cpp b/toolsrc/src/vcpkg/vcpkgpaths.cpp
index cd438fef3..a3ab21629 100644
--- a/toolsrc/src/vcpkg/vcpkgpaths.cpp
+++ b/toolsrc/src/vcpkg/vcpkgpaths.cpp
@@ -259,6 +259,7 @@ namespace vcpkg
installed = process_output_directory(
filesystem, manifest_root_dir, args.install_root_dir.get(), "vcpkg_installed", VCPKG_LINE_INFO);
+
const auto vcpkg_lock = root / ".vcpkg-root";
if (args.wait_for_lock.value_or(false))
{
@@ -268,12 +269,16 @@ namespace vcpkg
{
m_pimpl->file_lock_handle = filesystem.try_take_exclusive_file_lock(vcpkg_lock, ec);
}
+
if (ec)
{
- System::printf(
- System::Color::error, "Failed to take the filesystem lock on %s:\n", fs::u8string(vcpkg_lock));
- System::printf(System::Color::error, " %s\n", ec.message());
- Checks::exit_fail(VCPKG_LINE_INFO);
+ if (ec == std::errc::device_or_resource_busy || args.ignore_lock_failures.value_or(false))
+ {
+ System::printf(
+ System::Color::error, "Failed to take the filesystem lock on %s:\n", fs::u8string(vcpkg_lock));
+ System::printf(System::Color::error, " %s\n", ec.message());
+ Checks::exit_fail(VCPKG_LINE_INFO);
+ }
}
m_pimpl->m_manifest_doc = load_manifest(filesystem, manifest_root_dir);