diff options
| author | Alexander Karatarakis <alkarata@microsoft.com> | 2016-11-09 18:44:11 -0800 |
|---|---|---|
| committer | Alexander Karatarakis <alkarata@microsoft.com> | 2016-11-09 18:44:11 -0800 |
| commit | bf7978dcf962c8ff37b3319121e60eb1629be684 (patch) | |
| tree | 4c0305ed26f1dfc8cf7065957e0086497611f18d /toolsrc/src/post_build_lint.cpp | |
| parent | 968fb2768d7ba8ab7c5c5f352cd63d18dcc3bde3 (diff) | |
| download | vcpkg-bf7978dcf962c8ff37b3319121e60eb1629be684.tar.gz vcpkg-bf7978dcf962c8ff37b3319121e60eb1629be684.zip | |
[post-build-checks] Rework crt linkage checks
Diffstat (limited to 'toolsrc/src/post_build_lint.cpp')
| -rw-r--r-- | toolsrc/src/post_build_lint.cpp | 94 |
1 files changed, 19 insertions, 75 deletions
diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index 1f1351ffd..c7bdf7d21 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -489,32 +489,18 @@ namespace vcpkg return lint_status::SUCCESS; } - struct BuildType_and_files + struct BuildType_and_file { - explicit BuildType_and_files(const BuildType& build_type) : build_type(build_type) - { - } - + fs::path file; BuildType build_type; - std::vector<fs::path> files; }; static lint_status check_crt_linkage_of_libs(const BuildType& expected_build_type, const std::vector<fs::path>& libs) { - static const std::regex DEBUG_STATIC_CRT(R"(/DEFAULTLIB:LIBCMTD)"); - static const std::regex DEBUG_DYNAMIC_CRT(R"(/DEFAULTLIB:MSVCRTD)"); - - static const std::regex RELEASE_STATIC_CRT(R"(/DEFAULTLIB:LIBCMT[^D])"); - static const std::regex RELEASE_DYNAMIC_CRT(R"(/DEFAULTLIB:MSVCRT[^D])"); + std::vector<BuildType> bad_build_types = BuildType::values(); + bad_build_types.erase(std::remove(bad_build_types.begin(), bad_build_types.end(), expected_build_type), bad_build_types.end()); - lint_status output_status = lint_status::SUCCESS; - - std::vector<fs::path> libs_with_multiple_crts; - - BuildType_and_files libs_with_debug_static_crt(BuildType::DEBUG_STATIC); - BuildType_and_files libs_with_debug_dynamic_crt(BuildType::DEBUG_DYNAMIC); - BuildType_and_files libs_with_release_static_crt(BuildType::RELEASE_STATIC); - BuildType_and_files libs_with_release_dynamic_crt(BuildType::RELEASE_DYNAMIC); + std::vector<BuildType_and_file> libs_with_invalid_crt; for (const fs::path& lib : libs) { @@ -522,73 +508,31 @@ namespace vcpkg System::exit_code_and_output ec_data = System::cmd_execute_and_capture_output(cmd_line); Checks::check_exit(ec_data.exit_code == 0, "Running command:\n %s\n failed", Strings::utf16_to_utf8(cmd_line)); - bool found_debug_static_crt = std::regex_search(ec_data.output.cbegin(), ec_data.output.cend(), DEBUG_STATIC_CRT); - bool found_debug_dynamic_crt = std::regex_search(ec_data.output.cbegin(), ec_data.output.cend(), DEBUG_DYNAMIC_CRT); - bool found_release_static_crt = std::regex_search(ec_data.output.cbegin(), ec_data.output.cend(), RELEASE_STATIC_CRT); - bool found_release_dynamic_crt = std::regex_search(ec_data.output.cbegin(), ec_data.output.cend(), RELEASE_DYNAMIC_CRT); - - const size_t crts_found_count = found_debug_static_crt + found_debug_dynamic_crt + found_release_static_crt + found_release_dynamic_crt; - - if (crts_found_count == 0) - { - // It can be valid for no crt to be detected. For example: openssl - continue; - } - - if (crts_found_count > 1) - { - libs_with_multiple_crts.push_back(lib); - continue; - } - - // now we have exactly 1 crt - if (found_debug_static_crt) - { - libs_with_debug_static_crt.files.push_back(lib); - continue; - } - if (found_debug_dynamic_crt) + for (const BuildType& bad_build_type : bad_build_types) { - libs_with_debug_dynamic_crt.files.push_back(lib); - continue; - } - - if (found_release_static_crt) - { - libs_with_release_static_crt.files.push_back(lib); - continue; + if (std::regex_search(ec_data.output.cbegin(), ec_data.output.cend(), bad_build_type.crt_regex())) + { + libs_with_invalid_crt.push_back({lib, bad_build_type}); + break; + } } - - libs_with_release_dynamic_crt.files.push_back(lib); } - if (!libs_with_multiple_crts.empty()) + if (!libs_with_invalid_crt.empty()) { - System::println(System::color::warning, "Detected multiple crt linkages for the following libs:"); - print_vector_of_files(libs_with_multiple_crts); - output_status = lint_status::ERROR_DETECTED; - } - - std::vector<BuildType_and_files> group_for_iteration = { - libs_with_debug_static_crt, libs_with_debug_dynamic_crt, - libs_with_release_static_crt, libs_with_release_dynamic_crt}; - - for (const BuildType_and_files& bif : group_for_iteration) - { - if (!bif.files.empty() && bif.build_type != expected_build_type) + System::println(System::color::warning, "Expected %s crt linkage, but the following libs had invalid crt linkage:", expected_build_type.toString()); + System::println(""); + for (const BuildType_and_file btf : libs_with_invalid_crt) { - System::println(System::color::warning, "Expected %s crt linkage, but the following libs had %s crt linkage:", expected_build_type.toString(), bif.build_type.toString()); - print_vector_of_files(bif.files); - output_status = lint_status::ERROR_DETECTED; + System::println(" %s: %s", btf.file.generic_string(), btf.build_type.toString()); } - } + System::println(""); - if (output_status == lint_status::ERROR_DETECTED) - { System::println(System::color::warning, "To inspect the lib files, use:\n dumpbin.exe /directives mylibfile.lib"); + return lint_status::ERROR_DETECTED; } - return output_status; + return lint_status::SUCCESS; } static void operator +=(size_t& left, const lint_status& right) |
