@@ -739,6 +739,40 @@ namespace vcpkg
739739 }
740740 };
741741
742+ struct SevenZipProvider : ToolProvider
743+ {
744+ virtual bool is_abi_sensitive () const override { return false ; }
745+ virtual StringView tool_data_name () const override { return Tools::SEVEN_ZIP; }
746+ virtual std::vector<StringView> system_exe_stems () const override { return {" 7z" }; }
747+ virtual std::array<int , 3 > default_min_version () const override { return {24 , 9 }; }
748+
749+ #if defined(_WIN32)
750+ virtual void add_system_paths (const ReadOnlyFilesystem&, std::vector<Path>& out_candidate_paths) const override
751+ {
752+ const auto & program_files = get_program_files_platform_bitness ();
753+ if (const auto pf = program_files.get ())
754+ {
755+ out_candidate_paths.push_back (*pf / " 7-Zip" / " 7z.exe" );
756+ }
757+
758+ const auto & program_files_32_bit = get_program_files_32_bit ();
759+ if (const auto pf = program_files_32_bit.get ())
760+ {
761+ out_candidate_paths.push_back (*pf / " 7-Zip" / " 7z.exe" );
762+ }
763+ }
764+ #endif
765+
766+ virtual ExpectedL<std::string> get_version (const ToolCache&, MessageSink&, const Path& exe_path) const override
767+ {
768+ return run_to_extract_version (Tools::SEVEN_ZIP, exe_path, Command (exe_path))
769+ .then ([&](std::string&& output) {
770+ // Sample output: 7-Zip 24.09 (x64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29
771+ return extract_prefixed_nonwhitespace (" 7-Zip " , Tools::SEVEN_ZIP, std::move (output), exe_path);
772+ });
773+ }
774+ };
775+
742776 struct ToolCacheImpl final : ToolCache
743777 {
744778 const Filesystem& fs;
@@ -1024,6 +1058,10 @@ namespace vcpkg
10241058 if (tool == Tools::COSCLI) return get_path (CosCliProvider (), status_sink);
10251059 if (tool == Tools::PYTHON3) return get_path (Python3Provider (), status_sink);
10261060 if (tool == Tools::PYTHON3_WITH_VENV) return get_path (Python3WithVEnvProvider (), status_sink);
1061+ if (tool == Tools::SEVEN_ZIP || tool == Tools::SEVEN_ZIP_ALT)
1062+ {
1063+ return get_path (SevenZipProvider (), status_sink);
1064+ }
10271065 if (tool == Tools::TAR)
10281066 {
10291067 return {find_system_tar (fs).value_or_exit (VCPKG_LINE_INFO), {}};
0 commit comments