[vcpkg-integrate-install] Add vcpkg.path.txt to localappdata for more generic consumption.
MODIFY
include/vcpkg/userconfig.h
include/vcpkg/userconfig.h
@@ -17,4 +17,6 @@ namespace vcpkg
void try_write_data(Files::Filesystem& fs) const;
};
+
+ fs::path get_user_dir();
}

MODIFY
src/vcpkg/commands.integrate.cpp
src/vcpkg/commands.integrate.cpp
#include <vcpkg/base/system.h>
#include <vcpkg/base/util.h>
#include <vcpkg/commands.h>
+#include <vcpkg/userconfig.h>
namespace vcpkg::Commands::Integrate
{
@@ -156,8 +157,10 @@ namespace vcpkg::Commands::Integrate
}
#endif
+ static fs::path get_path_txt_path() { return get_user_dir() / "vcpkg.path.txt"; }
+
#if defined(_WIN32)
- static void integrate_install(const VcpkgPaths& paths)
+ static void integrate_install_msbuild14(Files::Filesystem& fs, const fs::path& tmp_dir)
{
static const std::array<fs::path, 2> OLD_SYSTEM_TARGET_FILES = {
System::get_program_files_32_bit().value_or_exit(VCPKG_LINE_INFO) /
@@ -168,8 +171,6 @@ namespace vcpkg::Commands::Integrate
System::get_program_files_32_bit().value_or_exit(VCPKG_LINE_INFO) /
"MSBuild/Microsoft.Cpp/v4.0/V140/ImportBefore/Default/vcpkg.system.props";
- auto& fs = paths.get_filesystem();
-
// TODO: This block of code should eventually be removed
for (auto&& old_system_wide_targets_file : OLD_SYSTEM_TARGET_FILES)
{
@@ -188,12 +189,6 @@ namespace vcpkg::Commands::Integrate
}
}
}
-
- std::error_code ec;
- const fs::path tmp_dir = paths.buildsystems / "tmp";
- fs.create_directory(paths.buildsystems, ec);
- fs.create_directory(tmp_dir, ec);
-
bool should_install_system = true;
const Expected<std::string> system_wide_file_contents = fs.read_contents(SYSTEM_WIDE_TARGETS_FILE);
static const std::regex RE(R"###(<!-- version (\d+) -->)###");
@@ -232,6 +227,21 @@ namespace vcpkg::Commands::Integrate
"Error: failed to copy targets file to %s",
SYSTEM_WIDE_TARGETS_FILE.string());
}
+ }
+#endif
+
+ static void integrate_install(const VcpkgPaths& paths)
+ {
+ auto& fs = paths.get_filesystem();
+
+#if defined(_WIN32)
+ {
+ std::error_code ec;
+ const fs::path tmp_dir = paths.buildsystems / "tmp";
+ fs.create_directory(paths.buildsystems, ec);
+ fs.create_directory(tmp_dir, ec);
+
+ integrate_install_msbuild14(fs, tmp_dir);
const fs::path appdata_src_path = tmp_dir / "vcpkg.user.targets";
fs.write_contents(appdata_src_path,
@@ -248,8 +258,21 @@ namespace vcpkg::Commands::Integrate
appdata_dst_path.string());
Checks::exit_fail(VCPKG_LINE_INFO);
}
+ }
+#endif
+
+ const auto pathtxt = get_path_txt_path();
+ std::error_code ec;
+ fs.write_contents(pathtxt, paths.root.generic_u8string(), ec);
+ if (ec)
+ {
+ System::println(System::Color::error, "Error: Failed to write file: %s", pathtxt.string());
+ Checks::exit_fail(VCPKG_LINE_INFO);
+ }
+
System::println(System::Color::success, "Applied user-wide integration for this vcpkg root.");
const fs::path cmake_toolchain = paths.buildsystems / "vcpkg.cmake";
+#if defined(_WIN32)
System::println(
R"(
All MSBuild C++ projects can now #include any installed libraries.
@@ -258,17 +281,29 @@ Installing new libraries will make them instantly available.
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=%s")",
cmake_toolchain.generic_string());
+#else
+ System::println(
+ R"(
+CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=%s")",
+ cmake_toolchain.generic_string());
+#endif
Checks::exit_success(VCPKG_LINE_INFO);
}
static void integrate_remove(Files::Filesystem& fs)
{
+ std::error_code ec;
+ bool was_deleted = false;
+
+#if defined(_WIN32)
const fs::path path = get_appdata_targets_path();
- std::error_code ec;
- const bool was_deleted = fs.remove(path, ec);
+ was_deleted |= fs.remove(path, ec);
+ Checks::check_exit(VCPKG_LINE_INFO, !ec, "Error: Unable to remove user-wide integration: %s", ec.message());
+#endif
+ was_deleted |= fs.remove(get_path_txt_path(), ec);
Checks::check_exit(VCPKG_LINE_INFO, !ec, "Error: Unable to remove user-wide integration: %s", ec.message());
if (was_deleted)
@@ -282,7 +317,6 @@ CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=%s")",
Checks::exit_success(VCPKG_LINE_INFO);
}
-#endif
#if defined(WIN32)
static void integrate_project(const VcpkgPaths& paths)
@@ -343,7 +377,8 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console
" vcpkg integrate powershell Enable PowerShell Tab-Completion\n";
#else
const char* const INTEGRATE_COMMAND_HELPSTRING =
- "No user-wide integration methods are available on this platform\n";
+ " vcpkg integrate install Make installed packages available user-wide.\n"
+ " vcpkg integrate remove Remove user-wide integration\n";
#endif
namespace Subcommand
@@ -373,7 +408,6 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console
{
Util::unused(args.parse_arguments(COMMAND_STRUCTURE));
-#if defined(_WIN32)
if (args.command_arguments[0] == Subcommand::INSTALL)
{
return integrate_install(paths);
@@ -382,6 +416,7 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console
{
return integrate_remove(paths.get_filesystem());
}
+#if defined(_WIN32)
if (args.command_arguments[0] == Subcommand::PROJECT)
{
return integrate_project(paths);
@@ -392,10 +427,8 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console
paths.scripts / "addPoshVcpkgToPowershellProfile.ps1");
Checks::exit_success(VCPKG_LINE_INFO);
}
+#endif
Checks::exit_with_message(VCPKG_LINE_INFO, "Unknown parameter %s for integrate", args.command_arguments[0]);
-#else
- Checks::exit_success(VCPKG_LINE_INFO);
-#endif
}
}

MODIFY
src/vcpkg/userconfig.cpp
src/vcpkg/userconfig.cpp
@@ -29,16 +29,21 @@ namespace
namespace vcpkg
{
- static fs::path get_config_path()
+ fs::path get_user_dir()
{
#if defined(_WIN32)
- return get_localappdata() / "vcpkg" / "config";
+ return get_localappdata() / "vcpkg";
#else
auto maybe_home = System::get_environment_variable("HOME");
- return fs::path(maybe_home.value_or("/var")) / ".vcpkg" / "config";
+ return fs::path(maybe_home.value_or("/var")) / ".vcpkg";
#endif
}
+ static fs::path get_config_path()
+ {
+ return get_user_dir() / "config";
+ }
+
UserConfig UserConfig::try_read_data(const Files::Filesystem& fs)
{
UserConfig ret;

[vcpkg-integrate-install] Add vcpkg.path.txt to localappdata for more generic consumption.