diff options
| author | Simon Hausmann <hausmann@gmail.com> | 2018-10-20 21:16:38 +0200 |
|---|---|---|
| committer | Robert Schumacher <roschuma@microsoft.com> | 2018-10-20 12:16:38 -0700 |
| commit | dac6bba3f6681e5bd326c49d834fe024f54d5bac (patch) | |
| tree | e7ccafc497ef98755e72d94550cff5ce9bb0d1bd /toolsrc/src | |
| parent | 1e78b6e21311e52b4d3dfe53454a8343b056c51d (diff) | |
| download | vcpkg-dac6bba3f6681e5bd326c49d834fe024f54d5bac.tar.gz vcpkg-dac6bba3f6681e5bd326c49d834fe024f54d5bac.zip | |
Add support for response files with vcpkg (#4507)
Response files are a convenient way of specifying bulk parameters,
typically supported by compilers and linkers. For vcpkg response files
provide a convenient way of installing sets of packages from simple
newline separate list files.
Diffstat (limited to 'toolsrc/src')
| -rw-r--r-- | toolsrc/src/vcpkg/help.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/vcpkgcmdarguments.cpp | 22 |
2 files changed, 22 insertions, 2 deletions
diff --git a/toolsrc/src/vcpkg/help.cpp b/toolsrc/src/vcpkg/help.cpp index 2b409373d..5df878a91 100644 --- a/toolsrc/src/vcpkg/help.cpp +++ b/toolsrc/src/vcpkg/help.cpp @@ -116,6 +116,8 @@ namespace vcpkg::Help " --vcpkg-root <path> Specify the vcpkg root directory\n" " (default: " ENVVAR(VCPKG_ROOT) ")\n" "\n" + " @response_file Specify a response file to provide additional parameters\n" + "\n" "For more help (including examples) see the accompanying README.md.", Commands::Integrate::INTEGRATE_COMMAND_HELPSTRING); } diff --git a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp index 8909e1552..5b3cf9ef1 100644 --- a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp +++ b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp @@ -51,11 +51,29 @@ namespace vcpkg std::vector<std::string> v; for (int i = 1; i < argc; ++i) { + std::string arg; #if defined(_WIN32) - v.push_back(Strings::to_utf8(argv[i])); + arg = Strings::to_utf8(argv[i]); #else - v.push_back(argv[i]); + arg = argv[i]; #endif + // Response file? + if (arg.size() > 0 && arg[0] == '@') + { + arg.erase(arg.begin()); + const auto& fs = Files::get_real_filesystem(); + auto lines = fs.read_lines(fs::u8path(arg)); + if (!lines.has_value()) + { + System::println(System::Color::error, "Error: Could not open response file %s", arg); + Checks::exit_fail(VCPKG_LINE_INFO); + } + std::copy(lines.get()->begin(), lines.get()->end(), std::back_inserter(v)); + } + else + { + v.emplace_back(std::move(arg)); + } } return VcpkgCmdArguments::create_from_arg_sequence(v.data(), v.data() + v.size()); |
