aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/post_build_lint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolsrc/src/post_build_lint.cpp')
-rw-r--r--toolsrc/src/post_build_lint.cpp151
1 files changed, 48 insertions, 103 deletions
diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp
index d358cca45..3043bd4fa 100644
--- a/toolsrc/src/post_build_lint.cpp
+++ b/toolsrc/src/post_build_lint.cpp
@@ -1,16 +1,13 @@
-#include <filesystem>
#include "vcpkg_paths.h"
#include "package_spec.h"
-#include <iterator>
+#include "vcpkg_Files.h"
#include <functional>
#include "vcpkg_System.h"
#include "coff_file_reader.h"
#include "BuildInfo.h"
#include <regex>
-namespace fs = std::tr2::sys;
-
-namespace vcpkg
+namespace vcpkg { namespace PostBuildLint
{
enum class lint_status
{
@@ -20,54 +17,6 @@ namespace vcpkg
static const fs::path DUMPBIN_EXE = R"(%VS140COMNTOOLS%\..\..\VC\bin\dumpbin.exe)";
- namespace
- {
- void print_vector_of_files(const std::vector<fs::path>& paths)
- {
- System::println("");
- for (const fs::path& p : paths)
- {
- System::println(" %s", p.generic_string());
- }
- System::println("");
- }
-
- template <class Pred>
- void non_recursive_find_matching_paths_in_dir(const fs::path& dir, const Pred predicate, std::vector<fs::path>* output)
- {
- std::copy_if(fs::directory_iterator(dir), fs::directory_iterator(), std::back_inserter(*output), predicate);
- }
-
- template <class Pred>
- void recursive_find_matching_paths_in_dir(const fs::path& dir, const Pred predicate, std::vector<fs::path>* output)
- {
- std::copy_if(fs::recursive_directory_iterator(dir), fs::recursive_directory_iterator(), std::back_inserter(*output), predicate);
- }
-
- template <class Pred>
- std::vector<fs::path> recursive_find_matching_paths_in_dir(const fs::path& dir, const Pred predicate)
- {
- std::vector<fs::path> v;
- recursive_find_matching_paths_in_dir(dir, predicate, &v);
- return v;
- }
-
- void recursive_find_files_with_extension_in_dir(const fs::path& dir, const std::string& extension, std::vector<fs::path>* output)
- {
- recursive_find_matching_paths_in_dir(dir, [&extension](const fs::path& current)
- {
- return !fs::is_directory(current) && current.extension() == extension;
- }, output);
- }
-
- std::vector<fs::path> recursive_find_files_with_extension_in_dir(const fs::path& dir, const std::string& extension)
- {
- std::vector<fs::path> v;
- recursive_find_files_with_extension_in_dir(dir, extension, &v);
- return v;
- }
- }
-
static lint_status check_for_files_in_include_directory(const fs::path& package_dir)
{
const fs::path include_dir = package_dir / "include";
@@ -85,10 +34,10 @@ namespace vcpkg
const fs::path debug_include_dir = package_dir / "debug" / "include";
std::vector<fs::path> files_found;
- recursive_find_matching_paths_in_dir(debug_include_dir, [&](const fs::path& current)
- {
- return !fs::is_directory(current) && current.extension() != ".ifc";
- }, &files_found);
+ Files::recursive_find_matching_paths_in_dir(debug_include_dir, [&](const fs::path& current)
+ {
+ return !fs::is_directory(current) && current.extension() != ".ifc";
+ }, &files_found);
if (!files_found.empty())
{
@@ -129,15 +78,15 @@ namespace vcpkg
static lint_status check_for_misplaced_cmake_files(const fs::path& package_dir, const package_spec& spec)
{
std::vector<fs::path> misplaced_cmake_files;
- recursive_find_files_with_extension_in_dir(package_dir / "cmake", ".cmake", &misplaced_cmake_files);
- recursive_find_files_with_extension_in_dir(package_dir / "debug" / "cmake", ".cmake", &misplaced_cmake_files);
- recursive_find_files_with_extension_in_dir(package_dir / "lib" / "cmake", ".cmake", &misplaced_cmake_files);
- recursive_find_files_with_extension_in_dir(package_dir / "debug" / "lib" / "cmake", ".cmake", &misplaced_cmake_files);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "cmake", ".cmake", &misplaced_cmake_files);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "debug" / "cmake", ".cmake", &misplaced_cmake_files);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "lib" / "cmake", ".cmake", &misplaced_cmake_files);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "debug" / "lib" / "cmake", ".cmake", &misplaced_cmake_files);
if (!misplaced_cmake_files.empty())
{
System::println(System::color::warning, "The following cmake files were found outside /share/%s. Please place cmake files in /share/%s.", spec.name(), spec.name());
- print_vector_of_files(misplaced_cmake_files);
+ Files::print_paths(misplaced_cmake_files);
return lint_status::ERROR_DETECTED;
}
@@ -159,13 +108,13 @@ namespace vcpkg
static lint_status check_for_dlls_in_lib_dirs(const fs::path& package_dir)
{
std::vector<fs::path> dlls;
- recursive_find_files_with_extension_in_dir(package_dir / "lib", ".dll", &dlls);
- recursive_find_files_with_extension_in_dir(package_dir / "debug" / "lib", ".dll", &dlls);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "lib", ".dll", &dlls);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "debug" / "lib", ".dll", &dlls);
if (!dlls.empty())
{
System::println(System::color::warning, "\nThe following dlls were found in /lib and /debug/lib. Please move them to /bin or /debug/bin, respectively.");
- print_vector_of_files(dlls);
+ Files::print_paths(dlls);
return lint_status::ERROR_DETECTED;
}
@@ -213,7 +162,7 @@ namespace vcpkg
if (potential_copyright_files.size() > 1)
{
System::println(System::color::warning, "The following files are potential copyright files:");
- print_vector_of_files(potential_copyright_files);
+ Files::print_paths(potential_copyright_files);
}
System::println(" %s/share/%s/copyright", packages_dir.generic_string(), spec.name());
@@ -223,13 +172,13 @@ namespace vcpkg
static lint_status check_for_exes(const fs::path& package_dir)
{
std::vector<fs::path> exes;
- recursive_find_files_with_extension_in_dir(package_dir / "bin", ".exe", &exes);
- recursive_find_files_with_extension_in_dir(package_dir / "debug" / "bin", ".exe", &exes);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "bin", ".exe", &exes);
+ Files::recursive_find_files_with_extension_in_dir(package_dir / "debug" / "bin", ".exe", &exes);
if (!exes.empty())
{
System::println(System::color::warning, "The following EXEs were found in /bin and /debug/bin. EXEs are not valid distribution targets.");
- print_vector_of_files(exes);
+ Files::print_paths(exes);
return lint_status::ERROR_DETECTED;
}
@@ -254,7 +203,7 @@ namespace vcpkg
if (!dlls_with_no_exports.empty())
{
System::println(System::color::warning, "The following DLLs have no exports:");
- print_vector_of_files(dlls_with_no_exports);
+ Files::print_paths(dlls_with_no_exports);
System::println(System::color::warning, "DLLs without any exports are likely a bug in the build script.");
return lint_status::ERROR_DETECTED;
}
@@ -285,7 +234,7 @@ namespace vcpkg
if (!dlls_with_improper_uwp_bit.empty())
{
System::println(System::color::warning, "The following DLLs do not have the App Container bit set:");
- print_vector_of_files(dlls_with_improper_uwp_bit);
+ Files::print_paths(dlls_with_improper_uwp_bit);
System::println(System::color::warning, "This bit is required for Windows Store apps.");
return lint_status::ERROR_DETECTED;
}
@@ -387,7 +336,7 @@ namespace vcpkg
}
System::println(System::color::warning, "DLLs should not be present in a static build, but the following DLLs were found:");
- print_vector_of_files(dlls);
+ Files::print_paths(dlls);
return lint_status::ERROR_DETECTED;
}
@@ -402,10 +351,10 @@ namespace vcpkg
System::println(System::color::warning, "Mismatching number of debug and release binaries. Found %d for debug but %d for release.", debug_count, release_count);
System::println("Debug binaries");
- print_vector_of_files(debug_binaries);
+ Files::print_paths(debug_binaries);
System::println("Release binaries");
- print_vector_of_files(release_binaries);
+ Files::print_paths(release_binaries);
if (debug_count == 0)
{
@@ -434,16 +383,16 @@ namespace vcpkg
static lint_status check_no_subdirectories(const fs::path& dir)
{
- const std::vector<fs::path> subdirectories = recursive_find_matching_paths_in_dir(dir, [&](const fs::path& current)
- {
- return fs::is_directory(current);
- });
+ const std::vector<fs::path> subdirectories = Files::recursive_find_matching_paths_in_dir(dir, [&](const fs::path& current)
+ {
+ return fs::is_directory(current);
+ });
if (!subdirectories.empty())
{
System::println(System::color::warning, "Directory %s should have no subdirectories", dir.generic_string());
System::println("The following subdirectories were found: ");
- print_vector_of_files(subdirectories);
+ Files::print_paths(subdirectories);
return lint_status::ERROR_DETECTED;
}
@@ -483,16 +432,16 @@ namespace vcpkg
static lint_status check_no_empty_folders(const fs::path& dir)
{
- const std::vector<fs::path> empty_directories = recursive_find_matching_paths_in_dir(dir, [](const fs::path& current)
- {
- return fs::is_directory(current) && fs::is_empty(current);
- });
+ const std::vector<fs::path> empty_directories = Files::recursive_find_matching_paths_in_dir(dir, [](const fs::path& current)
+ {
+ return fs::is_directory(current) && fs::is_empty(current);
+ });
if (!empty_directories.empty())
{
System::println(System::color::warning, "There should be no empty directories in %s", dir.generic_string());
System::println("The following empty directories were found: ");
- print_vector_of_files(empty_directories);
+ Files::print_paths(empty_directories);
System::println(System::color::warning, "If a directory should be populated but is not, this might indicate an error in the portfile.\n"
"If the directories are not needed and their creation cannot be disabled, use something like this in the portfile to remove them)\n"
"\n"
@@ -599,22 +548,19 @@ namespace vcpkg
{
std::vector<fs::path> misplaced_files;
- non_recursive_find_matching_paths_in_dir(package_dir, [](const fs::path& current)
- {
- const std::string filename = current.filename().generic_string();
- return !fs::is_directory(current) && !((_stricmp(filename.c_str(), "CONTROL") == 0 || _stricmp(filename.c_str(), "BUILD_INFO") == 0));
- }, &misplaced_files);
+ Files::non_recursive_find_matching_paths_in_dir(package_dir, [](const fs::path& current)
+ {
+ const std::string filename = current.filename().generic_string();
+ return !fs::is_directory(current) && !((_stricmp(filename.c_str(), "CONTROL") == 0 || _stricmp(filename.c_str(), "BUILD_INFO") == 0));
+ }, &misplaced_files);
const fs::path debug_dir = package_dir / "debug";
- non_recursive_find_matching_paths_in_dir(debug_dir, [](const fs::path& current)
- {
- return !fs::is_directory(current);
- }, &misplaced_files);
+ Files::non_recursive_find_all_files_in_dir(debug_dir, &misplaced_files);
if (!misplaced_files.empty())
{
System::println(System::color::warning, "The following files are placed in\n%s and\n%s: ", package_dir.generic_string(), debug_dir.generic_string());
- print_vector_of_files(misplaced_files);
+ Files::print_paths(misplaced_files);
System::println(System::color::warning, "Files cannot be present in those directories.\n");
return lint_status::ERROR_DETECTED;
}
@@ -645,14 +591,13 @@ namespace vcpkg
error_count += check_for_copyright_file(spec, paths);
error_count += check_for_exes(package_dir);
-
const fs::path debug_lib_dir = package_dir / "debug" / "lib";
const fs::path release_lib_dir = package_dir / "lib";
const fs::path debug_bin_dir = package_dir / "debug" / "bin";
const fs::path release_bin_dir = package_dir / "bin";
- const std::vector<fs::path> debug_libs = recursive_find_files_with_extension_in_dir(debug_lib_dir, ".lib");
- const std::vector<fs::path> release_libs = recursive_find_files_with_extension_in_dir(release_lib_dir, ".lib");
+ const std::vector<fs::path> debug_libs = Files::recursive_find_files_with_extension_in_dir(debug_lib_dir, ".lib");
+ const std::vector<fs::path> release_libs = Files::recursive_find_files_with_extension_in_dir(release_lib_dir, ".lib");
error_count += check_matching_debug_and_release_binaries(debug_libs, release_libs);
@@ -666,8 +611,8 @@ namespace vcpkg
{
case LinkageType::DYNAMIC:
{
- const std::vector<fs::path> debug_dlls = recursive_find_files_with_extension_in_dir(debug_bin_dir, ".dll");
- const std::vector<fs::path> release_dlls = recursive_find_files_with_extension_in_dir(release_bin_dir, ".dll");
+ const std::vector<fs::path> debug_dlls = Files::recursive_find_files_with_extension_in_dir(debug_bin_dir, ".dll");
+ const std::vector<fs::path> release_dlls = Files::recursive_find_files_with_extension_in_dir(release_bin_dir, ".dll");
error_count += check_matching_debug_and_release_binaries(debug_dlls, release_dlls);
@@ -688,7 +633,7 @@ namespace vcpkg
case LinkageType::STATIC:
{
std::vector<fs::path> dlls;
- recursive_find_files_with_extension_in_dir(package_dir, ".dll", &dlls);
+ Files::recursive_find_files_with_extension_in_dir(package_dir, ".dll", &dlls);
error_count += check_no_dlls_present(dlls);
error_count += check_bin_folders_are_not_present_in_static_build(package_dir);
@@ -707,8 +652,8 @@ namespace vcpkg
Checks::unreachable();
}
#if 0
- error_count += check_no_subdirectories(package_dir / "lib");
- error_count += check_no_subdirectories(package_dir / "debug" / "lib");
+ error_count += check_no_subdirectories(package_dir / "lib");
+ error_count += check_no_subdirectories(package_dir / "debug" / "lib");
#endif
error_count += check_no_empty_folders(package_dir);
@@ -723,4 +668,4 @@ namespace vcpkg
System::println("-- Performing post-build validation done");
}
-}
+}}