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

This commit is contained in:
Robert Schumacher 2018-04-28 11:26:57 -07:00
parent ed3f943259
commit a9d989ec05
3 changed files with 71 additions and 31 deletions

View File

@ -17,4 +17,6 @@ namespace vcpkg
void try_write_data(Files::Filesystem& fs) const; void try_write_data(Files::Filesystem& fs) const;
}; };
fs::path get_user_dir();
} }

View File

@ -5,6 +5,7 @@
#include <vcpkg/base/system.h> #include <vcpkg/base/system.h>
#include <vcpkg/base/util.h> #include <vcpkg/base/util.h>
#include <vcpkg/commands.h> #include <vcpkg/commands.h>
#include <vcpkg/userconfig.h>
namespace vcpkg::Commands::Integrate namespace vcpkg::Commands::Integrate
{ {
@ -156,8 +157,10 @@ namespace vcpkg::Commands::Integrate
} }
#endif #endif
static fs::path get_path_txt_path() { return get_user_dir() / "vcpkg.path.txt"; }
#if defined(_WIN32) #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 = { static const std::array<fs::path, 2> OLD_SYSTEM_TARGET_FILES = {
System::get_program_files_32_bit().value_or_exit(VCPKG_LINE_INFO) / 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) / System::get_program_files_32_bit().value_or_exit(VCPKG_LINE_INFO) /
"MSBuild/Microsoft.Cpp/v4.0/V140/ImportBefore/Default/vcpkg.system.props"; "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 // TODO: This block of code should eventually be removed
for (auto&& old_system_wide_targets_file : OLD_SYSTEM_TARGET_FILES) 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; bool should_install_system = true;
const Expected<std::string> system_wide_file_contents = fs.read_contents(SYSTEM_WIDE_TARGETS_FILE); const Expected<std::string> system_wide_file_contents = fs.read_contents(SYSTEM_WIDE_TARGETS_FILE);
static const std::regex RE(R"###(<!-- version (\d+) -->)###"); static const std::regex RE(R"###(<!-- version (\d+) -->)###");
@ -232,24 +227,52 @@ namespace vcpkg::Commands::Integrate
"Error: failed to copy targets file to %s", "Error: failed to copy targets file to %s",
SYSTEM_WIDE_TARGETS_FILE.string()); SYSTEM_WIDE_TARGETS_FILE.string());
} }
}
#endif
const fs::path appdata_src_path = tmp_dir / "vcpkg.user.targets"; static void integrate_install(const VcpkgPaths& paths)
fs.write_contents(appdata_src_path, {
create_appdata_targets_shortcut(paths.buildsystems_msbuild_targets.string())); auto& fs = paths.get_filesystem();
auto appdata_dst_path = get_appdata_targets_path();
const auto rc = fs.copy_file(appdata_src_path, appdata_dst_path, fs::copy_options::overwrite_existing, ec); #if defined(_WIN32)
if (!rc || ec)
{ {
System::println(System::Color::error, std::error_code ec;
"Error: Failed to copy file: %s -> %s", const fs::path tmp_dir = paths.buildsystems / "tmp";
appdata_src_path.string(), fs.create_directory(paths.buildsystems, ec);
appdata_dst_path.string()); 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,
create_appdata_targets_shortcut(paths.buildsystems_msbuild_targets.string()));
auto appdata_dst_path = get_appdata_targets_path();
const auto rc = fs.copy_file(appdata_src_path, appdata_dst_path, fs::copy_options::overwrite_existing, ec);
if (!rc || ec)
{
System::println(System::Color::error,
"Error: Failed to copy file: %s -> %s",
appdata_src_path.string(),
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); Checks::exit_fail(VCPKG_LINE_INFO);
} }
System::println(System::Color::success, "Applied user-wide integration for this vcpkg root."); System::println(System::Color::success, "Applied user-wide integration for this vcpkg root.");
const fs::path cmake_toolchain = paths.buildsystems / "vcpkg.cmake"; const fs::path cmake_toolchain = paths.buildsystems / "vcpkg.cmake";
#if defined(_WIN32)
System::println( System::println(
R"( R"(
All MSBuild C++ projects can now #include any installed libraries. 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 projects should use: "-DCMAKE_TOOLCHAIN_FILE=%s")",
cmake_toolchain.generic_string()); 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); Checks::exit_success(VCPKG_LINE_INFO);
} }
static void integrate_remove(Files::Filesystem& fs) 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(); const fs::path path = get_appdata_targets_path();
std::error_code ec; was_deleted |= fs.remove(path, ec);
const bool 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()); Checks::check_exit(VCPKG_LINE_INFO, !ec, "Error: Unable to remove user-wide integration: %s", ec.message());
if (was_deleted) if (was_deleted)
@ -282,7 +317,6 @@ CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=%s")",
Checks::exit_success(VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO);
} }
#endif
#if defined(WIN32) #if defined(WIN32)
static void integrate_project(const VcpkgPaths& paths) 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"; " vcpkg integrate powershell Enable PowerShell Tab-Completion\n";
#else #else
const char* const INTEGRATE_COMMAND_HELPSTRING = 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 #endif
namespace Subcommand 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)); Util::unused(args.parse_arguments(COMMAND_STRUCTURE));
#if defined(_WIN32)
if (args.command_arguments[0] == Subcommand::INSTALL) if (args.command_arguments[0] == Subcommand::INSTALL)
{ {
return integrate_install(paths); 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()); return integrate_remove(paths.get_filesystem());
} }
#if defined(_WIN32)
if (args.command_arguments[0] == Subcommand::PROJECT) if (args.command_arguments[0] == Subcommand::PROJECT)
{ {
return integrate_project(paths); 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"); paths.scripts / "addPoshVcpkgToPowershellProfile.ps1");
Checks::exit_success(VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO);
} }
#endif
Checks::exit_with_message(VCPKG_LINE_INFO, "Unknown parameter %s for integrate", args.command_arguments[0]); Checks::exit_with_message(VCPKG_LINE_INFO, "Unknown parameter %s for integrate", args.command_arguments[0]);
#else
Checks::exit_success(VCPKG_LINE_INFO);
#endif
} }
} }

View File

@ -29,16 +29,21 @@ namespace
namespace vcpkg namespace vcpkg
{ {
static fs::path get_config_path() fs::path get_user_dir()
{ {
#if defined(_WIN32) #if defined(_WIN32)
return get_localappdata() / "vcpkg" / "config"; return get_localappdata() / "vcpkg";
#else #else
auto maybe_home = System::get_environment_variable("HOME"); 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 #endif
} }
static fs::path get_config_path()
{
return get_user_dir() / "config";
}
UserConfig UserConfig::try_read_data(const Files::Filesystem& fs) UserConfig UserConfig::try_read_data(const Files::Filesystem& fs)
{ {
UserConfig ret; UserConfig ret;