From 24db2f7f2703b6477f797e304d0e7847ba08d7a2 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Tue, 8 Nov 2022 16:14:14 +0100 Subject: [PATCH 01/29] WIP parse trace output --- include/vcpkg/base/system.process.h | 3 ++- include/vcpkg/buildenvironment.h | 3 ++- src/vcpkg/base/system.process.cpp | 7 ++++- src/vcpkg/buildenvironment.cpp | 6 +++-- src/vcpkg/cmakevars.cpp | 40 ++++++++++++++++++++++++++++- 5 files changed, 53 insertions(+), 6 deletions(-) diff --git a/include/vcpkg/base/system.process.h b/include/vcpkg/base/system.process.h index ac1d3199ef..2787496831 100644 --- a/include/vcpkg/base/system.process.h +++ b/include/vcpkg/base/system.process.h @@ -78,7 +78,8 @@ namespace vcpkg Command make_basic_cmake_cmd(const Path& cmake_tool_path, const Path& cmake_script, - const std::vector& pass_variables); + const std::vector& pass_variables, + const std::vector& additional_args = {}); Path get_exe_path_of_current_process(); diff --git a/include/vcpkg/buildenvironment.h b/include/vcpkg/buildenvironment.h index 90c9f0bc82..391e038f36 100644 --- a/include/vcpkg/buildenvironment.h +++ b/include/vcpkg/buildenvironment.h @@ -11,5 +11,6 @@ namespace vcpkg { Command make_cmake_cmd(const VcpkgPaths& paths, const Path& cmake_script, - std::vector&& pass_variables); + std::vector&& pass_variables, + std::vector&& additional_args = {}); } diff --git a/src/vcpkg/base/system.process.cpp b/src/vcpkg/base/system.process.cpp index 7ba216a596..ac5871b26a 100644 --- a/src/vcpkg/base/system.process.cpp +++ b/src/vcpkg/base/system.process.cpp @@ -259,9 +259,14 @@ namespace vcpkg Command make_basic_cmake_cmd(const Path& cmake_tool_path, const Path& cmake_script, - const std::vector& pass_variables) + const std::vector& pass_variables, + const std::vector& additional_args) { Command cmd{cmake_tool_path}; + for (auto&& var : additional_args) + { + cmd.string_arg(var); + } for (auto&& var : pass_variables) { cmd.string_arg(var.s); diff --git a/src/vcpkg/buildenvironment.cpp b/src/vcpkg/buildenvironment.cpp index 0d4b2c965c..370a4c678e 100644 --- a/src/vcpkg/buildenvironment.cpp +++ b/src/vcpkg/buildenvironment.cpp @@ -8,7 +8,8 @@ namespace vcpkg { Command make_cmake_cmd(const VcpkgPaths& paths, const Path& cmake_script, - std::vector&& pass_variables) + std::vector&& pass_variables, + std::vector&& additional_args) { auto local_variables = std::move(pass_variables); local_variables.emplace_back("VCPKG_ROOT_DIR", paths.root); @@ -17,6 +18,7 @@ namespace vcpkg local_variables.emplace_back("_VCPKG_INSTALLED_DIR", paths.installed().root()); local_variables.emplace_back("DOWNLOADS", paths.downloads); local_variables.emplace_back("VCPKG_MANIFEST_INSTALL", "OFF"); - return make_basic_cmake_cmd(paths.get_tool_exe(Tools::CMAKE, stdout_sink), cmake_script, local_variables); + return make_basic_cmake_cmd( + paths.get_tool_exe(Tools::CMAKE, stdout_sink), cmake_script, local_variables, additional_args); } } diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index afc55c6c89..47c4058448 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -106,7 +106,9 @@ namespace vcpkg::CMakeVars Strings::append( extraction_file, "get_filename_component(CMAKE_CURRENT_LIST_DIR \"${CMAKE_CURRENT_LIST_FILE}\" DIRECTORY)\n"); + Strings::append(extraction_file, "set(z_triplet_contents_start 5b1g5d1a6-4fgd-415b-aa5d-81de854ef8ea)\n"); Strings::append(extraction_file, fs.read_contents(path_to_triplet, VCPKG_LINE_INFO)); + Strings::append(extraction_file, "set(z_triplet_contents_end 5b1g5d1a6-4fgd-415b-aa5d-81de854ef8ez)\n"); Strings::append(extraction_file, "\nendif()\n"); } Strings::append(extraction_file, @@ -265,6 +267,30 @@ endfunction() return dep_info_path; } + struct CMakeTraceLine + { + std::vector args; + std::string cmd; + std::string file; + std::size_t frame; + std::size_t global_frame; + std::size_t line; + double time; + }; + + struct CMakeTraceDeserializer : Json::IDeserializer + { + virtual StringView type_name() const override { return "a line of cmake trace"; } + + virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) override + { + Optional x; + CMakeTraceLine& ret = x.emplace(); + + return x; + } + }; + void TripletCMakeVarProvider::launch_and_split( const Path& script_path, std::vector>>& vars) const { @@ -273,7 +299,9 @@ endfunction() static constexpr StringLiteral BLOCK_START_GUID = "c35112b6-d1ba-415b-aa5d-81de856ef8eb"; static constexpr StringLiteral BLOCK_END_GUID = "e1e74b5c-18cb-4474-a6bd-5c1c8bc81f3f"; - const auto cmd_launch_cmake = vcpkg::make_cmake_cmd(paths, script_path, {}); + const auto trace_output = Path(script_path.parent_path())/"0.vcpkg_tags.trace"; + const auto trace_redirect = std::string("--trace-redirect=") + trace_output.c_str(); + const auto cmd_launch_cmake = vcpkg::make_cmake_cmd(paths, script_path, {}, {{"--trace-format=json-v1"}, {trace_redirect}}); std::vector lines; auto const exit_code = cmd_execute_and_stream_lines( @@ -291,6 +319,16 @@ endfunction() .append_raw(Strings::join(", ", lines))); } + const auto& fs = paths.get_filesystem(); // paths is used here but not passed down via a parameter from the caller. + const auto trace_lines = fs.read_lines(trace_output, VCPKG_LINE_INFO); + //TODO: Parse trace lines + for (auto& trace_line : trace_lines) + { + auto parsed_json_opt = Json::parse(trace_line); + const auto& parsed_json = parsed_json_opt.value_or_exit(VCPKG_LINE_INFO).first; + auto parsed_json_obj = parsed_json.object(VCPKG_LINE_INFO); + } + const auto end = lines.cend(); auto port_start = std::find(lines.cbegin(), end, PORT_START_GUID); From f30615cb920d61bb7387f1a7f948c816c9443362 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Tue, 8 Nov 2022 23:56:01 +0100 Subject: [PATCH 02/29] json parser complete --- include/vcpkg/base/jsonreader.h | 14 ++++++ src/vcpkg/base/json.cpp | 1 + src/vcpkg/cmakevars.cpp | 83 ++++++++++++++++++++++++++++----- 3 files changed, 86 insertions(+), 12 deletions(-) diff --git a/include/vcpkg/base/jsonreader.h b/include/vcpkg/base/jsonreader.h index 526b889746..d3351ef90e 100644 --- a/include/vcpkg/base/jsonreader.h +++ b/include/vcpkg/base/jsonreader.h @@ -8,6 +8,7 @@ #include #include #include +#include namespace vcpkg::Json { @@ -312,6 +313,19 @@ namespace vcpkg::Json static NaturalNumberDeserializer instance; }; + struct RealNumberDeserializer final : IDeserializer + { + virtual StringView type_name() const override { return "a real number"; } + + virtual Optional visit_number(Reader&, double value) override + { + if(!std::isfinite(value)) return nullopt; + return value; + } + + static RealNumberDeserializer instance; + }; + struct BooleanDeserializer final : IDeserializer { virtual StringView type_name() const override { return "a boolean"; } diff --git a/src/vcpkg/base/json.cpp b/src/vcpkg/base/json.cpp index 4c5a869925..690b0cc2ec 100644 --- a/src/vcpkg/base/json.cpp +++ b/src/vcpkg/base/json.cpp @@ -1030,6 +1030,7 @@ namespace vcpkg::Json } NaturalNumberDeserializer NaturalNumberDeserializer::instance; + RealNumberDeserializer RealNumberDeserializer::instance; BooleanDeserializer BooleanDeserializer::instance; ParagraphDeserializer ParagraphDeserializer::instance; IdentifierDeserializer IdentifierDeserializer::instance; diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 47c4058448..805032ca3b 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -267,26 +268,63 @@ endfunction() return dep_info_path; } + struct CMakeTraceVersion + { + int major; + int minor; + }; struct CMakeTraceLine { std::vector args; std::string cmd; - std::string file; - std::size_t frame; - std::size_t global_frame; - std::size_t line; + Path file; + int frame; + int global_frame; + int line; + Optional line_end; double time; }; - struct CMakeTraceDeserializer : Json::IDeserializer + struct CMakeTraceOutput { + CMakeTraceVersion version; + std::vector traces; + }; + + struct CMakeTraceVersionDeserializer : Json::IDeserializer { - virtual StringView type_name() const override { return "a line of cmake trace"; } + virtual StringView type_name() const override { return "a line of a cmake trace"; } + + virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) override + { + Optional x; + CMakeTraceVersion& ret = x.emplace(); + r.required_object_field("the major version", obj, "major", ret.major, Json::NaturalNumberDeserializer::instance); + r.required_object_field("the minor version", obj, "minor", ret.minor, Json::NaturalNumberDeserializer::instance); + + return x; + } + }; + struct CMakeTraceLineDeserializer : Json::IDeserializer + { + virtual StringView type_name() const override { return "a line of a cmake trace"; } virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) override { Optional x; CMakeTraceLine& ret = x.emplace(); - + //TODO: figure out what goes in here + static Json::ArrayDeserializer args_des("an array of arguments", + Json::StringDeserializer{"an argument"}); + static Json::StringDeserializer cmd_deserializer("the cmake command"); + static Json::StringDeserializer file_deserializer("the file executing the command"); + r.required_object_field("the arguments", obj, "args", ret.args, args_des); + r.required_object_field("the command", obj, "cmd", ret.cmd, cmd_deserializer); + r.required_object_field("the file name", obj, "file", ret.file, Json::PathDeserializer::instance); + r.required_object_field("the internal execution frame", obj, "frame", ret.frame, Json::NaturalNumberDeserializer::instance); + r.required_object_field("the global execution frame", obj, "global_frame", ret.global_frame, Json::NaturalNumberDeserializer::instance); + r.required_object_field("the line number", obj, "line", ret.line, Json::NaturalNumberDeserializer::instance); + r.optional_object_field(obj, "line_end", ret.line_end.emplace(), Json::NaturalNumberDeserializer::instance); + r.required_object_field("the execution time", obj, "time", ret.time, Json::RealNumberDeserializer::instance); return x; } }; @@ -319,16 +357,37 @@ endfunction() .append_raw(Strings::join(", ", lines))); } + // TODO: Move JSON parsing of trace into its own function. const auto& fs = paths.get_filesystem(); // paths is used here but not passed down via a parameter from the caller. const auto trace_lines = fs.read_lines(trace_output, VCPKG_LINE_INFO); - //TODO: Parse trace lines - for (auto& trace_line : trace_lines) + + CMakeTraceOutput cmake_trace; + cmake_trace.traces.reserve(trace_lines.size()-1); + + Json::Reader reader; { - auto parsed_json_opt = Json::parse(trace_line); - const auto& parsed_json = parsed_json_opt.value_or_exit(VCPKG_LINE_INFO).first; - auto parsed_json_obj = parsed_json.object(VCPKG_LINE_INFO); + CMakeTraceVersionDeserializer trace_version_des; + const auto parsed_json_cmake_version_opt = Json::parse(*trace_lines.begin()); + const auto& parsed_json_cmake_version = parsed_json_cmake_version_opt.value_or_exit(VCPKG_LINE_INFO).first; + const auto parsed_json_cmake_version_obj = parsed_json_cmake_version.object(VCPKG_LINE_INFO); + auto cmake_ver_opt = + reader.visit(*parsed_json_cmake_version_obj.get("version"), trace_version_des); + cmake_trace.version = std::move(cmake_ver_opt.value_or_exit(VCPKG_LINE_INFO)); } + + { + CMakeTraceLineDeserializer trace_line_des; + for (auto trace_line_it = std::next(trace_lines.begin()); trace_line_it != trace_lines.end()-1; ++trace_line_it) + { + const auto parsed_json_cmake_trace_line_opt = Json::parse(*trace_line_it); + const auto& parsed_json_cmake_trace_line = parsed_json_cmake_trace_line_opt.value_or_exit(VCPKG_LINE_INFO).first; + const auto parsed_json_cmake_trace_line_obj = parsed_json_cmake_trace_line.object(VCPKG_LINE_INFO); + const auto cmake_trace_opt = reader.visit(parsed_json_cmake_trace_line_obj, trace_line_des); + cmake_trace.traces.emplace_back(std::move(cmake_trace_opt.value_or_exit(VCPKG_LINE_INFO))); + } + } + //TODO: Filter results; Define ABI for triplets vars; Inject into ABI tag somehow. const auto end = lines.cend(); auto port_start = std::find(lines.cbegin(), end, PORT_START_GUID); From 75f3345425313fe0f4668c733d020f283c5c6f11 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 12:09:14 +0100 Subject: [PATCH 03/29] WIP; next todo: loop over call blocks. --- include/vcpkg/cmakevars.h | 5 ++- src/vcpkg/cmakevars.cpp | 91 +++++++++++++++++++++++++++++++++++---- 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/include/vcpkg/cmakevars.h b/include/vcpkg/cmakevars.h index 9f5665c764..9c1e336a24 100644 --- a/include/vcpkg/cmakevars.h +++ b/include/vcpkg/cmakevars.h @@ -27,11 +27,14 @@ namespace vcpkg::CMakeVars virtual Optional&> get_tag_vars( const PackageSpec& spec) const = 0; + virtual Optional get_triplet_vars(const PackageSpec& spec) const = 0; + + virtual void load_generic_triplet_vars(Triplet triplet) const = 0; virtual void load_dep_info_vars(Span specs, Triplet host_triplet) const = 0; - virtual void load_tag_vars(Span specs, + virtual void load_tag_and_triplet_vars(Span specs, const PortFileProvider& port_provider, Triplet host_triplet) const = 0; diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 805032ca3b..9eff9d819a 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -26,7 +26,7 @@ namespace vcpkg::CMakeVars install_package_specs.emplace_back(FullPackageSpec{action.spec, action.feature_list}); } - load_tag_vars(install_package_specs, port_provider, host_triplet); + load_tag_and_triplet_vars(install_package_specs, port_provider, host_triplet); } const std::unordered_map& CMakeVarProvider::get_or_load_dep_info_vars( @@ -53,7 +53,7 @@ namespace vcpkg::CMakeVars void load_dep_info_vars(View specs, Triplet host_triplet) const override; - void load_tag_vars(View specs, + void load_tag_and_triplet_vars(View specs, const PortFileProvider& port_provider, Triplet host_triplet) const override; @@ -65,6 +65,7 @@ namespace vcpkg::CMakeVars Optional&> get_tag_vars( const PackageSpec& spec) const override; + Optional get_triplet_vars(const PackageSpec& spec) const override; public: Path create_tag_extraction_file( @@ -73,11 +74,13 @@ namespace vcpkg::CMakeVars Path create_dep_info_extraction_file(const View specs) const; void launch_and_split(const Path& script_path, - std::vector>>& vars) const; + std::vector>>& vars, + Optional&> opt_triplet_hashes = nullopt) const; const VcpkgPaths& paths; mutable std::unordered_map> dep_resolution_vars; mutable std::unordered_map> tag_vars; + mutable std::unordered_map triplet_vars; mutable std::unordered_map> generic_triplet_vars; }; } @@ -107,14 +110,15 @@ namespace vcpkg::CMakeVars Strings::append( extraction_file, "get_filename_component(CMAKE_CURRENT_LIST_DIR \"${CMAKE_CURRENT_LIST_FILE}\" DIRECTORY)\n"); - Strings::append(extraction_file, "set(z_triplet_contents_start 5b1g5d1a6-4fgd-415b-aa5d-81de854ef8ea)\n"); + Strings::append(extraction_file, "message(\"start-triplet-contents-0123\")\n"); Strings::append(extraction_file, fs.read_contents(path_to_triplet, VCPKG_LINE_INFO)); - Strings::append(extraction_file, "set(z_triplet_contents_end 5b1g5d1a6-4fgd-415b-aa5d-81de854ef8ez)\n"); + Strings::append(extraction_file, "message(\"end-triplet-contents-3210\")"); Strings::append(extraction_file, "\nendif()\n"); } Strings::append(extraction_file, R"( set(CMAKE_CURRENT_LIST_FILE "${_vcpkg_triplet_file_BACKUP_CURRENT_LIST_FILE}") +unset(_vcpkg_triplet_file_BACKUP_CURRENT_LIST_FILE) get_filename_component(CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY) endmacro() )"); @@ -329,8 +333,9 @@ endfunction() } }; - void TripletCMakeVarProvider::launch_and_split( - const Path& script_path, std::vector>>& vars) const + void TripletCMakeVarProvider::launch_and_split(const Path& script_path, + std::vector>>& vars, + Optional&> opt_triplet_hashes) const { static constexpr StringLiteral PORT_START_GUID = "d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af"; static constexpr StringLiteral PORT_END_GUID = "8c504940-be29-4cba-9f8f-6cd83e9d87b7"; @@ -379,6 +384,7 @@ endfunction() { CMakeTraceLineDeserializer trace_line_des; for (auto trace_line_it = std::next(trace_lines.begin()); trace_line_it != trace_lines.end()-1; ++trace_line_it) + // trace_lines.end()-1 : since trace always ends with a blank line which cannot be parsed. { const auto parsed_json_cmake_trace_line_opt = Json::parse(*trace_line_it); const auto& parsed_json_cmake_trace_line = parsed_json_cmake_trace_line_opt.value_or_exit(VCPKG_LINE_INFO).first; @@ -388,6 +394,55 @@ endfunction() } } //TODO: Filter results; Define ABI for triplets vars; Inject into ABI tag somehow. + // cmd: vcpkg_get_tags + // cmd: vcpkg_get_dep_info + // cmd message: (triplet start) d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af PORT_START_GUID - single argument + // cmd: vcpkg_triplet_file + // cmd: message(\"start-triplet-contents-0123\") + // + // cmd: message(\"end-triplet-contents-3210\") + // cmd: message: (triplet end) c35112b6-d1ba-415b-aa5d-81de856ef8eb BLOCK_START_GUID - first argument + // BLOCK_END_GUID + // PORT_END_GUID - last argument + + // Parse (unexpanded) trace output + auto is_vcpkg_get_tags = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_tags") == 0);}; + auto is_vcpkg_get_dep_info = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_dep_info") == 0);}; + + auto is_vcpkg_get_tags_or_dep_info = [&](const CMakeTraceLine& t) { return (is_vcpkg_get_tags(t) || is_vcpkg_get_dep_info(t));}; + + auto is_vcpkg_triplet_file = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_triplet_file") == 0);}; + auto is_message = [](const CMakeTraceLine& t) { return (t.cmd.compare("message") == 0);}; + auto is_message_triplet_start = [&](const CMakeTraceLine& t) { return (is_message(t) && (t.args.at(0).compare("start-triplet-contents-0123")==0));}; + auto is_message_triplet_end = [&](const CMakeTraceLine& t) { return (is_message(t) && (t.args.at(0).compare("end-triplet-contents-3210")==0));}; + auto is_cmd_set = [](const CMakeTraceLine& t) { return (t.cmd.compare("set") == 0);}; + + const auto trace_end = cmake_trace.traces.end(); + // Find first call block + auto tags_or_deps_iter_begin = + std::find_if(cmake_trace.traces.begin(), trace_end, is_vcpkg_get_tags_or_dep_info); + auto tags_or_deps_iter_end = + std::find_if(std::next(tags_or_deps_iter_begin), trace_end, is_vcpkg_get_tags_or_dep_info); + + // Find triplet block + auto triplet_start_iter = + std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_start); + auto triplet_end_iter = std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_end); + + // Find all sets in the triplet block: + std::vector> triplet_vars; + auto var_set_searcher = std::find_if(triplet_start_iter, triplet_end_iter, is_cmd_set); + for (; var_set_searcher != triplet_end_iter; + var_set_searcher = std::find_if(std::next(var_set_searcher), triplet_end_iter, is_cmd_set)) + { + const auto set_trace = *var_set_searcher; + std::pair value{set_trace.args.at(0),set_trace.args.at(1)}; // needs concat 1-end + triplet_vars.emplace_back(std::move(value)); + } + + // TODO loop over call blocks; + + // Parse cmake message output (expanded) const auto end = lines.cend(); auto port_start = std::find(lines.cbegin(), end, PORT_START_GUID); @@ -466,13 +521,15 @@ endfunction() } } - void TripletCMakeVarProvider::load_tag_vars(View specs, + void TripletCMakeVarProvider::load_tag_and_triplet_vars(View specs, const PortFileProvider& port_provider, Triplet host_triplet) const { if (specs.size() == 0) return; std::vector> spec_abi_settings; spec_abi_settings.reserve(specs.size()); + std::vector triplet_vars_vec; + triplet_vars_vec.reserve(specs.size()); for (const FullPackageSpec& spec : specs) { @@ -483,10 +540,11 @@ endfunction() std::vector>> vars(spec_abi_settings.size()); const auto file_path = create_tag_extraction_file(spec_abi_settings); - launch_and_split(file_path, vars); + launch_and_split(file_path, vars, triplet_vars_vec); paths.get_filesystem().remove(file_path, VCPKG_LINE_INFO); auto var_list_itr = vars.begin(); + // auto triplet_vars_iter = triplet_vars_vec.begin(); for (const auto& spec_abi_setting : spec_abi_settings) { const FullPackageSpec& spec = *spec_abi_setting.first; @@ -497,9 +555,13 @@ endfunction() ctxt.emplace("Z_VCPKG_IS_NATIVE", host_triplet == spec.package_spec.triplet() ? "1" : "0"); tag_vars.emplace(spec.package_spec, std::move(ctxt)); + //triplet_vars.emplace(spec.package_spec, std::move(*triplet_vars_iter)); + //++triplet_vars_iter; } } + + // All those function below do the same.... Optional&> TripletCMakeVarProvider::get_generic_triplet_vars( Triplet triplet) const { @@ -535,4 +597,15 @@ endfunction() return nullopt; } + + Optional TripletCMakeVarProvider::get_triplet_vars(const PackageSpec& spec) const + { + auto find_itr = triplet_vars.find(spec); + if (find_itr != triplet_vars.end()) + { + return find_itr->second; + } + + return nullopt; + } } From 8eeb0f1d7cc2c545813775adf161b27316dfaa91 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 12:40:39 +0100 Subject: [PATCH 04/29] fill lookup table --- src/vcpkg/cmakevars.cpp | 172 +++++++++++++++++++++++----------------- 1 file changed, 98 insertions(+), 74 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 9eff9d819a..f27d0fa367 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -75,12 +75,13 @@ namespace vcpkg::CMakeVars void launch_and_split(const Path& script_path, std::vector>>& vars, - Optional&> opt_triplet_hashes = nullopt) const; + Optional>>&> + opt_triplet_hashes = nullopt) const; const VcpkgPaths& paths; mutable std::unordered_map> dep_resolution_vars; mutable std::unordered_map> tag_vars; - mutable std::unordered_map triplet_vars; + mutable std::unordered_map>> triplet_vars; mutable std::unordered_map> generic_triplet_vars; }; } @@ -335,7 +336,7 @@ endfunction() void TripletCMakeVarProvider::launch_and_split(const Path& script_path, std::vector>>& vars, - Optional&> opt_triplet_hashes) const + Optional>>&> opt_triplet_vars) const { static constexpr StringLiteral PORT_START_GUID = "d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af"; static constexpr StringLiteral PORT_END_GUID = "8c504940-be29-4cba-9f8f-6cd83e9d87b7"; @@ -345,6 +346,7 @@ endfunction() const auto trace_output = Path(script_path.parent_path())/"0.vcpkg_tags.trace"; const auto trace_redirect = std::string("--trace-redirect=") + trace_output.c_str(); const auto cmd_launch_cmake = vcpkg::make_cmake_cmd(paths, script_path, {}, {{"--trace-format=json-v1"}, {trace_redirect}}); + //TODO: delete trace file after read! std::vector lines; auto const exit_code = cmd_execute_and_stream_lines( @@ -369,79 +371,101 @@ endfunction() CMakeTraceOutput cmake_trace; cmake_trace.traces.reserve(trace_lines.size()-1); - Json::Reader reader; + if (auto triplet_vars = opt_triplet_vars.get()) { - CMakeTraceVersionDeserializer trace_version_des; - const auto parsed_json_cmake_version_opt = Json::parse(*trace_lines.begin()); - const auto& parsed_json_cmake_version = parsed_json_cmake_version_opt.value_or_exit(VCPKG_LINE_INFO).first; - const auto parsed_json_cmake_version_obj = parsed_json_cmake_version.object(VCPKG_LINE_INFO); - auto cmake_ver_opt = - reader.visit(*parsed_json_cmake_version_obj.get("version"), trace_version_des); - cmake_trace.version = std::move(cmake_ver_opt.value_or_exit(VCPKG_LINE_INFO)); - } - + Json::Reader reader; + { + CMakeTraceVersionDeserializer trace_version_des; + const auto parsed_json_cmake_version_opt = Json::parse(*trace_lines.begin()); + const auto& parsed_json_cmake_version = + parsed_json_cmake_version_opt.value_or_exit(VCPKG_LINE_INFO).first; + const auto parsed_json_cmake_version_obj = parsed_json_cmake_version.object(VCPKG_LINE_INFO); + auto cmake_ver_opt = reader.visit(*parsed_json_cmake_version_obj.get("version"), trace_version_des); + cmake_trace.version = std::move(cmake_ver_opt.value_or_exit(VCPKG_LINE_INFO)); + } - { - CMakeTraceLineDeserializer trace_line_des; - for (auto trace_line_it = std::next(trace_lines.begin()); trace_line_it != trace_lines.end()-1; ++trace_line_it) + { + CMakeTraceLineDeserializer trace_line_des; + for (auto trace_line_it = std::next(trace_lines.begin()); trace_line_it != trace_lines.end() - 1; + ++trace_line_it) // trace_lines.end()-1 : since trace always ends with a blank line which cannot be parsed. + { + const auto parsed_json_cmake_trace_line_opt = Json::parse(*trace_line_it); + const auto& parsed_json_cmake_trace_line = + parsed_json_cmake_trace_line_opt.value_or_exit(VCPKG_LINE_INFO).first; + const auto parsed_json_cmake_trace_line_obj = parsed_json_cmake_trace_line.object(VCPKG_LINE_INFO); + const auto cmake_trace_opt = reader.visit(parsed_json_cmake_trace_line_obj, trace_line_des); + cmake_trace.traces.emplace_back(std::move(cmake_trace_opt.value_or_exit(VCPKG_LINE_INFO))); + } + } + // TODO: Filter results; Define ABI for triplets vars; Inject into ABI tag somehow. + // cmd: vcpkg_get_tags + // cmd: vcpkg_get_dep_info + // cmd message: (triplet start) d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af PORT_START_GUID - single argument + // cmd: vcpkg_triplet_file + // cmd: message(\"start-triplet-contents-0123\") + // + // cmd: message(\"end-triplet-contents-3210\") + // cmd: message: (triplet end) c35112b6-d1ba-415b-aa5d-81de856ef8eb BLOCK_START_GUID - first argument + // BLOCK_END_GUID + // PORT_END_GUID - last argument + + // Parse (unexpanded) trace output + auto is_vcpkg_get_tags = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_tags") == 0); }; + auto is_vcpkg_get_dep_info = [](const CMakeTraceLine& t) { + return (t.cmd.compare("vcpkg_get_dep_info") == 0); + }; + + auto is_vcpkg_get_tags_or_dep_info = [&](const CMakeTraceLine& t) { + return (is_vcpkg_get_tags(t) || is_vcpkg_get_dep_info(t)); + }; + + auto is_vcpkg_triplet_file = [](const CMakeTraceLine& t) { + return (t.cmd.compare("vcpkg_triplet_file") == 0); + }; + auto is_message = [](const CMakeTraceLine& t) { return (t.cmd.compare("message") == 0); }; + auto is_message_triplet_start = [&](const CMakeTraceLine& t) { + return (is_message(t) && (t.args.at(0).compare("start-triplet-contents-0123") == 0)); + }; + auto is_message_triplet_end = [&](const CMakeTraceLine& t) { + return (is_message(t) && (t.args.at(0).compare("end-triplet-contents-3210") == 0)); + }; + auto is_cmd_set = [](const CMakeTraceLine& t) { return (t.cmd.compare("set") == 0); }; + + const auto trace_end = cmake_trace.traces.end(); + // Find first call block + auto tags_or_deps_iter_begin = + std::find_if(cmake_trace.traces.begin(), trace_end, is_vcpkg_get_tags_or_dep_info); + auto tags_or_deps_iter_end = + std::find_if(std::next(tags_or_deps_iter_begin), trace_end, is_vcpkg_get_tags_or_dep_info); + + while (tags_or_deps_iter_begin != trace_end) { - const auto parsed_json_cmake_trace_line_opt = Json::parse(*trace_line_it); - const auto& parsed_json_cmake_trace_line = parsed_json_cmake_trace_line_opt.value_or_exit(VCPKG_LINE_INFO).first; - const auto parsed_json_cmake_trace_line_obj = parsed_json_cmake_trace_line.object(VCPKG_LINE_INFO); - const auto cmake_trace_opt = reader.visit(parsed_json_cmake_trace_line_obj, trace_line_des); - cmake_trace.traces.emplace_back(std::move(cmake_trace_opt.value_or_exit(VCPKG_LINE_INFO))); + // Find triplet block + auto triplet_start_iter = + std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_start); + auto triplet_end_iter = + std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_end); + + // Find all sets in the triplet block: + std::unordered_map> port_triplet_vars; + for (auto var_set_searcher = std::find_if(triplet_start_iter, triplet_end_iter, is_cmd_set); + var_set_searcher != triplet_end_iter; + var_set_searcher = std::find_if(std::next(var_set_searcher), triplet_end_iter, is_cmd_set)) + { + const auto set_trace = *var_set_searcher; + const auto var_name = set_trace.args[0]; + const auto var_value = std::vector(++set_trace.args.begin(), set_trace.args.end()); + port_triplet_vars.insert_or_assign(var_name, std::move(var_value)); + }; // needs concat 1-end + + tags_or_deps_iter_begin = tags_or_deps_iter_end; + tags_or_deps_iter_end = + std::find_if(std::next(tags_or_deps_iter_end), trace_end, is_vcpkg_get_tags_or_dep_info); + + triplet_vars->emplace_back(std::move(port_triplet_vars)); } } - //TODO: Filter results; Define ABI for triplets vars; Inject into ABI tag somehow. - // cmd: vcpkg_get_tags - // cmd: vcpkg_get_dep_info - // cmd message: (triplet start) d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af PORT_START_GUID - single argument - // cmd: vcpkg_triplet_file - // cmd: message(\"start-triplet-contents-0123\") - // - // cmd: message(\"end-triplet-contents-3210\") - // cmd: message: (triplet end) c35112b6-d1ba-415b-aa5d-81de856ef8eb BLOCK_START_GUID - first argument - // BLOCK_END_GUID - // PORT_END_GUID - last argument - - // Parse (unexpanded) trace output - auto is_vcpkg_get_tags = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_tags") == 0);}; - auto is_vcpkg_get_dep_info = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_dep_info") == 0);}; - - auto is_vcpkg_get_tags_or_dep_info = [&](const CMakeTraceLine& t) { return (is_vcpkg_get_tags(t) || is_vcpkg_get_dep_info(t));}; - - auto is_vcpkg_triplet_file = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_triplet_file") == 0);}; - auto is_message = [](const CMakeTraceLine& t) { return (t.cmd.compare("message") == 0);}; - auto is_message_triplet_start = [&](const CMakeTraceLine& t) { return (is_message(t) && (t.args.at(0).compare("start-triplet-contents-0123")==0));}; - auto is_message_triplet_end = [&](const CMakeTraceLine& t) { return (is_message(t) && (t.args.at(0).compare("end-triplet-contents-3210")==0));}; - auto is_cmd_set = [](const CMakeTraceLine& t) { return (t.cmd.compare("set") == 0);}; - - const auto trace_end = cmake_trace.traces.end(); - // Find first call block - auto tags_or_deps_iter_begin = - std::find_if(cmake_trace.traces.begin(), trace_end, is_vcpkg_get_tags_or_dep_info); - auto tags_or_deps_iter_end = - std::find_if(std::next(tags_or_deps_iter_begin), trace_end, is_vcpkg_get_tags_or_dep_info); - - // Find triplet block - auto triplet_start_iter = - std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_start); - auto triplet_end_iter = std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_end); - - // Find all sets in the triplet block: - std::vector> triplet_vars; - auto var_set_searcher = std::find_if(triplet_start_iter, triplet_end_iter, is_cmd_set); - for (; var_set_searcher != triplet_end_iter; - var_set_searcher = std::find_if(std::next(var_set_searcher), triplet_end_iter, is_cmd_set)) - { - const auto set_trace = *var_set_searcher; - std::pair value{set_trace.args.at(0),set_trace.args.at(1)}; // needs concat 1-end - triplet_vars.emplace_back(std::move(value)); - } - - // TODO loop over call blocks; - // Parse cmake message output (expanded) const auto end = lines.cend(); @@ -528,7 +552,7 @@ endfunction() if (specs.size() == 0) return; std::vector> spec_abi_settings; spec_abi_settings.reserve(specs.size()); - std::vector triplet_vars_vec; + std::vector>> triplet_vars_vec; triplet_vars_vec.reserve(specs.size()); for (const FullPackageSpec& spec : specs) @@ -544,7 +568,7 @@ endfunction() paths.get_filesystem().remove(file_path, VCPKG_LINE_INFO); auto var_list_itr = vars.begin(); - // auto triplet_vars_iter = triplet_vars_vec.begin(); + auto triplet_vars_iter = triplet_vars_vec.begin(); for (const auto& spec_abi_setting : spec_abi_settings) { const FullPackageSpec& spec = *spec_abi_setting.first; @@ -555,8 +579,8 @@ endfunction() ctxt.emplace("Z_VCPKG_IS_NATIVE", host_triplet == spec.package_spec.triplet() ? "1" : "0"); tag_vars.emplace(spec.package_spec, std::move(ctxt)); - //triplet_vars.emplace(spec.package_spec, std::move(*triplet_vars_iter)); - //++triplet_vars_iter; + triplet_vars.emplace(spec.package_spec, std::move(*triplet_vars_iter)); + ++triplet_vars_iter; } } From 73a2c242c644758c05c8328f2bd6c6b6fc1fc681 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 12:40:54 +0100 Subject: [PATCH 05/29] prepare for abi tag generation --- src/vcpkg/build.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 96c0568959..57d0c39f80 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -1052,6 +1052,7 @@ namespace vcpkg static Optional compute_abi_tag(const VcpkgPaths& paths, const InstallPlanAction& action, + const CMakeVars::CMakeVarProvider& var_provider, Span dependency_abis) { auto& fs = paths.get_filesystem(); @@ -1248,7 +1249,7 @@ namespace vcpkg paths, action.spec.triplet(), var_provider.get_tag_vars(action.spec).value_or_exit(VCPKG_LINE_INFO)); abi_info.toolset = paths.get_toolset(*abi_info.pre_build_info); - auto maybe_abi_tag_and_file = compute_abi_tag(paths, action, dependency_abis); + auto maybe_abi_tag_and_file = compute_abi_tag(paths, action, var_provider, dependency_abis); if (auto p = maybe_abi_tag_and_file.get()) { abi_info.compiler_info = paths.get_compiler_info(abi_info); From cc6e7d92b9f5f09477033563c62c7c8be4e8146c Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 12:48:39 +0100 Subject: [PATCH 06/29] fix build error after lookup table change --- include/vcpkg/cmakevars.h | 3 ++- src/vcpkg/cmakevars.cpp | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/vcpkg/cmakevars.h b/include/vcpkg/cmakevars.h index 9c1e336a24..d133aa9b09 100644 --- a/include/vcpkg/cmakevars.h +++ b/include/vcpkg/cmakevars.h @@ -27,7 +27,8 @@ namespace vcpkg::CMakeVars virtual Optional&> get_tag_vars( const PackageSpec& spec) const = 0; - virtual Optional get_triplet_vars(const PackageSpec& spec) const = 0; + virtual Optional < const std::unordered_map>&> get_triplet_vars( + const PackageSpec& spec) const = 0; virtual void load_generic_triplet_vars(Triplet triplet) const = 0; diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index f27d0fa367..5d290d9742 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -65,7 +65,8 @@ namespace vcpkg::CMakeVars Optional&> get_tag_vars( const PackageSpec& spec) const override; - Optional get_triplet_vars(const PackageSpec& spec) const override; + Optional < const std::unordered_map>&> get_triplet_vars( + const PackageSpec& spec) const override; public: Path create_tag_extraction_file( @@ -420,9 +421,10 @@ endfunction() return (is_vcpkg_get_tags(t) || is_vcpkg_get_dep_info(t)); }; - auto is_vcpkg_triplet_file = [](const CMakeTraceLine& t) { - return (t.cmd.compare("vcpkg_triplet_file") == 0); - }; + // Could be used to minimize the search space + //auto is_vcpkg_triplet_file = [](const CMakeTraceLine& t) { + // return (t.cmd.compare("vcpkg_triplet_file") == 0); + //}; auto is_message = [](const CMakeTraceLine& t) { return (t.cmd.compare("message") == 0); }; auto is_message_triplet_start = [&](const CMakeTraceLine& t) { return (is_message(t) && (t.args.at(0).compare("start-triplet-contents-0123") == 0)); @@ -622,7 +624,7 @@ endfunction() return nullopt; } - Optional TripletCMakeVarProvider::get_triplet_vars(const PackageSpec& spec) const + Optional >&> TripletCMakeVarProvider::get_triplet_vars(const PackageSpec& spec) const { auto find_itr = triplet_vars.find(spec); if (find_itr != triplet_vars.end()) From 0fcc43b66f1f8206f3e3fb24f11c5ecae224e32c Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:03:28 +0100 Subject: [PATCH 07/29] fix build --- src/vcpkg/build.cpp | 1 + src/vcpkg/cmakevars.cpp | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 57d0c39f80..b0275725da 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -1057,6 +1057,7 @@ namespace vcpkg { auto& fs = paths.get_filesystem(); Triplet triplet = action.spec.triplet(); + const auto triplet_vars = var_provider.get_triplet_vars(action.spec); if (action.build_options.use_head_version == UseHeadVersion::YES) { diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 5d290d9742..a6b8168d07 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -438,11 +438,12 @@ endfunction() // Find first call block auto tags_or_deps_iter_begin = std::find_if(cmake_trace.traces.begin(), trace_end, is_vcpkg_get_tags_or_dep_info); - auto tags_or_deps_iter_end = - std::find_if(std::next(tags_or_deps_iter_begin), trace_end, is_vcpkg_get_tags_or_dep_info); while (tags_or_deps_iter_begin != trace_end) { + auto tags_or_deps_iter_end = + std::find_if(std::next(tags_or_deps_iter_begin), trace_end, is_vcpkg_get_tags_or_dep_info); + // Find triplet block auto triplet_start_iter = std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_start); @@ -462,8 +463,6 @@ endfunction() }; // needs concat 1-end tags_or_deps_iter_begin = tags_or_deps_iter_end; - tags_or_deps_iter_end = - std::find_if(std::next(tags_or_deps_iter_end), trace_end, is_vcpkg_get_tags_or_dep_info); triplet_vars->emplace_back(std::move(port_triplet_vars)); } From 1ac7513d5f39aed7257aa412507d7b289533a8c7 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:03:35 +0100 Subject: [PATCH 08/29] create abi entries. --- src/vcpkg/build.cpp | 9 ++++++++- src/vcpkg/cmakevars.cpp | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index b0275725da..7eddf413a3 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -1057,7 +1058,6 @@ namespace vcpkg { auto& fs = paths.get_filesystem(); Triplet triplet = action.spec.triplet(); - const auto triplet_vars = var_provider.get_triplet_vars(action.spec); if (action.build_options.use_head_version == UseHeadVersion::YES) { @@ -1083,6 +1083,13 @@ namespace vcpkg } std::vector abi_tag_entries(dependency_abis.begin(), dependency_abis.end()); + const auto& triplet_vars = var_provider.get_triplet_vars(action.spec).value_or_exit(VCPKG_LINE_INFO); + for (const auto& triplet_var : triplet_vars) + { + const auto var_value = triplet_var.second; + abi_tag_entries.emplace_back(triplet_var.first, + std::accumulate(var_value.begin(), var_value.end(), std::string(""))); + } const auto& abi_info = action.abi_info.value_or_exit(VCPKG_LINE_INFO); const auto& triplet_abi = paths.get_triplet_info(abi_info); diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index a6b8168d07..9344c92511 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -1,3 +1,4 @@ +#include #include #include #include From 45a816d470df99eed2780a44ddc85dc7b91c801a Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:33:59 +0100 Subject: [PATCH 09/29] rip out triplet hashing, rename triplet_abi -> toolchain_abi --- include/vcpkg/build.h | 4 ++-- include/vcpkg/vcpkgpaths.h | 2 +- src/vcpkg/build.cpp | 22 ++++++++++------------ src/vcpkg/vcpkgpaths.cpp | 4 ++-- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/include/vcpkg/build.h b/include/vcpkg/build.h index feefb1dacc..df06650f9a 100644 --- a/include/vcpkg/build.h +++ b/include/vcpkg/build.h @@ -401,7 +401,7 @@ namespace vcpkg explicit EnvCache(bool compiler_tracking) : m_compiler_tracking(compiler_tracking) { } const Environment& get_action_env(const VcpkgPaths& paths, const AbiInfo& abi_info); - const std::string& get_triplet_info(const VcpkgPaths& paths, const AbiInfo& abi_info); + const std::string& get_toolchain_abi(const VcpkgPaths& paths, const AbiInfo& abi_info); const CompilerInfo& get_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info); private: @@ -415,7 +415,7 @@ namespace vcpkg Cache m_triplet_cache; Cache m_toolchain_cache; - const TripletMapEntry& get_triplet_cache(const Filesystem& fs, const Path& p) const; + const TripletMapEntry& get_triplet_cache(const Path& p) const; #if defined(_WIN32) struct EnvMapEntry diff --git a/include/vcpkg/vcpkgpaths.h b/include/vcpkg/vcpkgpaths.h index 54d7153e5d..98cca86c2d 100644 --- a/include/vcpkg/vcpkgpaths.h +++ b/include/vcpkg/vcpkgpaths.h @@ -166,7 +166,7 @@ namespace vcpkg Filesystem& get_filesystem() const; const Environment& get_action_env(const AbiInfo& abi_info) const; - const std::string& get_triplet_info(const AbiInfo& abi_info) const; + const std::string& get_toolchain_abi(const AbiInfo& abi_info) const; const CompilerInfo& get_compiler_info(const AbiInfo& abi_info) const; const FeatureFlagSettings& get_feature_flags() const; diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 7eddf413a3..3ee2c25f72 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -487,11 +487,9 @@ namespace vcpkg }); } - const EnvCache::TripletMapEntry& EnvCache::get_triplet_cache(const Filesystem& fs, const Path& p) const + const EnvCache::TripletMapEntry& EnvCache::get_triplet_cache(const Path& p) const { - return m_triplet_cache.get_lazy(p, [&]() -> TripletMapEntry { - return TripletMapEntry{Hash::get_file_hash(fs, p, Hash::Algorithm::Sha256).value_or_exit(VCPKG_LINE_INFO)}; - }); + return m_triplet_cache.get_lazy(p, [&]() -> TripletMapEntry { return TripletMapEntry{}; }); } const CompilerInfo& EnvCache::get_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info) @@ -509,7 +507,7 @@ namespace vcpkg auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, abi_info.pre_build_info->toolchain_file(), fs); - auto&& triplet_entry = get_triplet_cache(fs, triplet_file_path); + auto&& triplet_entry = get_triplet_cache(triplet_file_path); return triplet_entry.compiler_info.get_lazy(toolchain_hash, [&]() -> CompilerInfo { if (m_compiler_tracking) @@ -523,7 +521,7 @@ namespace vcpkg }); } - const std::string& EnvCache::get_triplet_info(const VcpkgPaths& paths, const AbiInfo& abi_info) + const std::string& EnvCache::get_toolchain_abi(const VcpkgPaths& paths, const AbiInfo& abi_info) { const auto& fs = paths.get_filesystem(); Checks::check_exit(VCPKG_LINE_INFO, abi_info.pre_build_info != nullptr); @@ -531,19 +529,19 @@ namespace vcpkg auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, abi_info.pre_build_info->toolchain_file(), fs); - auto&& triplet_entry = get_triplet_cache(fs, triplet_file_path); + auto&& triplet_entry = get_triplet_cache(triplet_file_path); if (m_compiler_tracking && !abi_info.pre_build_info->disable_compiler_tracking) { return triplet_entry.triplet_infos.get_lazy(toolchain_hash, [&]() -> std::string { auto& compiler_info = get_compiler_info(paths, abi_info); - return Strings::concat(triplet_entry.hash, '-', toolchain_hash, '-', compiler_info.hash); + return Strings::concat(toolchain_hash, '-', compiler_info.hash); }); } else { return triplet_entry.triplet_infos_without_compiler.get_lazy(toolchain_hash, [&]() -> std::string { - return Strings::concat(triplet_entry.hash, '-', toolchain_hash); + return toolchain_hash; }); } } @@ -1092,9 +1090,9 @@ namespace vcpkg } const auto& abi_info = action.abi_info.value_or_exit(VCPKG_LINE_INFO); - const auto& triplet_abi = paths.get_triplet_info(abi_info); + const auto& toolchain_abi = paths.get_toolchain_abi(abi_info); abi_tag_entries.emplace_back("triplet", triplet.canonical_name()); - abi_tag_entries.emplace_back("triplet_abi", triplet_abi); + abi_tag_entries.emplace_back("toolchain_abi", toolchain_abi); abi_entries_from_abi_info(abi_info, abi_tag_entries); // If there is an unusually large number of files in the port then @@ -1197,7 +1195,7 @@ namespace vcpkg fs.write_contents(abi_file_path, full_abi_info, VCPKG_LINE_INFO); return AbiTagAndFiles{ - &triplet_abi, + &toolchain_abi, Hash::get_file_hash(fs, abi_file_path, Hash::Algorithm::Sha256).value_or_exit(VCPKG_LINE_INFO), abi_file_path, std::move(files), diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index 9b334c2db4..41038a6b51 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -1421,9 +1421,9 @@ namespace vcpkg return m_pimpl->m_env_cache.get_action_env(*this, abi_info); } - const std::string& VcpkgPaths::get_triplet_info(const AbiInfo& abi_info) const + const std::string& VcpkgPaths::get_toolchain_abi(const AbiInfo& abi_info) const { - return m_pimpl->m_env_cache.get_triplet_info(*this, abi_info); + return m_pimpl->m_env_cache.get_toolchain_abi(*this, abi_info); } const CompilerInfo& VcpkgPaths::get_compiler_info(const AbiInfo& abi_info) const From bb72c5748dd74a6c65ebd745e678be3f15fe85b2 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:44:45 +0100 Subject: [PATCH 10/29] rename variable to make ci happy --- src/vcpkg/cmakevars.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 9344c92511..86ee262c03 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -373,7 +373,7 @@ endfunction() CMakeTraceOutput cmake_trace; cmake_trace.traces.reserve(trace_lines.size()-1); - if (auto triplet_vars = opt_triplet_vars.get()) + if (auto triplet_vars_out = opt_triplet_vars.get()) { Json::Reader reader; { @@ -465,7 +465,7 @@ endfunction() tags_or_deps_iter_begin = tags_or_deps_iter_end; - triplet_vars->emplace_back(std::move(port_triplet_vars)); + triplet_vars_out->emplace_back(std::move(port_triplet_vars)); } } // Parse cmake message output (expanded) From 566780d305103b8f88f6429d72d9e5fc62899b82 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:21:10 +0100 Subject: [PATCH 11/29] bit of cleanup --- src/vcpkg/cmakevars.cpp | 275 ++++++++++++++++++++++------------------ 1 file changed, 153 insertions(+), 122 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 86ee262c03..e3a628ce8d 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -44,6 +44,28 @@ namespace vcpkg::CMakeVars namespace { + struct CMakeTraceVersion + { + int major; + int minor; + }; + struct CMakeTraceLine + { + std::vector args; + std::string cmd; + Path file; + int frame; + int global_frame; + int line; + Optional line_end; + double time; + }; + struct CMakeTraceOutput + { + CMakeTraceVersion version; + std::vector traces; + }; + struct TripletCMakeVarProvider : CMakeVarProvider { explicit TripletCMakeVarProvider(const vcpkg::VcpkgPaths& paths) : paths(paths) { } @@ -69,6 +91,11 @@ namespace vcpkg::CMakeVars Optional < const std::unordered_map>&> get_triplet_vars( const PackageSpec& spec) const override; + CMakeTraceOutput parse_cmake_trace(const std::vector& trace_lines) const; + + void analyze_cmake_trace(const CMakeTraceOutput& trace, + std::vector>>& result) const; + public: Path create_tag_extraction_file( const View> spec_abi_settings) const; @@ -275,28 +302,6 @@ endfunction() return dep_info_path; } - struct CMakeTraceVersion - { - int major; - int minor; - }; - struct CMakeTraceLine - { - std::vector args; - std::string cmd; - Path file; - int frame; - int global_frame; - int line; - Optional line_end; - double time; - }; - - struct CMakeTraceOutput { - CMakeTraceVersion version; - std::vector traces; - }; - struct CMakeTraceVersionDeserializer : Json::IDeserializer { virtual StringView type_name() const override { return "a line of a cmake trace"; } @@ -336,10 +341,129 @@ endfunction() } }; + CMakeTraceOutput TripletCMakeVarProvider::parse_cmake_trace(const std::vector& trace_lines) const + { + CMakeTraceOutput cmake_trace; + cmake_trace.traces.reserve(trace_lines.size() - 1); + Json::Reader reader; + { + CMakeTraceVersionDeserializer trace_version_des; + const auto parsed_json_cmake_version_opt = Json::parse(*trace_lines.begin()); + const auto& parsed_json_cmake_version = parsed_json_cmake_version_opt.value_or_exit(VCPKG_LINE_INFO).first; + const auto parsed_json_cmake_version_obj = parsed_json_cmake_version.object(VCPKG_LINE_INFO); + auto cmake_ver_opt = reader.visit(*parsed_json_cmake_version_obj.get("version"), trace_version_des); + cmake_trace.version = std::move(cmake_ver_opt.value_or_exit(VCPKG_LINE_INFO)); + } + + { + CMakeTraceLineDeserializer trace_line_des; + for (auto trace_line_it = std::next(trace_lines.begin()); trace_line_it != trace_lines.end() - 1; + ++trace_line_it) + // trace_lines.end()-1 : since trace always ends with a blank line which cannot be parsed. + { + const auto parsed_json_cmake_trace_line_opt = Json::parse(*trace_line_it); + const auto& parsed_json_cmake_trace_line = + parsed_json_cmake_trace_line_opt.value_or_exit(VCPKG_LINE_INFO).first; + const auto parsed_json_cmake_trace_line_obj = parsed_json_cmake_trace_line.object(VCPKG_LINE_INFO); + const auto cmake_trace_opt = reader.visit(parsed_json_cmake_trace_line_obj, trace_line_des); + cmake_trace.traces.emplace_back(std::move(cmake_trace_opt.value_or_exit(VCPKG_LINE_INFO))); + } + } + return cmake_trace; + } + + void TripletCMakeVarProvider::analyze_cmake_trace( + const CMakeTraceOutput& cmake_trace, + std::vector>>& result) const + { + // Basic trace order: + // cmd: vcpkg_get_tags or vcpkg_get_dep_info + // cmd message: (triplet start) d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af PORT_START_GUID - single argument + // cmd: vcpkg_triplet_file + // cmd: message(\"start-triplet-contents-0123\") + // <- That is what we want + // cmd: message(\"end-triplet-contents-3210\") + // cmd: message: (triplet end) c35112b6-d1ba-415b-aa5d-81de856ef8eb BLOCK_START_GUID - first argument + // BLOCK_END_GUID + // PORT_END_GUID - last argument + // + + auto is_vcpkg_get_tags = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_tags") == 0); }; + auto is_vcpkg_get_dep_info = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_dep_info") == 0); }; + + auto is_vcpkg_get_tags_or_dep_info = [&](const CMakeTraceLine& t) { + return (is_vcpkg_get_tags(t) || is_vcpkg_get_dep_info(t)); + }; + + // Could be used to minimize the search space + // auto is_vcpkg_triplet_file = [](const CMakeTraceLine& t) { + // return (t.cmd.compare("vcpkg_triplet_file") == 0); + //}; + auto is_message = [](const CMakeTraceLine& t) { return (t.cmd.compare("message") == 0); }; + auto is_message_triplet_start = [&](const CMakeTraceLine& t) { + return (is_message(t) && (t.args.at(0).compare("start-triplet-contents-0123") == 0)); + }; + auto is_message_triplet_end = [&](const CMakeTraceLine& t) { + return (is_message(t) && (t.args.at(0).compare("end-triplet-contents-3210") == 0)); + }; + auto is_cmd_set = [](const CMakeTraceLine& t) { return (t.cmd.compare("set") == 0); }; + auto is_cmd_unset = [](const CMakeTraceLine& t) { return (t.cmd.compare("unset") == 0); }; + auto is_set_or_unset = [&](const CMakeTraceLine& t) { return (is_cmd_set(t) || is_cmd_unset(t)); }; + + const auto trace_end = cmake_trace.traces.end(); + // Find first call block + auto tags_or_deps_iter_begin = + std::find_if(cmake_trace.traces.begin(), trace_end, is_vcpkg_get_tags_or_dep_info); + + while (tags_or_deps_iter_begin != trace_end) + { + auto tags_or_deps_iter_end = + std::find_if(std::next(tags_or_deps_iter_begin), trace_end, is_vcpkg_get_tags_or_dep_info); + + // Find triplet block + auto triplet_start_iter = + std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_start); + auto triplet_end_iter = + std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_end); + + // Find all sets and unset in the triplet block: + std::unordered_map> port_triplet_vars; + for (auto var_set_searcher = std::find_if(triplet_start_iter, triplet_end_iter, is_cmd_set); + var_set_searcher != triplet_end_iter; + var_set_searcher = std::find_if(std::next(var_set_searcher), triplet_end_iter, is_set_or_unset)) + { + const auto trace_set_or_unset = *var_set_searcher; + const auto var_name = trace_set_or_unset.args[0]; + if (is_cmd_set(trace_set_or_unset)) + { + const auto var_value = + std::vector(++trace_set_or_unset.args.begin(), trace_set_or_unset.args.end()); + port_triplet_vars.insert_or_assign(var_name, std::move(var_value)); + } + else // is_cmd_unset + { + if (port_triplet_vars.find(var_name) != port_triplet_vars.end()) // contains is c++20 + { + [[maybe_unused]] const auto throw_away = port_triplet_vars.extract(var_name); + } + else if (var_name.substr(0, 4).compare("ENV{")) + { + port_triplet_vars.insert_or_assign(var_name, std::vector{"unset"}); + } + } + }; + tags_or_deps_iter_begin = tags_or_deps_iter_end; + result.emplace_back(std::move(port_triplet_vars)); + } + + } + void TripletCMakeVarProvider::launch_and_split(const Path& script_path, std::vector>>& vars, Optional>>&> opt_triplet_vars) const { + const auto& fs = paths.get_filesystem(); + static constexpr StringLiteral PORT_START_GUID = "d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af"; static constexpr StringLiteral PORT_END_GUID = "8c504940-be29-4cba-9f8f-6cd83e9d87b7"; static constexpr StringLiteral BLOCK_START_GUID = "c35112b6-d1ba-415b-aa5d-81de856ef8eb"; @@ -356,7 +480,7 @@ endfunction() [&](StringView sv) { lines.emplace_back(sv.begin(), sv.end()); }, default_working_directory) .value_or_exit(VCPKG_LINE_INFO); - + if (exit_code != 0) { Checks::msg_exit_with_message( @@ -366,107 +490,13 @@ endfunction() .append_raw(Strings::join(", ", lines))); } - // TODO: Move JSON parsing of trace into its own function. - const auto& fs = paths.get_filesystem(); // paths is used here but not passed down via a parameter from the caller. - const auto trace_lines = fs.read_lines(trace_output, VCPKG_LINE_INFO); - - CMakeTraceOutput cmake_trace; - cmake_trace.traces.reserve(trace_lines.size()-1); - if (auto triplet_vars_out = opt_triplet_vars.get()) { - Json::Reader reader; - { - CMakeTraceVersionDeserializer trace_version_des; - const auto parsed_json_cmake_version_opt = Json::parse(*trace_lines.begin()); - const auto& parsed_json_cmake_version = - parsed_json_cmake_version_opt.value_or_exit(VCPKG_LINE_INFO).first; - const auto parsed_json_cmake_version_obj = parsed_json_cmake_version.object(VCPKG_LINE_INFO); - auto cmake_ver_opt = reader.visit(*parsed_json_cmake_version_obj.get("version"), trace_version_des); - cmake_trace.version = std::move(cmake_ver_opt.value_or_exit(VCPKG_LINE_INFO)); - } - - { - CMakeTraceLineDeserializer trace_line_des; - for (auto trace_line_it = std::next(trace_lines.begin()); trace_line_it != trace_lines.end() - 1; - ++trace_line_it) - // trace_lines.end()-1 : since trace always ends with a blank line which cannot be parsed. - { - const auto parsed_json_cmake_trace_line_opt = Json::parse(*trace_line_it); - const auto& parsed_json_cmake_trace_line = - parsed_json_cmake_trace_line_opt.value_or_exit(VCPKG_LINE_INFO).first; - const auto parsed_json_cmake_trace_line_obj = parsed_json_cmake_trace_line.object(VCPKG_LINE_INFO); - const auto cmake_trace_opt = reader.visit(parsed_json_cmake_trace_line_obj, trace_line_des); - cmake_trace.traces.emplace_back(std::move(cmake_trace_opt.value_or_exit(VCPKG_LINE_INFO))); - } - } - // TODO: Filter results; Define ABI for triplets vars; Inject into ABI tag somehow. - // cmd: vcpkg_get_tags - // cmd: vcpkg_get_dep_info - // cmd message: (triplet start) d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af PORT_START_GUID - single argument - // cmd: vcpkg_triplet_file - // cmd: message(\"start-triplet-contents-0123\") - // - // cmd: message(\"end-triplet-contents-3210\") - // cmd: message: (triplet end) c35112b6-d1ba-415b-aa5d-81de856ef8eb BLOCK_START_GUID - first argument - // BLOCK_END_GUID - // PORT_END_GUID - last argument + const auto trace_lines = fs.read_lines(trace_output, VCPKG_LINE_INFO); + CMakeTraceOutput cmake_trace = parse_cmake_trace(trace_lines); // Parse (unexpanded) trace output - auto is_vcpkg_get_tags = [](const CMakeTraceLine& t) { return (t.cmd.compare("vcpkg_get_tags") == 0); }; - auto is_vcpkg_get_dep_info = [](const CMakeTraceLine& t) { - return (t.cmd.compare("vcpkg_get_dep_info") == 0); - }; - - auto is_vcpkg_get_tags_or_dep_info = [&](const CMakeTraceLine& t) { - return (is_vcpkg_get_tags(t) || is_vcpkg_get_dep_info(t)); - }; - - // Could be used to minimize the search space - //auto is_vcpkg_triplet_file = [](const CMakeTraceLine& t) { - // return (t.cmd.compare("vcpkg_triplet_file") == 0); - //}; - auto is_message = [](const CMakeTraceLine& t) { return (t.cmd.compare("message") == 0); }; - auto is_message_triplet_start = [&](const CMakeTraceLine& t) { - return (is_message(t) && (t.args.at(0).compare("start-triplet-contents-0123") == 0)); - }; - auto is_message_triplet_end = [&](const CMakeTraceLine& t) { - return (is_message(t) && (t.args.at(0).compare("end-triplet-contents-3210") == 0)); - }; - auto is_cmd_set = [](const CMakeTraceLine& t) { return (t.cmd.compare("set") == 0); }; - - const auto trace_end = cmake_trace.traces.end(); - // Find first call block - auto tags_or_deps_iter_begin = - std::find_if(cmake_trace.traces.begin(), trace_end, is_vcpkg_get_tags_or_dep_info); - - while (tags_or_deps_iter_begin != trace_end) - { - auto tags_or_deps_iter_end = - std::find_if(std::next(tags_or_deps_iter_begin), trace_end, is_vcpkg_get_tags_or_dep_info); - - // Find triplet block - auto triplet_start_iter = - std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_start); - auto triplet_end_iter = - std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_end); - - // Find all sets in the triplet block: - std::unordered_map> port_triplet_vars; - for (auto var_set_searcher = std::find_if(triplet_start_iter, triplet_end_iter, is_cmd_set); - var_set_searcher != triplet_end_iter; - var_set_searcher = std::find_if(std::next(var_set_searcher), triplet_end_iter, is_cmd_set)) - { - const auto set_trace = *var_set_searcher; - const auto var_name = set_trace.args[0]; - const auto var_value = std::vector(++set_trace.args.begin(), set_trace.args.end()); - port_triplet_vars.insert_or_assign(var_name, std::move(var_value)); - }; // needs concat 1-end - - tags_or_deps_iter_begin = tags_or_deps_iter_end; - - triplet_vars_out->emplace_back(std::move(port_triplet_vars)); - } + analyze_cmake_trace(cmake_trace, *triplet_vars_out); } // Parse cmake message output (expanded) const auto end = lines.cend(); @@ -506,6 +536,7 @@ endfunction() port_start = std::find(port_end, end, PORT_START_GUID); port_end = std::find(port_start, end, PORT_END_GUID); } + paths.get_filesystem().remove(trace_output, VCPKG_LINE_INFO); } void TripletCMakeVarProvider::load_generic_triplet_vars(Triplet triplet) const @@ -568,9 +599,9 @@ endfunction() const auto file_path = create_tag_extraction_file(spec_abi_settings); launch_and_split(file_path, vars, triplet_vars_vec); paths.get_filesystem().remove(file_path, VCPKG_LINE_INFO); - + auto var_list_itr = vars.begin(); - auto triplet_vars_iter = triplet_vars_vec.begin(); + auto triplet_vars_iter = triplet_vars_vec.begin(); for (const auto& spec_abi_setting : spec_abi_settings) { const FullPackageSpec& spec = *spec_abi_setting.first; From 7c42d7a62751a2f9a094ee263dd7cec4e0c3e189 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:32:44 +0100 Subject: [PATCH 12/29] fix vcpkg-test --- include/vcpkg-test/mockcmakevarprovider.h | 6 +++++- src/vcpkg-test/mockcmakevarsprovider.cpp | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/vcpkg-test/mockcmakevarprovider.h b/include/vcpkg-test/mockcmakevarprovider.h index 6ee6428de8..01530a6cc8 100644 --- a/include/vcpkg-test/mockcmakevarprovider.h +++ b/include/vcpkg-test/mockcmakevarprovider.h @@ -18,7 +18,7 @@ namespace vcpkg::Test dep_info_vars.emplace(spec, SMap{}); } - void load_tag_vars(Span specs, + void load_tag_and_triplet_vars(Span specs, const PortFileProvider& port_provider, Triplet host_triplet) const override { @@ -37,8 +37,12 @@ namespace vcpkg::Test Optional&> get_tag_vars( const PackageSpec& spec) const override; + Optional>&> get_triplet_vars( + const PackageSpec& spec) const override; + mutable std::unordered_map> dep_info_vars; mutable std::unordered_map> tag_vars; + mutable std::unordered_map>> triplet_vars; mutable std::unordered_map> generic_triplet_vars; }; } diff --git a/src/vcpkg-test/mockcmakevarsprovider.cpp b/src/vcpkg-test/mockcmakevarsprovider.cpp index 77a796fade..5b3943399a 100644 --- a/src/vcpkg-test/mockcmakevarsprovider.cpp +++ b/src/vcpkg-test/mockcmakevarsprovider.cpp @@ -25,4 +25,16 @@ namespace vcpkg::Test if (it == tag_vars.end()) return nullopt; return it->second; } + + Optional>&> MockCMakeVarProvider:: + get_triplet_vars(const PackageSpec& spec) const + { + auto find_itr = triplet_vars.find(spec); + if (find_itr != triplet_vars.end()) + { + return find_itr->second; + } + + return nullopt; + } } From 8a4621cebb906f57bd88847aa1053a5cd82a29de Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:32:58 +0100 Subject: [PATCH 13/29] leave comment about x-cmake-args --- src/vcpkg/cmakevars.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index e3a628ce8d..e6f6fe8865 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -110,7 +110,7 @@ namespace vcpkg::CMakeVars const VcpkgPaths& paths; mutable std::unordered_map> dep_resolution_vars; mutable std::unordered_map> tag_vars; - mutable std::unordered_map>> triplet_vars; + mutable std::unordered_map>> triplet_vars; // I feel like I could also add --x-cmake-args into this variable mutable std::unordered_map> generic_triplet_vars; }; } From b4be9a3e4d9d4833815ed195e69188365c43dac3 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Thu, 10 Nov 2022 00:21:59 +0100 Subject: [PATCH 14/29] flatten vector to simple string; WIP: record other variable changing commands; string(args) not yet completed --- include/vcpkg-test/mockcmakevarprovider.h | 4 +- include/vcpkg/cmakevars.h | 24 +- src/vcpkg-test/mockcmakevarsprovider.cpp | 2 +- src/vcpkg/cmakevars.cpp | 274 ++++++++++++++++++---- 4 files changed, 254 insertions(+), 50 deletions(-) diff --git a/include/vcpkg-test/mockcmakevarprovider.h b/include/vcpkg-test/mockcmakevarprovider.h index 01530a6cc8..2020805a81 100644 --- a/include/vcpkg-test/mockcmakevarprovider.h +++ b/include/vcpkg-test/mockcmakevarprovider.h @@ -37,12 +37,12 @@ namespace vcpkg::Test Optional&> get_tag_vars( const PackageSpec& spec) const override; - Optional>&> get_triplet_vars( + Optional&> get_triplet_vars( const PackageSpec& spec) const override; mutable std::unordered_map> dep_info_vars; mutable std::unordered_map> tag_vars; - mutable std::unordered_map>> triplet_vars; + mutable std::unordered_map> triplet_vars; mutable std::unordered_map> generic_triplet_vars; }; } diff --git a/include/vcpkg/cmakevars.h b/include/vcpkg/cmakevars.h index d133aa9b09..a53787afa9 100644 --- a/include/vcpkg/cmakevars.h +++ b/include/vcpkg/cmakevars.h @@ -11,6 +11,28 @@ namespace vcpkg::CMakeVars { + struct CMakeTraceVersion + { + int major; + int minor; + }; + struct CMakeTraceLine + { + std::vector args; + std::string cmd; + Path file; + int frame; + int global_frame; + int line; + Optional line_end; + double time; + }; + struct CMakeTraceOutput + { + CMakeTraceVersion version; + std::vector traces; + }; + struct CMakeVarProvider { virtual ~CMakeVarProvider() = default; @@ -27,7 +49,7 @@ namespace vcpkg::CMakeVars virtual Optional&> get_tag_vars( const PackageSpec& spec) const = 0; - virtual Optional < const std::unordered_map>&> get_triplet_vars( + virtual Optional < const std::unordered_map&> get_triplet_vars( const PackageSpec& spec) const = 0; diff --git a/src/vcpkg-test/mockcmakevarsprovider.cpp b/src/vcpkg-test/mockcmakevarsprovider.cpp index 5b3943399a..d56884e216 100644 --- a/src/vcpkg-test/mockcmakevarsprovider.cpp +++ b/src/vcpkg-test/mockcmakevarsprovider.cpp @@ -26,7 +26,7 @@ namespace vcpkg::Test return it->second; } - Optional>&> MockCMakeVarProvider:: + Optional&> MockCMakeVarProvider:: get_triplet_vars(const PackageSpec& spec) const { auto find_itr = triplet_vars.find(spec); diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index e6f6fe8865..03f6acc85d 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -44,28 +44,6 @@ namespace vcpkg::CMakeVars namespace { - struct CMakeTraceVersion - { - int major; - int minor; - }; - struct CMakeTraceLine - { - std::vector args; - std::string cmd; - Path file; - int frame; - int global_frame; - int line; - Optional line_end; - double time; - }; - struct CMakeTraceOutput - { - CMakeTraceVersion version; - std::vector traces; - }; - struct TripletCMakeVarProvider : CMakeVarProvider { explicit TripletCMakeVarProvider(const vcpkg::VcpkgPaths& paths) : paths(paths) { } @@ -88,13 +66,13 @@ namespace vcpkg::CMakeVars Optional&> get_tag_vars( const PackageSpec& spec) const override; - Optional < const std::unordered_map>&> get_triplet_vars( + Optional < const std::unordered_map&> get_triplet_vars( const PackageSpec& spec) const override; CMakeTraceOutput parse_cmake_trace(const std::vector& trace_lines) const; void analyze_cmake_trace(const CMakeTraceOutput& trace, - std::vector>>& result) const; + std::vector>& result) const; public: Path create_tag_extraction_file( @@ -104,13 +82,13 @@ namespace vcpkg::CMakeVars void launch_and_split(const Path& script_path, std::vector>>& vars, - Optional>>&> + Optional>&> opt_triplet_hashes = nullopt) const; const VcpkgPaths& paths; mutable std::unordered_map> dep_resolution_vars; mutable std::unordered_map> tag_vars; - mutable std::unordered_map>> triplet_vars; // I feel like I could also add --x-cmake-args into this variable + mutable std::unordered_map> triplet_vars; // I feel like I could also add --x-cmake-args into this variable mutable std::unordered_map> generic_triplet_vars; }; } @@ -374,7 +352,7 @@ endfunction() void TripletCMakeVarProvider::analyze_cmake_trace( const CMakeTraceOutput& cmake_trace, - std::vector>>& result) const + std::vector>& result) const { // Basic trace order: // cmd: vcpkg_get_tags or vcpkg_get_dep_info @@ -406,10 +384,34 @@ endfunction() auto is_message_triplet_end = [&](const CMakeTraceLine& t) { return (is_message(t) && (t.args.at(0).compare("end-triplet-contents-3210") == 0)); }; - auto is_cmd_set = [](const CMakeTraceLine& t) { return (t.cmd.compare("set") == 0); }; - auto is_cmd_unset = [](const CMakeTraceLine& t) { return (t.cmd.compare("unset") == 0); }; - auto is_set_or_unset = [&](const CMakeTraceLine& t) { return (is_cmd_set(t) || is_cmd_unset(t)); }; + auto is_relevant_command = [](const CMakeTraceLine& t) { + static std::vector cmake_commands{"set", + "unset", + "cmake_path", + "execute_process", + "file", + "find_file", + "find_library", + "find_path", + "find_program", + "get_cmake_property", + "get_directory_property", + "get_filename_component", + "get_property", + "list", + "math", + "option", + "separate_arguments", + "string", + "site_name" + }; + for (const auto& to_compare : cmake_commands) + if (t.cmd.compare(to_compare) == 0) return true; + return false; + }; + auto is_cmd_unset = [](const CMakeTraceLine& t) { return (t.cmd.compare("unset") == 0); }; + const auto trace_end = cmake_trace.traces.end(); // Find first call block auto tags_or_deps_iter_begin = @@ -427,28 +429,208 @@ endfunction() std::find_if(tags_or_deps_iter_begin, tags_or_deps_iter_end, is_message_triplet_end); // Find all sets and unset in the triplet block: - std::unordered_map> port_triplet_vars; - for (auto var_set_searcher = std::find_if(triplet_start_iter, triplet_end_iter, is_cmd_set); + std::unordered_map port_triplet_vars; + for (auto var_set_searcher = std::find_if(triplet_start_iter, triplet_end_iter, is_relevant_command); var_set_searcher != triplet_end_iter; - var_set_searcher = std::find_if(std::next(var_set_searcher), triplet_end_iter, is_set_or_unset)) + var_set_searcher = std::find_if(std::next(var_set_searcher), triplet_end_iter, is_relevant_command)) { - const auto trace_set_or_unset = *var_set_searcher; - const auto var_name = trace_set_or_unset.args[0]; - if (is_cmd_set(trace_set_or_unset)) - { - const auto var_value = - std::vector(++trace_set_or_unset.args.begin(), trace_set_or_unset.args.end()); - port_triplet_vars.insert_or_assign(var_name, std::move(var_value)); - } - else // is_cmd_unset + const auto trace_relevant = *var_set_searcher; + + if (is_cmd_unset(trace_relevant)) { + const auto var_name = trace_relevant.args[0]; if (port_triplet_vars.find(var_name) != port_triplet_vars.end()) // contains is c++20 { [[maybe_unused]] const auto throw_away = port_triplet_vars.extract(var_name); } else if (var_name.substr(0, 4).compare("ENV{")) { - port_triplet_vars.insert_or_assign(var_name, std::vector{"unset"}); + port_triplet_vars.insert_or_assign(var_name, "unset"); + } + + } + else // is_cmd_unset + { + std::vector var_names; + if ((trace_relevant.cmd.compare("set") == 0) || + (trace_relevant.cmd.compare("option") == 0) || + (trace_relevant.cmd.compare("separate_arguments") == 0) || + (trace_relevant.cmd.compare("site_name") == 0) || + // get_cmake_property, get_directory_property, get_filename_component, get_property + (trace_relevant.cmd.substr(0, 4).compare("get_") == 0) || + // find_file, find_library, find_path, find_program + (trace_relevant.cmd.substr(0, 5).compare("find_") == 0) + ) + { + var_names.emplace_back(trace_relevant.args[0]); + } + else if (trace_relevant.cmd.compare("cmake_path") == 0) + { + if (trace_relevant.args[0].compare("SET") == 0) + { + var_names.emplace_back(trace_relevant.args[1]); + } + else if (trace_relevant.args[0].compare("GET") == 0) + { + var_names.emplace_back(*trace_relevant.args.end()); + } + else if (trace_relevant.args[0].compare("COMPARE") == 0 || + trace_relevant.args[0].compare("HASH") == 0 || + trace_relevant.args[0].compare("NATIVE_PATH") == 0 || + trace_relevant.args[0].substr(0, 3).compare("IS_") == 0 || + trace_relevant.args[0].substr(0, 4).compare("HAS_") == 0) + { + var_names.emplace_back(*trace_relevant.args.end()); + } + else if (trace_relevant.args[0].compare("CONVERT") == 0) + { + var_names.emplace_back(trace_relevant.args[3]); + } + else if (trace_relevant.args[0].compare("NORMAL_PATH") == 0 || + trace_relevant.args[0].compare("CONVERT") == 0 || + trace_relevant.args[0].compare("APPEND") == 0 || + trace_relevant.args[0].compare("APPEND_STRING") == 0 || + trace_relevant.args[0].compare("REMOVE_FILENAME") == 0 || + trace_relevant.args[0].compare("REPLACE_FILENAME") == 0 || + trace_relevant.args[0].compare("REMOVE_EXTENSION") == 0 || + trace_relevant.args[0].compare("REPLACE_EXTENSION") == 0 + ) + { + auto output_var = + std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "OUTPUT_VARIABLE"); + if (output_var != trace_relevant.args.end()) + { + var_names.emplace_back(*(++output_var)); + } + else + { + var_names.emplace_back(trace_relevant.args[1]); + } + } + } + else if (trace_relevant.cmd.compare("execute_process") == 0) + { + auto output_var = + std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "OUTPUT_VARIABLE"); + if (output_var != trace_relevant.args.end()) + { + var_names.emplace_back(*(++ output_var)); + } + output_var = + std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "RESULT_VARIABLE"); + if (output_var != trace_relevant.args.end()) + { + var_names.emplace_back(*(++output_var)); + } + output_var = + std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "RESULTS_VARIABLE"); + if (output_var != trace_relevant.args.end()) + { + var_names.emplace_back(*(++output_var)); + } + output_var = + std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "ERROR_VARIABLE"); + if (output_var != trace_relevant.args.end()) + { + var_names.emplace_back(*(++output_var)); + } + } + else if (trace_relevant.cmd.compare("file") == 0) + { + if (trace_relevant.args[0].compare("READ") == 0 || + trace_relevant.args[0].compare("STRINGS") == 0 || + trace_relevant.args[0].compare("MD5") == 0 || + trace_relevant.args[0].compare("SHA1") == 0 || + trace_relevant.args[0].compare("SHA224") == 0 || + trace_relevant.args[0].compare("SHA256") == 0 || + trace_relevant.args[0].compare("SHA384") == 0 || + trace_relevant.args[0].compare("SHA512") == 0 || + trace_relevant.args[0].compare("SHA3_224") == 0 || + trace_relevant.args[0].compare("SHA3_256") == 0 || + trace_relevant.args[0].compare("SHA3_384") == 0 || + trace_relevant.args[0].compare("SHA3_512") == 0 || + trace_relevant.args[0].compare("TIMESTAMP") == 0 || + trace_relevant.args[0].compare("SIZE") == 0 || + trace_relevant.args[0].compare("READ_SYMLINK") == 0 || + trace_relevant.args[0].compare("REAL_PATH") == 0 || + trace_relevant.args[0].compare("TO_CMAKE_PATH") == 0 || + trace_relevant.args[0].compare("TO_NATIVE_PATH") == 0 + ) + { + var_names.emplace_back(trace_relevant.args[2]); + } + else if (trace_relevant.args[0].compare("GLOB") == 0 || + trace_relevant.args[0].compare("GLOB_RECURSE") == 0 || + trace_relevant.args[0].compare("RELATIVE_PATH") == 0 + ) + { + var_names.emplace_back(trace_relevant.args[1]); + } + } + else if (trace_relevant.cmd.compare("list") == 0) + { + var_names.emplace_back(trace_relevant.args[1]); + if (trace_relevant.args[0].substr(0, 4).compare("POP_") && trace_relevant.args.size() >= 3) + { + // POP_FRONT|BACK + for (auto out_vars_iter = (trace_relevant.args.begin() + 2); + out_vars_iter != trace_relevant.args.end(); + ++out_vars_iter) + { + var_names.emplace_back(*out_vars_iter); + } + } + + } + else if (trace_relevant.cmd.compare("math") == 0) + { + var_names.emplace_back(trace_relevant.args[1]); + } + else if (trace_relevant.cmd.compare("string") == 0) + { + if (trace_relevant.args[0].compare("FIND") == 0 || + trace_relevant.args[0].compare("REPLACE") == 0 || + trace_relevant.args[0].compare("REPEAT") == 0 + ) + { + var_names.emplace_back(trace_relevant.args[3]); + } + else if (trace_relevant.args[0].compare("JSON") == 0) + { + var_names.emplace_back(trace_relevant.args[1]); + auto output_var = + std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "ERROR_VARIABLE"); + if (output_var != trace_relevant.args.end()) + { + var_names.emplace_back(*(++output_var)); + } + } + else if (trace_relevant.args[0].compare("MD5") == 0 || + trace_relevant.args[0].compare("SHA1") == 0 || + trace_relevant.args[0].compare("SHA224") == 0 || + trace_relevant.args[0].compare("SHA256") == 0 || + trace_relevant.args[0].compare("SHA384") == 0 || + trace_relevant.args[0].compare("SHA512") == 0 || + trace_relevant.args[0].compare("SHA3_224") == 0 || + trace_relevant.args[0].compare("SHA3_256") == 0 || + trace_relevant.args[0].compare("SHA3_384") == 0 || + trace_relevant.args[0].compare("SHA3_512") == 0 || + trace_relevant.args[0].compare("TIMESTAMP") == 0 || + trace_relevant.args[0].compare("CONCAT") + ) + { + var_names.emplace_back(trace_relevant.args[1]); + } + //TODO: a lot of extra cases + } + else + { + assert(0); + } + auto args_concat = Strings::join(";", trace_relevant.args); + for (auto& var_name : var_names) + { + port_triplet_vars.insert_or_assign(var_name, Strings::concat(trace_relevant.cmd,"(",std::move(args_concat),")")); } } }; @@ -460,7 +642,7 @@ endfunction() void TripletCMakeVarProvider::launch_and_split(const Path& script_path, std::vector>>& vars, - Optional>>&> opt_triplet_vars) const + Optional>&> opt_triplet_vars) const { const auto& fs = paths.get_filesystem(); @@ -585,7 +767,7 @@ endfunction() if (specs.size() == 0) return; std::vector> spec_abi_settings; spec_abi_settings.reserve(specs.size()); - std::vector>> triplet_vars_vec; + std::vector> triplet_vars_vec; triplet_vars_vec.reserve(specs.size()); for (const FullPackageSpec& spec : specs) @@ -655,7 +837,7 @@ endfunction() return nullopt; } - Optional >&> TripletCMakeVarProvider::get_triplet_vars(const PackageSpec& spec) const + Optional &> TripletCMakeVarProvider::get_triplet_vars(const PackageSpec& spec) const { auto find_itr = triplet_vars.find(spec); if (find_itr != triplet_vars.end()) From 71a602fd1b553b0fec7a2e42e6b0aee86762756e Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Thu, 10 Nov 2022 00:22:44 +0100 Subject: [PATCH 15/29] formating --- src/vcpkg/cmakevars.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 03f6acc85d..d50a642372 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -447,9 +447,8 @@ endfunction() { port_triplet_vars.insert_or_assign(var_name, "unset"); } - } - else // is_cmd_unset + else { std::vector var_names; if ((trace_relevant.cmd.compare("set") == 0) || From 6a6262de8d6c78ed720ed4ec076527317f30cffc Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Thu, 10 Nov 2022 20:00:00 +0100 Subject: [PATCH 16/29] move line endings --- src/vcpkg/cmakevars.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index d50a642372..6da4013717 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -120,8 +120,8 @@ namespace vcpkg::CMakeVars "get_filename_component(CMAKE_CURRENT_LIST_DIR \"${CMAKE_CURRENT_LIST_FILE}\" DIRECTORY)\n"); Strings::append(extraction_file, "message(\"start-triplet-contents-0123\")\n"); Strings::append(extraction_file, fs.read_contents(path_to_triplet, VCPKG_LINE_INFO)); - Strings::append(extraction_file, "message(\"end-triplet-contents-3210\")"); - Strings::append(extraction_file, "\nendif()\n"); + Strings::append(extraction_file, "\nmessage(\"end-triplet-contents-3210\")\n"); + Strings::append(extraction_file, "endif()\n"); } Strings::append(extraction_file, R"( From 58110cf86b9f7b9fff4a2866db04560f9f9436b4 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Thu, 10 Nov 2022 20:51:29 +0100 Subject: [PATCH 17/29] apply format --- include/vcpkg-test/mockcmakevarprovider.h | 4 +- include/vcpkg/base/jsonreader.h | 3 +- include/vcpkg/cmakevars.h | 9 +- src/vcpkg-test/mockcmakevarsprovider.cpp | 4 +- src/vcpkg/build.cpp | 6 +- src/vcpkg/cmakevars.cpp | 178 +++++++++++----------- 6 files changed, 102 insertions(+), 102 deletions(-) diff --git a/include/vcpkg-test/mockcmakevarprovider.h b/include/vcpkg-test/mockcmakevarprovider.h index 2020805a81..58963d0ff0 100644 --- a/include/vcpkg-test/mockcmakevarprovider.h +++ b/include/vcpkg-test/mockcmakevarprovider.h @@ -19,8 +19,8 @@ namespace vcpkg::Test } void load_tag_and_triplet_vars(Span specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const override + const PortFileProvider& port_provider, + Triplet host_triplet) const override { for (auto&& spec : specs) tag_vars.emplace(spec.package_spec, SMap{}); diff --git a/include/vcpkg/base/jsonreader.h b/include/vcpkg/base/jsonreader.h index d3351ef90e..e0106adecd 100644 --- a/include/vcpkg/base/jsonreader.h +++ b/include/vcpkg/base/jsonreader.h @@ -8,6 +8,7 @@ #include #include #include + #include namespace vcpkg::Json @@ -319,7 +320,7 @@ namespace vcpkg::Json virtual Optional visit_number(Reader&, double value) override { - if(!std::isfinite(value)) return nullopt; + if (!std::isfinite(value)) return nullopt; return value; } diff --git a/include/vcpkg/cmakevars.h b/include/vcpkg/cmakevars.h index a53787afa9..f67b2bfb35 100644 --- a/include/vcpkg/cmakevars.h +++ b/include/vcpkg/cmakevars.h @@ -49,17 +49,16 @@ namespace vcpkg::CMakeVars virtual Optional&> get_tag_vars( const PackageSpec& spec) const = 0; - virtual Optional < const std::unordered_map&> get_triplet_vars( - const PackageSpec& spec) const = 0; - + virtual Optional&> get_triplet_vars( + const PackageSpec& spec) const = 0; virtual void load_generic_triplet_vars(Triplet triplet) const = 0; virtual void load_dep_info_vars(Span specs, Triplet host_triplet) const = 0; virtual void load_tag_and_triplet_vars(Span specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const = 0; + const PortFileProvider& port_provider, + Triplet host_triplet) const = 0; void load_tag_vars(const ActionPlan& action_plan, const PortFileProvider& port_provider, diff --git a/src/vcpkg-test/mockcmakevarsprovider.cpp b/src/vcpkg-test/mockcmakevarsprovider.cpp index d56884e216..e946f7701d 100644 --- a/src/vcpkg-test/mockcmakevarsprovider.cpp +++ b/src/vcpkg-test/mockcmakevarsprovider.cpp @@ -26,8 +26,8 @@ namespace vcpkg::Test return it->second; } - Optional&> MockCMakeVarProvider:: - get_triplet_vars(const PackageSpec& spec) const + Optional&> MockCMakeVarProvider::get_triplet_vars( + const PackageSpec& spec) const { auto find_itr = triplet_vars.find(spec); if (find_itr != triplet_vars.end()) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 3ee2c25f72..384e607d97 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -540,9 +539,8 @@ namespace vcpkg } else { - return triplet_entry.triplet_infos_without_compiler.get_lazy(toolchain_hash, [&]() -> std::string { - return toolchain_hash; - }); + return triplet_entry.triplet_infos_without_compiler.get_lazy( + toolchain_hash, [&]() -> std::string { return toolchain_hash; }); } } diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 6da4013717..f7545ef7ea 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -1,11 +1,10 @@ -#include #include +#include #include #include #include #include #include -#include #include #include @@ -13,6 +12,8 @@ #include #include +#include + using namespace vcpkg; namespace vcpkg::CMakeVars { @@ -55,8 +56,8 @@ namespace vcpkg::CMakeVars void load_dep_info_vars(View specs, Triplet host_triplet) const override; void load_tag_and_triplet_vars(View specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const override; + const PortFileProvider& port_provider, + Triplet host_triplet) const override; Optional&> get_generic_triplet_vars( Triplet triplet) const override; @@ -66,8 +67,8 @@ namespace vcpkg::CMakeVars Optional&> get_tag_vars( const PackageSpec& spec) const override; - Optional < const std::unordered_map&> get_triplet_vars( - const PackageSpec& spec) const override; + Optional&> get_triplet_vars( + const PackageSpec& spec) const override; CMakeTraceOutput parse_cmake_trace(const std::vector& trace_lines) const; @@ -88,7 +89,8 @@ namespace vcpkg::CMakeVars const VcpkgPaths& paths; mutable std::unordered_map> dep_resolution_vars; mutable std::unordered_map> tag_vars; - mutable std::unordered_map> triplet_vars; // I feel like I could also add --x-cmake-args into this variable + mutable std::unordered_map> + triplet_vars; // I feel like I could also add --x-cmake-args into this variable mutable std::unordered_map> generic_triplet_vars; }; } @@ -288,8 +290,10 @@ endfunction() { Optional x; CMakeTraceVersion& ret = x.emplace(); - r.required_object_field("the major version", obj, "major", ret.major, Json::NaturalNumberDeserializer::instance); - r.required_object_field("the minor version", obj, "minor", ret.minor, Json::NaturalNumberDeserializer::instance); + r.required_object_field( + "the major version", obj, "major", ret.major, Json::NaturalNumberDeserializer::instance); + r.required_object_field( + "the minor version", obj, "minor", ret.minor, Json::NaturalNumberDeserializer::instance); return x; } @@ -302,19 +306,26 @@ endfunction() { Optional x; CMakeTraceLine& ret = x.emplace(); - //TODO: figure out what goes in here + // TODO: figure out what goes in here static Json::ArrayDeserializer args_des("an array of arguments", - Json::StringDeserializer{"an argument"}); + Json::StringDeserializer{"an argument"}); static Json::StringDeserializer cmd_deserializer("the cmake command"); static Json::StringDeserializer file_deserializer("the file executing the command"); r.required_object_field("the arguments", obj, "args", ret.args, args_des); r.required_object_field("the command", obj, "cmd", ret.cmd, cmd_deserializer); r.required_object_field("the file name", obj, "file", ret.file, Json::PathDeserializer::instance); - r.required_object_field("the internal execution frame", obj, "frame", ret.frame, Json::NaturalNumberDeserializer::instance); - r.required_object_field("the global execution frame", obj, "global_frame", ret.global_frame, Json::NaturalNumberDeserializer::instance); - r.required_object_field("the line number", obj, "line", ret.line, Json::NaturalNumberDeserializer::instance); + r.required_object_field( + "the internal execution frame", obj, "frame", ret.frame, Json::NaturalNumberDeserializer::instance); + r.required_object_field("the global execution frame", + obj, + "global_frame", + ret.global_frame, + Json::NaturalNumberDeserializer::instance); + r.required_object_field( + "the line number", obj, "line", ret.line, Json::NaturalNumberDeserializer::instance); r.optional_object_field(obj, "line_end", ret.line_end.emplace(), Json::NaturalNumberDeserializer::instance); - r.required_object_field("the execution time", obj, "time", ret.time, Json::RealNumberDeserializer::instance); + r.required_object_field( + "the execution time", obj, "time", ret.time, Json::RealNumberDeserializer::instance); return x; } }; @@ -350,11 +361,10 @@ endfunction() return cmake_trace; } - void TripletCMakeVarProvider::analyze_cmake_trace( - const CMakeTraceOutput& cmake_trace, - std::vector>& result) const + void TripletCMakeVarProvider::analyze_cmake_trace( + const CMakeTraceOutput& cmake_trace, std::vector>& result) const { - // Basic trace order: + // Basic trace order: // cmd: vcpkg_get_tags or vcpkg_get_dep_info // cmd message: (triplet start) d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af PORT_START_GUID - single argument // cmd: vcpkg_triplet_file @@ -386,32 +396,31 @@ endfunction() }; auto is_relevant_command = [](const CMakeTraceLine& t) { static std::vector cmake_commands{"set", - "unset", - "cmake_path", - "execute_process", - "file", - "find_file", - "find_library", - "find_path", - "find_program", - "get_cmake_property", - "get_directory_property", - "get_filename_component", - "get_property", - "list", - "math", - "option", - "separate_arguments", - "string", - "site_name" - }; + "unset", + "cmake_path", + "execute_process", + "file", + "find_file", + "find_library", + "find_path", + "find_program", + "get_cmake_property", + "get_directory_property", + "get_filename_component", + "get_property", + "list", + "math", + "option", + "separate_arguments", + "string", + "site_name"}; for (const auto& to_compare : cmake_commands) if (t.cmd.compare(to_compare) == 0) return true; return false; }; auto is_cmd_unset = [](const CMakeTraceLine& t) { return (t.cmd.compare("unset") == 0); }; - + const auto trace_end = cmake_trace.traces.end(); // Find first call block auto tags_or_deps_iter_begin = @@ -451,15 +460,13 @@ endfunction() else { std::vector var_names; - if ((trace_relevant.cmd.compare("set") == 0) || - (trace_relevant.cmd.compare("option") == 0) || + if ((trace_relevant.cmd.compare("set") == 0) || (trace_relevant.cmd.compare("option") == 0) || (trace_relevant.cmd.compare("separate_arguments") == 0) || (trace_relevant.cmd.compare("site_name") == 0) || // get_cmake_property, get_directory_property, get_filename_component, get_property - (trace_relevant.cmd.substr(0, 4).compare("get_") == 0) || + (trace_relevant.cmd.substr(0, 4).compare("get_") == 0) || // find_file, find_library, find_path, find_program - (trace_relevant.cmd.substr(0, 5).compare("find_") == 0) - ) + (trace_relevant.cmd.substr(0, 5).compare("find_") == 0)) { var_names.emplace_back(trace_relevant.args[0]); } @@ -473,10 +480,10 @@ endfunction() { var_names.emplace_back(*trace_relevant.args.end()); } - else if (trace_relevant.args[0].compare("COMPARE") == 0 || + else if (trace_relevant.args[0].compare("COMPARE") == 0 || trace_relevant.args[0].compare("HASH") == 0 || - trace_relevant.args[0].compare("NATIVE_PATH") == 0 || - trace_relevant.args[0].substr(0, 3).compare("IS_") == 0 || + trace_relevant.args[0].compare("NATIVE_PATH") == 0 || + trace_relevant.args[0].substr(0, 3).compare("IS_") == 0 || trace_relevant.args[0].substr(0, 4).compare("HAS_") == 0) { var_names.emplace_back(*trace_relevant.args.end()); @@ -492,8 +499,7 @@ endfunction() trace_relevant.args[0].compare("REMOVE_FILENAME") == 0 || trace_relevant.args[0].compare("REPLACE_FILENAME") == 0 || trace_relevant.args[0].compare("REMOVE_EXTENSION") == 0 || - trace_relevant.args[0].compare("REPLACE_EXTENSION") == 0 - ) + trace_relevant.args[0].compare("REPLACE_EXTENSION") == 0) { auto output_var = std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "OUTPUT_VARIABLE"); @@ -513,7 +519,7 @@ endfunction() std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "OUTPUT_VARIABLE"); if (output_var != trace_relevant.args.end()) { - var_names.emplace_back(*(++ output_var)); + var_names.emplace_back(*(++output_var)); } output_var = std::find(trace_relevant.args.begin(), trace_relevant.args.end(), "RESULT_VARIABLE"); @@ -538,8 +544,7 @@ endfunction() { if (trace_relevant.args[0].compare("READ") == 0 || trace_relevant.args[0].compare("STRINGS") == 0 || - trace_relevant.args[0].compare("MD5") == 0 || - trace_relevant.args[0].compare("SHA1") == 0 || + trace_relevant.args[0].compare("MD5") == 0 || trace_relevant.args[0].compare("SHA1") == 0 || trace_relevant.args[0].compare("SHA224") == 0 || trace_relevant.args[0].compare("SHA256") == 0 || trace_relevant.args[0].compare("SHA384") == 0 || @@ -549,19 +554,17 @@ endfunction() trace_relevant.args[0].compare("SHA3_384") == 0 || trace_relevant.args[0].compare("SHA3_512") == 0 || trace_relevant.args[0].compare("TIMESTAMP") == 0 || - trace_relevant.args[0].compare("SIZE") == 0 || + trace_relevant.args[0].compare("SIZE") == 0 || trace_relevant.args[0].compare("READ_SYMLINK") == 0 || trace_relevant.args[0].compare("REAL_PATH") == 0 || trace_relevant.args[0].compare("TO_CMAKE_PATH") == 0 || - trace_relevant.args[0].compare("TO_NATIVE_PATH") == 0 - ) + trace_relevant.args[0].compare("TO_NATIVE_PATH") == 0) { var_names.emplace_back(trace_relevant.args[2]); } else if (trace_relevant.args[0].compare("GLOB") == 0 || trace_relevant.args[0].compare("GLOB_RECURSE") == 0 || - trace_relevant.args[0].compare("RELATIVE_PATH") == 0 - ) + trace_relevant.args[0].compare("RELATIVE_PATH") == 0) { var_names.emplace_back(trace_relevant.args[1]); } @@ -579,7 +582,6 @@ endfunction() var_names.emplace_back(*out_vars_iter); } } - } else if (trace_relevant.cmd.compare("math") == 0) { @@ -589,8 +591,7 @@ endfunction() { if (trace_relevant.args[0].compare("FIND") == 0 || trace_relevant.args[0].compare("REPLACE") == 0 || - trace_relevant.args[0].compare("REPEAT") == 0 - ) + trace_relevant.args[0].compare("REPEAT") == 0) { var_names.emplace_back(trace_relevant.args[3]); } @@ -605,22 +606,21 @@ endfunction() } } else if (trace_relevant.args[0].compare("MD5") == 0 || - trace_relevant.args[0].compare("SHA1") == 0 || - trace_relevant.args[0].compare("SHA224") == 0 || - trace_relevant.args[0].compare("SHA256") == 0 || - trace_relevant.args[0].compare("SHA384") == 0 || - trace_relevant.args[0].compare("SHA512") == 0 || - trace_relevant.args[0].compare("SHA3_224") == 0 || - trace_relevant.args[0].compare("SHA3_256") == 0 || - trace_relevant.args[0].compare("SHA3_384") == 0 || - trace_relevant.args[0].compare("SHA3_512") == 0 || - trace_relevant.args[0].compare("TIMESTAMP") == 0 || - trace_relevant.args[0].compare("CONCAT") - ) + trace_relevant.args[0].compare("SHA1") == 0 || + trace_relevant.args[0].compare("SHA224") == 0 || + trace_relevant.args[0].compare("SHA256") == 0 || + trace_relevant.args[0].compare("SHA384") == 0 || + trace_relevant.args[0].compare("SHA512") == 0 || + trace_relevant.args[0].compare("SHA3_224") == 0 || + trace_relevant.args[0].compare("SHA3_256") == 0 || + trace_relevant.args[0].compare("SHA3_384") == 0 || + trace_relevant.args[0].compare("SHA3_512") == 0 || + trace_relevant.args[0].compare("TIMESTAMP") == 0 || + trace_relevant.args[0].compare("CONCAT")) { var_names.emplace_back(trace_relevant.args[1]); } - //TODO: a lot of extra cases + // TODO: a lot of extra cases } else { @@ -629,18 +629,19 @@ endfunction() auto args_concat = Strings::join(";", trace_relevant.args); for (auto& var_name : var_names) { - port_triplet_vars.insert_or_assign(var_name, Strings::concat(trace_relevant.cmd,"(",std::move(args_concat),")")); + port_triplet_vars.insert_or_assign( + var_name, Strings::concat(trace_relevant.cmd, "(", std::move(args_concat), ")")); } } }; tags_or_deps_iter_begin = tags_or_deps_iter_end; result.emplace_back(std::move(port_triplet_vars)); } - } - void TripletCMakeVarProvider::launch_and_split(const Path& script_path, - std::vector>>& vars, + void TripletCMakeVarProvider::launch_and_split( + const Path& script_path, + std::vector>>& vars, Optional>&> opt_triplet_vars) const { const auto& fs = paths.get_filesystem(); @@ -650,10 +651,11 @@ endfunction() static constexpr StringLiteral BLOCK_START_GUID = "c35112b6-d1ba-415b-aa5d-81de856ef8eb"; static constexpr StringLiteral BLOCK_END_GUID = "e1e74b5c-18cb-4474-a6bd-5c1c8bc81f3f"; - const auto trace_output = Path(script_path.parent_path())/"0.vcpkg_tags.trace"; + const auto trace_output = Path(script_path.parent_path()) / "0.vcpkg_tags.trace"; const auto trace_redirect = std::string("--trace-redirect=") + trace_output.c_str(); - const auto cmd_launch_cmake = vcpkg::make_cmake_cmd(paths, script_path, {}, {{"--trace-format=json-v1"}, {trace_redirect}}); - //TODO: delete trace file after read! + const auto cmd_launch_cmake = + vcpkg::make_cmake_cmd(paths, script_path, {}, {{"--trace-format=json-v1"}, {trace_redirect}}); + // TODO: delete trace file after read! std::vector lines; auto const exit_code = cmd_execute_and_stream_lines( @@ -661,7 +663,7 @@ endfunction() [&](StringView sv) { lines.emplace_back(sv.begin(), sv.end()); }, default_working_directory) .value_or_exit(VCPKG_LINE_INFO); - + if (exit_code != 0) { Checks::msg_exit_with_message( @@ -677,7 +679,7 @@ endfunction() CMakeTraceOutput cmake_trace = parse_cmake_trace(trace_lines); // Parse (unexpanded) trace output - analyze_cmake_trace(cmake_trace, *triplet_vars_out); + analyze_cmake_trace(cmake_trace, *triplet_vars_out); } // Parse cmake message output (expanded) const auto end = lines.cend(); @@ -760,13 +762,13 @@ endfunction() } void TripletCMakeVarProvider::load_tag_and_triplet_vars(View specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const + const PortFileProvider& port_provider, + Triplet host_triplet) const { if (specs.size() == 0) return; std::vector> spec_abi_settings; spec_abi_settings.reserve(specs.size()); - std::vector> triplet_vars_vec; + std::vector> triplet_vars_vec; triplet_vars_vec.reserve(specs.size()); for (const FullPackageSpec& spec : specs) @@ -780,7 +782,7 @@ endfunction() const auto file_path = create_tag_extraction_file(spec_abi_settings); launch_and_split(file_path, vars, triplet_vars_vec); paths.get_filesystem().remove(file_path, VCPKG_LINE_INFO); - + auto var_list_itr = vars.begin(); auto triplet_vars_iter = triplet_vars_vec.begin(); for (const auto& spec_abi_setting : spec_abi_settings) @@ -798,7 +800,6 @@ endfunction() } } - // All those function below do the same.... Optional&> TripletCMakeVarProvider::get_generic_triplet_vars( Triplet triplet) const @@ -836,7 +837,8 @@ endfunction() return nullopt; } - Optional &> TripletCMakeVarProvider::get_triplet_vars(const PackageSpec& spec) const + Optional&> TripletCMakeVarProvider::get_triplet_vars( + const PackageSpec& spec) const { auto find_itr = triplet_vars.find(spec); if (find_itr != triplet_vars.end()) From e538902bc838f9e602d9f863c8ef43dc0b1b0b20 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Thu, 10 Nov 2022 22:27:12 +0100 Subject: [PATCH 18/29] add numeric include --- src/vcpkg/build.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 384e607d97..92561c2ba9 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -35,6 +35,8 @@ #include #include +#include + using namespace vcpkg; namespace From 2514ee2443ae7c3024bee6d54553175a799c7171 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Fri, 11 Nov 2022 23:42:13 +0100 Subject: [PATCH 19/29] need some newlines for linux so that trace output info doesn't break the block detection --- src/vcpkg/cmakevars.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index f7545ef7ea..e7b669c07f 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -152,7 +152,7 @@ endmacro() Strings::append(extraction_file, R"( function(vcpkg_get_tags PORT FEATURES VCPKG_TRIPLET_ID VCPKG_ABI_SETTINGS_FILE) - message("d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af") + message("\nd8187afd-ea4a-4fc3-9aa4-a6782e1ed9af\n") vcpkg_triplet_file(${VCPKG_TRIPLET_ID}) # GUID used as a flag - "cut here line" @@ -233,7 +233,7 @@ endfunction() Strings::append(extraction_file, R"( function(vcpkg_get_dep_info PORT VCPKG_TRIPLET_ID) - message("d8187afd-ea4a-4fc3-9aa4-a6782e1ed9af") + message("\nd8187afd-ea4a-4fc3-9aa4-a6782e1ed9af\n") vcpkg_triplet_file(${VCPKG_TRIPLET_ID}) # GUID used as a flag - "cut here line" From 34b0166a02bd7488fd1b305911cb13932a66acf4 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Fri, 11 Nov 2022 23:42:28 +0100 Subject: [PATCH 20/29] set load_vcvars_env to false for !windows --- src/vcpkg/build.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 92561c2ba9..32594da336 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -1721,7 +1721,11 @@ namespace vcpkg case VcpkgTripletVar::LOAD_VCVARS_ENV: if (variable_value.empty()) { + #ifdef WIN32 load_vcvars_env = !external_toolchain_file.has_value(); + #else + load_vcvars_env = false; + #endif } else { From 3a2426d6eb55d57341f00eed98ca013696ee3b3f Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sat, 12 Nov 2022 00:09:29 +0100 Subject: [PATCH 21/29] apply format --- src/vcpkg/build.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 32594da336..c470ba3ebb 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -1721,11 +1721,11 @@ namespace vcpkg case VcpkgTripletVar::LOAD_VCVARS_ENV: if (variable_value.empty()) { - #ifdef WIN32 +#ifdef WIN32 load_vcvars_env = !external_toolchain_file.has_value(); - #else +#else load_vcvars_env = false; - #endif +#endif } else { From 124f694d3f5d04c71f68becb58999fb27e35b5e4 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sat, 12 Nov 2022 00:09:55 +0100 Subject: [PATCH 22/29] fix e2e test --- azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 b/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 index 01b52420ba..98c6c14ce0 100644 --- a/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 @@ -9,23 +9,23 @@ $args = $commonArgs + @("--overlay-triplets=$PSScriptRoot/../e2e_ports/compilert # Test simple installation Run-Vcpkg -TestArgs ($args + @("install", "vcpkg-hello-world-1")) Throw-IfFailed -if (-Not (select-string "^triplet_abi [0-9a-f]+-[0-9a-f]+-[0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-1/vcpkg_abi_info.txt")) { +if (-Not (select-string "^toolchain_abi [0-9a-f]+-[0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-1/vcpkg_abi_info.txt")) { throw "Expected vcpkg-hello-world-1 to perform compiler detection" } Remove-Item -Recurse -Force $installRoot Run-Vcpkg -TestArgs ($args + @("install", "vcpkg-hello-world-2")) Throw-IfFailed -if (-Not (select-string "^triplet_abi [0-9a-f]+-[0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-2/vcpkg_abi_info.txt")) { +if (-Not (select-string "^toolchain_abi [0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-2/vcpkg_abi_info.txt")) { throw "Expected vcpkg-hello-world-2 to not perform compiler detection" } Remove-Item -Recurse -Force $installRoot Run-Vcpkg -TestArgs ($args + @("install", "vcpkg-hello-world-2", "vcpkg-hello-world-1")) Throw-IfFailed -if (-Not (select-string "^triplet_abi [0-9a-f]+-[0-9a-f]+-[0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-1/vcpkg_abi_info.txt")) { +if (-Not (select-string "^toolchain_abi [0-9a-f]+-[0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-1/vcpkg_abi_info.txt")) { throw "Expected vcpkg-hello-world-1 to perform compiler detection" } -if (-Not (select-string "^triplet_abi [0-9a-f]+-[0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-2/vcpkg_abi_info.txt")) { +if (-Not (select-string "^toolchain_abi [0-9a-f]+$" "$installRoot/x64-linux/share/vcpkg-hello-world-2/vcpkg_abi_info.txt")) { throw "Expected vcpkg-hello-world-2 to not perform compiler detection" } From 73fd28dfcdcc21925dd91899eca597978a4aac6e Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:28:25 +0100 Subject: [PATCH 23/29] rename define to use _WIN32 as the rest of the code --- src/vcpkg/build.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index c470ba3ebb..9ddc0faa72 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -1721,7 +1721,7 @@ namespace vcpkg case VcpkgTripletVar::LOAD_VCVARS_ENV: if (variable_value.empty()) { -#ifdef WIN32 +#if defined(_WIN32) load_vcvars_env = !external_toolchain_file.has_value(); #else load_vcvars_env = false; From 20b1826118235a4b0ad3dd811d0b1716eab7eaa5 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:28:40 +0100 Subject: [PATCH 24/29] more cases and bug fixes --- src/vcpkg/cmakevars.cpp | 73 ++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 27 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index e7b669c07f..93e7604217 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -452,9 +452,9 @@ endfunction() { [[maybe_unused]] const auto throw_away = port_triplet_vars.extract(var_name); } - else if (var_name.substr(0, 4).compare("ENV{")) + else if (var_name.substr(0, 4).compare("ENV{") == 0) { - port_triplet_vars.insert_or_assign(var_name, "unset"); + port_triplet_vars.insert_or_assign(var_name, Strings::concat("unset(",var_name,")")); } } else @@ -478,7 +478,7 @@ endfunction() } else if (trace_relevant.args[0].compare("GET") == 0) { - var_names.emplace_back(*trace_relevant.args.end()); + var_names.emplace_back(trace_relevant.args.back()); } else if (trace_relevant.args[0].compare("COMPARE") == 0 || trace_relevant.args[0].compare("HASH") == 0 || @@ -486,7 +486,7 @@ endfunction() trace_relevant.args[0].substr(0, 3).compare("IS_") == 0 || trace_relevant.args[0].substr(0, 4).compare("HAS_") == 0) { - var_names.emplace_back(*trace_relevant.args.end()); + var_names.emplace_back(trace_relevant.args.back()); } else if (trace_relevant.args[0].compare("CONVERT") == 0) { @@ -544,21 +544,14 @@ endfunction() { if (trace_relevant.args[0].compare("READ") == 0 || trace_relevant.args[0].compare("STRINGS") == 0 || - trace_relevant.args[0].compare("MD5") == 0 || trace_relevant.args[0].compare("SHA1") == 0 || - trace_relevant.args[0].compare("SHA224") == 0 || - trace_relevant.args[0].compare("SHA256") == 0 || - trace_relevant.args[0].compare("SHA384") == 0 || - trace_relevant.args[0].compare("SHA512") == 0 || - trace_relevant.args[0].compare("SHA3_224") == 0 || - trace_relevant.args[0].compare("SHA3_256") == 0 || - trace_relevant.args[0].compare("SHA3_384") == 0 || - trace_relevant.args[0].compare("SHA3_512") == 0 || trace_relevant.args[0].compare("TIMESTAMP") == 0 || trace_relevant.args[0].compare("SIZE") == 0 || trace_relevant.args[0].compare("READ_SYMLINK") == 0 || trace_relevant.args[0].compare("REAL_PATH") == 0 || trace_relevant.args[0].compare("TO_CMAKE_PATH") == 0 || - trace_relevant.args[0].compare("TO_NATIVE_PATH") == 0) + trace_relevant.args[0].compare("TO_NATIVE_PATH") == 0 || + trace_relevant.args[0].compare("MD5") == 0 || + trace_relevant.args[0].substr(0, 3).compare("SHA") == 0) { var_names.emplace_back(trace_relevant.args[2]); } @@ -572,7 +565,7 @@ endfunction() else if (trace_relevant.cmd.compare("list") == 0) { var_names.emplace_back(trace_relevant.args[1]); - if (trace_relevant.args[0].substr(0, 4).compare("POP_") && trace_relevant.args.size() >= 3) + if (trace_relevant.args[0].substr(0, 4).compare("POP_") == 0 && trace_relevant.args.size() >= 3) { // POP_FRONT|BACK for (auto out_vars_iter = (trace_relevant.args.begin() + 2); @@ -605,22 +598,48 @@ endfunction() var_names.emplace_back(*(++output_var)); } } - else if (trace_relevant.args[0].compare("MD5") == 0 || - trace_relevant.args[0].compare("SHA1") == 0 || - trace_relevant.args[0].compare("SHA224") == 0 || - trace_relevant.args[0].compare("SHA256") == 0 || - trace_relevant.args[0].compare("SHA384") == 0 || - trace_relevant.args[0].compare("SHA512") == 0 || - trace_relevant.args[0].compare("SHA3_224") == 0 || - trace_relevant.args[0].compare("SHA3_256") == 0 || - trace_relevant.args[0].compare("SHA3_384") == 0 || - trace_relevant.args[0].compare("SHA3_512") == 0 || + else if (trace_relevant.args[0].compare("APPEND") == 0 || + trace_relevant.args[0].compare("PREPEND") == 0 || trace_relevant.args[0].compare("TIMESTAMP") == 0 || - trace_relevant.args[0].compare("CONCAT")) + trace_relevant.args[0].compare("UUID") == 0 || + trace_relevant.args[0].compare("CONCAT") == 0 || + trace_relevant.args[0].compare("MD5") == 0 || + trace_relevant.args[0].substr(0, 3).compare("SHA") == 0) { var_names.emplace_back(trace_relevant.args[1]); } - // TODO: a lot of extra cases + else if (trace_relevant.args[0].compare("JOIN") == 0 || + trace_relevant.args[0].compare("TOLOWER") == 0 || + trace_relevant.args[0].compare("TOUPPER") == 0 || + trace_relevant.args[0].compare("LENGTH") == 0 || + trace_relevant.args[0].compare("STRIP") == 0 || + trace_relevant.args[0].compare("HEX") == 0 || + trace_relevant.args[0].compare("CONFIGURE") == 0 || + trace_relevant.args[0].compare("MAKE_C_IDENTIFIER") == 0 || + trace_relevant.args[0].compare("GENEX_STRIP") == 0) + { + var_names.emplace_back(trace_relevant.args[2]); + } + else if (trace_relevant.args[0].compare("REGEX") == 0) + { + if (trace_relevant.args[1].compare("REPLACE") == 0) + { + var_names.emplace_back(trace_relevant.args[4]); + } else { + var_names.emplace_back(trace_relevant.args[3]); + } + } + else if (trace_relevant.args[0].compare("SUBSTRING") == 0 || + trace_relevant.args[0].compare("ASCII") == 0 || + trace_relevant.args[0].compare("RANDOM") == 0 || + trace_relevant.args[0].compare("COMPARE") == 0) + { + var_names.emplace_back(trace_relevant.args.back()); + } + else + { + Checks::unreachable(VCPKG_LINE_INFO); + } } else { From aec5d21f806a9a5574d539d626184061254de8a2 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:28:53 +0100 Subject: [PATCH 25/29] e2e test --- .../e2e_ports/triplet-abi/file-to-read | 1 + .../vcpkg-test-triplet-abi/expected-abi.txt | 52 ++++++++++++++++ .../vcpkg-test-triplet-abi/portfile.cmake | 17 ++++++ .../vcpkg-test-triplet-abi/unexpected-abi.txt | 5 ++ .../vcpkg-test-triplet-abi/vcpkg.json | 5 ++ .../e2e_ports/triplet-abi/x64-abi.cmake | 60 +++++++++++++++++++ .../end-to-end-tests-dir/triplet-abi.ps1 | 2 + 7 files changed, 142 insertions(+) create mode 100644 azure-pipelines/e2e_ports/triplet-abi/file-to-read create mode 100644 azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt create mode 100644 azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake create mode 100644 azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/unexpected-abi.txt create mode 100644 azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/vcpkg.json create mode 100644 azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake create mode 100644 azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 diff --git a/azure-pipelines/e2e_ports/triplet-abi/file-to-read b/azure-pipelines/e2e_ports/triplet-abi/file-to-read new file mode 100644 index 0000000000..8d1d542395 --- /dev/null +++ b/azure-pipelines/e2e_ports/triplet-abi/file-to-read @@ -0,0 +1 @@ +nothing to see here \ No newline at end of file diff --git a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt new file mode 100644 index 0000000000..ae5026f44c --- /dev/null +++ b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt @@ -0,0 +1,52 @@ +ENV{NOTPATH} unset(ENV{NOTPATH}) +EXE_ERR_VAR execute_process(COMMAND;echo;Hello;OUTPUT_VARIABLE;EXE_OUT_VAR;RESULT_VARIABLE;EXE_RES_VAR;ERROR_VARIABLE;EXE_ERR_VAR) +EXE_OUT_VAR execute_process(COMMAND;echo;Hello;OUTPUT_VARIABLE;EXE_OUT_VAR;RESULT_VARIABLE;EXE_RES_VAR;ERROR_VARIABLE;EXE_ERR_VAR) +EXE_RES_VAR execute_process(COMMAND;echo;Hello;OUTPUT_VARIABLE;EXE_OUT_VAR;RESULT_VARIABLE;EXE_RES_VAR;ERROR_VARIABLE;EXE_ERR_VAR) +FILE_CMAKE_VAR file(RELATIVE_PATH;FILE_CMAKE_VAR;${CMAKE_CURRENT_LIST_DIR};${CMAKE_CURRENT_LIST_DIR}/file-to-read) +FILE_GLOB_VAR file(GLOB;FILE_GLOB_VAR;*) +FILE_HASH_VAR file(SHA512;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_HASH_VAR) +FILE_READ_VAR file(READ;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_READ_VAR) +FILE_REAL_VAR file(REAL_PATH;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_REAL_VAR) +FILE_SIZE_VAR file(SIZE;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_SIZE_VAR) +FILE_STRINGS_VAR file(STRINGS;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_STRINGS_VAR) +FILE_TIMESTAMP_VAR file(TIMESTAMP;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_TIMESTAMP_VAR) +FIND_VAR find_program(FIND_VAR;NAMES;gcc) +GET_VAR get_directory_property(GET_VAR;VARIABLES) +JSON_ERR_VAR string(JSON;JSON_VAR;ERROR_VARIABLE;JSON_ERR_VAR;GET;{\"test\": true};test) +JSON_VAR string(JSON;JSON_VAR;ERROR_VARIABLE;JSON_ERR_VAR;GET;{\"test\": true};test) +LIST_VAR2 list(APPEND;LIST_VAR2;"e1";"e2";"e3") +LIST_VAR list(POP_BACK;LIST_VAR;LIST_OUT_VAR) +LIST_OUT_VAR list(POP_BACK;LIST_VAR;LIST_OUT_VAR) +MATH_VAR math(EXPR;MATH_VAR;1 + 1) +OPT_VAR option(OPT_VAR;TEXT;OFF) +PATH_CONVERT_VAR cmake_path(CONVERT;$ENV{PATH};TO_CMAKE_PATH_LIST;PATH_CONVERT_VAR) +PATH_HASH_VAR cmake_path(HASH;PATH_VAR;PATH_HASH_VAR) +PATH_HAS_VAR cmake_path(HAS_EXTENSION;PATH_VAR;PATH_HAS_VAR) +PATH_IS_VAR cmake_path(IS_RELATIVE;PATH_VAR;PATH_IS_VAR) +PATH_NATIVE_VAR cmake_path(NATIVE_PATH;PATH_VAR;PATH_NATIVE_VAR) +PATH_NORMAL_VAR cmake_path(NORMAL_PATH;PATH_VAR;OUTPUT_VARIABLE;PATH_NORMAL_VAR) +PATH_REMOVE_VAR cmake_path(REMOVE_FILENAME;PATH_VAR;OUTPUT_VARIABLE;PATH_REMOVE_VAR) +PATH_ROOT_VAR cmake_path(GET;PATH_VAR;ROOT_NAME;PATH_ROOT_VAR) +PATH_VAR cmake_path(SET;PATH_VAR;i/am/a/path) +SEPT_VAR separate_arguments(SEPT_VAR;NATIVE_COMMAND;-sep -args -please) +SITE_VAR site_name(SITE_VAR) +STRING_APPEND_VAR string(APPEND;STRING_APPEND_VAR;APPENDME) +STRING_ASCII_VAR string(ASCII;10;20;30;STRING_ASCII_VAR) +STRING_COMPARE_VAR string(COMPARE;EQUAL;ABC;123;STRING_COMPARE_VAR) +STRING_CONCAT_VAR string(CONCAT;STRING_CONCAT_VAR;abc;123) +STRING_C_VAR string(MAKE_C_IDENTIFIER;0x100;STRING_C_VAR) +STRING_FIND_VAR string(FIND;FINDME;ME;STRING_FIND_VAR) +STRING_HASH_VAR string(SHA512;STRING_HASH_VAR;12345) +STRING_HEX_VAR string(HEX;1020;STRING_HEX_VAR) +STRING_PREPEND_VAR string(PREPEND;STRING_PREPEND_VAR;PREPENDME) +STRING_RANDOM_VAR string(RANDOM;STRING_RANDOM_VAR) +STRING_REG_MATCH_VAR string(REGEX;MATCH;TEST;STRING_REG_MATCH_VAR;TEST123) +STRING_REG_REPLACE_VAR string(REGEX;REPLACE;TEST;;STRING_REG_REPLACE_VAR;TEST123) +STRING_REPEAT_VAR string(REPEAT;REPEAT;2;STRING_REPEAT_VAR) +STRING_REPLACE_VAR string(REPLACE;ME;;STRING_REPLACE_VAR;ALLABOUTMEME) +STRING_SUB_VAR string(SUBSTRING;ABCDEF;0;3;STRING_SUB_VAR) +STRING_TIME_VAR string(TIMESTAMP;STRING_TIME_VAR) +STRING_UUID_VAR string(UUID;STRING_UUID_VAR;NAMESPACE;6ba7b810-9dad-11d1-80b4-00c04fd430c8;NAME;test;TYPE;SHA1) +VCPKG_CRT_LINKAGE set(VCPKG_CRT_LINKAGE;dynamic) +VCPKG_LIBRARY_LINKAGE set(VCPKG_LIBRARY_LINKAGE;static) +VCPKG_TARGET_ARCHITECTURE set(VCPKG_TARGET_ARCHITECTURE;x64) \ No newline at end of file diff --git a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake new file mode 100644 index 0000000000..33156f6848 --- /dev/null +++ b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake @@ -0,0 +1,17 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) + +file(STRINGS "${CURRENT_BUILDTREES_DIR}/vcpkg-test-triplet-abi.vcpkg_abi_info.txt" actual_abi_lines) +file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/expected-abi.txt" expected_abi_lines) +file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/unexpected-abi.txt" unexpected_abi_lines) + +foreach(expected_line IN LISTS expected_abi_lines) + if(NOT "${expected_line}" IN_LIST actual_abi_lines) + message(FATAL_ERROR "Expected ABI: '${expected_line}' \n not within actual ABI: '${actual_abi_lines}'") + endif() +endforeach() + +foreach(unexpected_abi_line IN LISTS unexpected_abi_lines) + if("${unexpected_abi_line}" IN_LIST actual_abi_lines) + message(FATAL_ERROR "Unexpected ABI: '${expected_line}' \n found within actual ABI: '${actual_abi_lines}'") + endif() +endforeach() \ No newline at end of file diff --git a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/unexpected-abi.txt b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/unexpected-abi.txt new file mode 100644 index 0000000000..d5cd03c227 --- /dev/null +++ b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/unexpected-abi.txt @@ -0,0 +1,5 @@ +NOT_IN_ABI_UNSET set(NOT_IN_ABI_UNSET;test) +NOT_IN_ABI_UNSET unset(NOT_IN_ABI_UNSET) +NOT_IN_ABI_UNSET_2 unset(NOT_IN_ABI_UNSET_2) +NOT_IN_ABI set(NOT_IN_ABI;TEST) +NOT IN ABI COMMENT \ No newline at end of file diff --git a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/vcpkg.json b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/vcpkg.json new file mode 100644 index 0000000000..46e09e3f5a --- /dev/null +++ b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/vcpkg.json @@ -0,0 +1,5 @@ +{ + "name": "vcpkg-test-triplet-abi", + "version": "0", + "description": "A port that inspects the abi" +} \ No newline at end of file diff --git a/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake b/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake new file mode 100644 index 0000000000..a82b0f342f --- /dev/null +++ b/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake @@ -0,0 +1,60 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) # +set(VCPKG_CRT_LINKAGE dynamic) # +set(VCPKG_LIBRARY_LINKAGE static) # +if(0) +set(VCPKG_CMAKE_SYSTEM_NAME Windows) # NOT IN ABI COMMENT +endif() +set(NOT_IN_ABI_UNSET "test") +unset(NOT_IN_ABI_UNSET) +unset(NOT_IN_ABI_UNSET_2) +unset(ENV{NOTPATH}) # +option(OPT_VAR "TEXT" OFF) # +separate_arguments(SEPT_VAR NATIVE_COMMAND "-sep -args -please") # +site_name(SITE_VAR) # +get_directory_property(GET_VAR VARIABLES) # +find_program(FIND_VAR NAMES gcc) # +cmake_path(SET PATH_VAR "i/am/a/path") # +cmake_path(GET PATH_VAR ROOT_NAME PATH_ROOT_VAR) # +cmake_path(HASH PATH_VAR PATH_HASH_VAR) # +cmake_path(NATIVE_PATH PATH_VAR PATH_NATIVE_VAR) # +cmake_path(IS_RELATIVE PATH_VAR PATH_IS_VAR) # +cmake_path(HAS_EXTENSION PATH_VAR PATH_HAS_VAR) # +cmake_path(CONVERT "$ENV{PATH}" TO_CMAKE_PATH_LIST PATH_CONVERT_VAR) # +cmake_path(NORMAL_PATH PATH_VAR OUTPUT_VARIABLE PATH_NORMAL_VAR) # +cmake_path(REMOVE_FILENAME PATH_VAR OUTPUT_VARIABLE PATH_REMOVE_VAR) # +execute_process(COMMAND echo "Hello" OUTPUT_VARIABLE EXE_OUT_VAR RESULT_VARIABLE EXE_RES_VAR ERROR_VARIABLE EXE_ERR_VAR) ### +file(READ "${CMAKE_CURRENT_LIST_DIR}/file-to-read" FILE_READ_VAR) # +file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/file-to-read" FILE_STRINGS_VAR)# +file(SHA512 "${CMAKE_CURRENT_LIST_DIR}/file-to-read" FILE_HASH_VAR) # +file(TIMESTAMP "${CMAKE_CURRENT_LIST_DIR}/file-to-read" FILE_TIMESTAMP_VAR)# +file(SIZE "${CMAKE_CURRENT_LIST_DIR}/file-to-read" FILE_SIZE_VAR)# +file(REAL_PATH "${CMAKE_CURRENT_LIST_DIR}/file-to-read" FILE_REAL_VAR)# +file(TO_CMAKE_PATH "${CMAKE_CURRENT_LIST_DIR}/file-to-read" FILE_CMAKE_VAR)# +file(GLOB FILE_GLOB_VAR "*") # +file(RELATIVE_PATH FILE_REL_VAR "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}/file-to-read" ) # +list(APPEND LIST_VAR2 "e1" "e2" "e3")# +list(APPEND LIST_VAR "e1" "e2" "e3") +list(POP_BACK LIST_VAR LIST_OUT_VAR) # +math(EXPR MATH_VAR "1 + 1") # +string(FIND "FINDME" "ME" STRING_FIND_VAR) # +string(REPLACE "ME" "" STRING_REPLACE_VAR "ALLABOUTMEME") # +string(REPEAT "REPEAT" "2" STRING_REPEAT_VAR) # +string(APPEND STRING_APPEND_VAR "APPENDME") # +string(PREPEND STRING_PREPEND_VAR "PREPENDME") # +string(TIMESTAMP STRING_TIME_VAR) # +string(UUID STRING_UUID_VAR NAMESPACE "6ba7b810-9dad-11d1-80b4-00c04fd430c8" NAME "test" TYPE SHA1) # +string(CONCAT STRING_CONCAT_VAR "abc" "123") # +string(SHA512 STRING_HASH_VAR "12345") # +string(JSON JSON_VAR ERROR_VARIABLE JSON_ERR_VAR GET "{\"test\": true}" "test") ## +string(REGEX REPLACE "TEST" "" STRING_REG_REPLACE_VAR "TEST123") # +string(REGEX MATCH "TEST" STRING_REG_MATCH_VAR "TEST123") # +string(SUBSTRING "ABCDEF" 0 3 STRING_SUB_VAR) # +string(ASCII 10 20 30 STRING_ASCII_VAR) # +string(HEX "1020" STRING_HEX_VAR) # +string(MAKE_C_IDENTIFIER "0x100" STRING_C_VAR) # +string(RANDOM STRING_RANDOM_VAR) # +string(COMPARE "EQUAL" "ABC" "123" STRING_COMPARE_VAR) # +# Not in ABI +if(0) + set(NOT_IN_ABI "TEST") +endif() diff --git a/azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 b/azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 new file mode 100644 index 0000000000..d8012b9404 --- /dev/null +++ b/azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 @@ -0,0 +1,2 @@ +. $PSScriptRoot/../end-to-end-tests-prelude.ps1 +$y = Run-Vcpkg "--overlay-triplets=$PSScriptRoot/../e2e_ports/triplet-abi" "--overlay-ports=$PSScriptRoot/../e2e_ports/triplet-abi" install vcpkg-test-triplet-abi --triplet x64-abi \ No newline at end of file From 06c3a1c04bd0d6a91a4c5b7a424294814b2bec24 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sat, 12 Nov 2022 23:07:00 +0100 Subject: [PATCH 26/29] apply diff --- src/vcpkg/cmakevars.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 93e7604217..3ecf89f48d 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -454,7 +454,7 @@ endfunction() } else if (var_name.substr(0, 4).compare("ENV{") == 0) { - port_triplet_vars.insert_or_assign(var_name, Strings::concat("unset(",var_name,")")); + port_triplet_vars.insert_or_assign(var_name, Strings::concat("unset(", var_name, ")")); } } else @@ -550,7 +550,7 @@ endfunction() trace_relevant.args[0].compare("REAL_PATH") == 0 || trace_relevant.args[0].compare("TO_CMAKE_PATH") == 0 || trace_relevant.args[0].compare("TO_NATIVE_PATH") == 0 || - trace_relevant.args[0].compare("MD5") == 0 || + trace_relevant.args[0].compare("MD5") == 0 || trace_relevant.args[0].substr(0, 3).compare("SHA") == 0) { var_names.emplace_back(trace_relevant.args[2]); @@ -603,8 +603,8 @@ endfunction() trace_relevant.args[0].compare("TIMESTAMP") == 0 || trace_relevant.args[0].compare("UUID") == 0 || trace_relevant.args[0].compare("CONCAT") == 0 || - trace_relevant.args[0].compare("MD5") == 0 || - trace_relevant.args[0].substr(0, 3).compare("SHA") == 0) + trace_relevant.args[0].compare("MD5") == 0 || + trace_relevant.args[0].substr(0, 3).compare("SHA") == 0) { var_names.emplace_back(trace_relevant.args[1]); } @@ -620,12 +620,14 @@ endfunction() { var_names.emplace_back(trace_relevant.args[2]); } - else if (trace_relevant.args[0].compare("REGEX") == 0) + else if (trace_relevant.args[0].compare("REGEX") == 0) { if (trace_relevant.args[1].compare("REPLACE") == 0) { var_names.emplace_back(trace_relevant.args[4]); - } else { + } + else + { var_names.emplace_back(trace_relevant.args[3]); } } @@ -634,11 +636,11 @@ endfunction() trace_relevant.args[0].compare("RANDOM") == 0 || trace_relevant.args[0].compare("COMPARE") == 0) { - var_names.emplace_back(trace_relevant.args.back()); + var_names.emplace_back(trace_relevant.args.back()); } else { - Checks::unreachable(VCPKG_LINE_INFO); + Checks::unreachable(VCPKG_LINE_INFO); } } else From 0d554f5a166906a9567413da4a393e1b9297103a Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sat, 12 Nov 2022 23:27:49 +0100 Subject: [PATCH 27/29] fix test --- .../triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt | 7 ++++--- .../triplet-abi/vcpkg-test-triplet-abi/portfile.cmake | 2 +- azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt index ae5026f44c..e84a14fc18 100644 --- a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt +++ b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/expected-abi.txt @@ -2,11 +2,12 @@ ENV{NOTPATH} unset(ENV{NOTPATH}) EXE_ERR_VAR execute_process(COMMAND;echo;Hello;OUTPUT_VARIABLE;EXE_OUT_VAR;RESULT_VARIABLE;EXE_RES_VAR;ERROR_VARIABLE;EXE_ERR_VAR) EXE_OUT_VAR execute_process(COMMAND;echo;Hello;OUTPUT_VARIABLE;EXE_OUT_VAR;RESULT_VARIABLE;EXE_RES_VAR;ERROR_VARIABLE;EXE_ERR_VAR) EXE_RES_VAR execute_process(COMMAND;echo;Hello;OUTPUT_VARIABLE;EXE_OUT_VAR;RESULT_VARIABLE;EXE_RES_VAR;ERROR_VARIABLE;EXE_ERR_VAR) -FILE_CMAKE_VAR file(RELATIVE_PATH;FILE_CMAKE_VAR;${CMAKE_CURRENT_LIST_DIR};${CMAKE_CURRENT_LIST_DIR}/file-to-read) +FILE_CMAKE_VAR file(TO_CMAKE_PATH;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_CMAKE_VAR) FILE_GLOB_VAR file(GLOB;FILE_GLOB_VAR;*) FILE_HASH_VAR file(SHA512;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_HASH_VAR) FILE_READ_VAR file(READ;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_READ_VAR) FILE_REAL_VAR file(REAL_PATH;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_REAL_VAR) +FILE_REL_VAR file(RELATIVE_PATH;FILE_REL_VAR;${CMAKE_CURRENT_LIST_DIR};${CMAKE_CURRENT_LIST_DIR}/file-to-read) FILE_SIZE_VAR file(SIZE;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_SIZE_VAR) FILE_STRINGS_VAR file(STRINGS;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_STRINGS_VAR) FILE_TIMESTAMP_VAR file(TIMESTAMP;${CMAKE_CURRENT_LIST_DIR}/file-to-read;FILE_TIMESTAMP_VAR) @@ -14,9 +15,9 @@ FIND_VAR find_program(FIND_VAR;NAMES;gcc) GET_VAR get_directory_property(GET_VAR;VARIABLES) JSON_ERR_VAR string(JSON;JSON_VAR;ERROR_VARIABLE;JSON_ERR_VAR;GET;{\"test\": true};test) JSON_VAR string(JSON;JSON_VAR;ERROR_VARIABLE;JSON_ERR_VAR;GET;{\"test\": true};test) -LIST_VAR2 list(APPEND;LIST_VAR2;"e1";"e2";"e3") -LIST_VAR list(POP_BACK;LIST_VAR;LIST_OUT_VAR) LIST_OUT_VAR list(POP_BACK;LIST_VAR;LIST_OUT_VAR) +LIST_VAR list(POP_BACK;LIST_VAR;LIST_OUT_VAR) +LIST_VAR2 list(APPEND;LIST_VAR2;e1;e2;e3) MATH_VAR math(EXPR;MATH_VAR;1 + 1) OPT_VAR option(OPT_VAR;TEXT;OFF) PATH_CONVERT_VAR cmake_path(CONVERT;$ENV{PATH};TO_CMAKE_PATH_LIST;PATH_CONVERT_VAR) diff --git a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake index 33156f6848..2b42965947 100644 --- a/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake +++ b/azure-pipelines/e2e_ports/triplet-abi/vcpkg-test-triplet-abi/portfile.cmake @@ -1,6 +1,6 @@ set(VCPKG_POLICY_EMPTY_PACKAGE enabled) -file(STRINGS "${CURRENT_BUILDTREES_DIR}/vcpkg-test-triplet-abi.vcpkg_abi_info.txt" actual_abi_lines) +file(STRINGS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}.vcpkg_abi_info.txt" actual_abi_lines) file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/expected-abi.txt" expected_abi_lines) file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/unexpected-abi.txt" unexpected_abi_lines) diff --git a/azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 b/azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 index d8012b9404..452cf117e4 100644 --- a/azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/triplet-abi.ps1 @@ -1,2 +1,3 @@ . $PSScriptRoot/../end-to-end-tests-prelude.ps1 -$y = Run-Vcpkg "--overlay-triplets=$PSScriptRoot/../e2e_ports/triplet-abi" "--overlay-ports=$PSScriptRoot/../e2e_ports/triplet-abi" install vcpkg-test-triplet-abi --triplet x64-abi \ No newline at end of file +Run-Vcpkg "--overlay-triplets=$PSScriptRoot/../e2e_ports/triplet-abi" "--overlay-ports=$PSScriptRoot/../e2e_ports/triplet-abi" install vcpkg-test-triplet-abi --triplet x64-abi +Throw-IfFailed From 0f6c70dcfb3852f9c9f9c878be53f6583db8ac2e Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sun, 13 Nov 2022 00:08:05 +0100 Subject: [PATCH 28/29] set VCPKG_CMAKE_SYSTEM_NAME for e2e test on platforms !windows --- azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake b/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake index a82b0f342f..2bcc1aaea4 100644 --- a/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake +++ b/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake @@ -3,6 +3,10 @@ set(VCPKG_CRT_LINKAGE dynamic) # set(VCPKG_LIBRARY_LINKAGE static) # if(0) set(VCPKG_CMAKE_SYSTEM_NAME Windows) # NOT IN ABI COMMENT +elseif(DARWIN) +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +elseif(UNIX) +set(VCPKG_CMAKE_SYSTEM_NAME Linux) endif() set(NOT_IN_ABI_UNSET "test") unset(NOT_IN_ABI_UNSET) From 5aeafa6bb24f3aedcafec3eeb1b9404e2ba920a1 Mon Sep 17 00:00:00 2001 From: Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> Date: Sun, 13 Nov 2022 10:28:06 +0100 Subject: [PATCH 29/29] fix osx triplet --- azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake b/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake index 2bcc1aaea4..110116fd61 100644 --- a/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake +++ b/azure-pipelines/e2e_ports/triplet-abi/x64-abi.cmake @@ -3,7 +3,7 @@ set(VCPKG_CRT_LINKAGE dynamic) # set(VCPKG_LIBRARY_LINKAGE static) # if(0) set(VCPKG_CMAKE_SYSTEM_NAME Windows) # NOT IN ABI COMMENT -elseif(DARWIN) +elseif(APPLE) set(VCPKG_CMAKE_SYSTEM_NAME Darwin) elseif(UNIX) set(VCPKG_CMAKE_SYSTEM_NAME Linux)