diff --git a/ports/llvm/0005-fix-tools-path.patch b/ports/llvm/0005-fix-tools-path.patch new file mode 100644 index 00000000000..bdfad617cc9 --- /dev/null +++ b/ports/llvm/0005-fix-tools-path.patch @@ -0,0 +1,14 @@ +diff --git a/llvm/tools/llvm-config/llvm-config.cpp b/llvm/tools/llvm-config/llvm-config.cpp +index 53ba24efc00..0badcafe000 100644 +--- a/llvm/tools/llvm-config/llvm-config.cpp ++++ b/llvm/tools/llvm-config/llvm-config.cpp +@@ -304,8 +304,8 @@ int main(int argc, char **argv) { + // Create an absolute path, and pop up one directory (we expect to be inside a + // bin dir). + sys::fs::make_absolute(CurrentPath); + CurrentExecPrefix = +- sys::path::parent_path(sys::path::parent_path(CurrentPath)).str(); ++ sys::path::parent_path(sys::path::parent_path(sys::path::parent_path(CurrentPath))).str(); + + // Check to see if we are inside a development tree by comparing to possible + // locations (prefix style or CMake style). diff --git a/ports/llvm/CONTROL b/ports/llvm/CONTROL index 28de43699ad..c6d65270144 100644 --- a/ports/llvm/CONTROL +++ b/ports/llvm/CONTROL @@ -1,6 +1,6 @@ Source: llvm Version: 10.0.0 -Port-Version: 6 +Port-Version: 7 Homepage: https://llvm.org/ Description: The LLVM Compiler Infrastructure Supports: !uwp diff --git a/ports/llvm/portfile.cmake b/ports/llvm/portfile.cmake index 56209147a84..6928676a876 100644 --- a/ports/llvm/portfile.cmake +++ b/ports/llvm/portfile.cmake @@ -13,6 +13,7 @@ vcpkg_from_github( 0002-fix-install-paths.patch 0003-fix-vs2019-v16.6.patch 0004-fix-dr-1734.patch + 0005-fix-tools-path.patch ) vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS @@ -145,57 +146,30 @@ vcpkg_install_cmake() vcpkg_fixup_cmake_targets(CONFIG_PATH share/${PORT}) if("clang" IN_LIST FEATURES) vcpkg_fixup_cmake_targets(CONFIG_PATH share/clang TARGET_PATH share/clang) -endif() -if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") - file(GLOB_RECURSE _llvm_release_targets - "${CURRENT_PACKAGES_DIR}/share/llvm/*-release.cmake" - ) - set(_clang_release_targets) - if("clang" IN_LIST FEATURES) - file(GLOB_RECURSE _clang_release_targets - "${CURRENT_PACKAGES_DIR}/share/clang/*-release.cmake" - ) + if(VCPKG_TARGET_IS_WINDOWS) + set(LLVM_EXECUTABLE_REGEX [[^([^.]*|[^.]*\.lld)\.exe$]]) + else() + set(LLVM_EXECUTABLE_REGEX [[^([^.]*|[^.]*\.lld)$]]) endif() - foreach(_target IN LISTS _llvm_release_targets _clang_release_targets) - file(READ ${_target} _contents) - # LLVM tools should be located in the bin folder because llvm-config expects to be inside a bin dir. - # Rename `/tools/${PORT}` to `/bin` back because there is no way to avoid this in vcpkg_fixup_cmake_targets. - string(REPLACE "{_IMPORT_PREFIX}/tools/${PORT}" "{_IMPORT_PREFIX}/bin" _contents "${_contents}") - file(WRITE ${_target} "${_contents}") + + file(GLOB LLVM_TOOL_FILES "${CURRENT_PACKAGES_DIR}/bin/*") + set(LLVM_TOOLS) + foreach(tool_file IN LISTS LLVM_TOOL_FILES) + get_filename_component(tool_file "${tool_file}" NAME) + if(tool_file MATCHES "${LLVM_EXECUTABLE_REGEX}") + list(APPEND LLVM_TOOLS "${CMAKE_MATCH_1}") + endif() endforeach() + + vcpkg_copy_tools( + TOOL_NAMES ${LLVM_TOOLS} + AUTO_CLEAN) endif() if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") - file(GLOB_RECURSE _llvm_debug_targets - "${CURRENT_PACKAGES_DIR}/share/llvm/*-debug.cmake" - ) - set(_clang_debug_targets) - if("clang" IN_LIST FEATURES) - file(GLOB_RECURSE _clang_debug_targets - "${CURRENT_PACKAGES_DIR}/share/clang/*-debug.cmake" - ) - endif() - foreach(_target IN LISTS _llvm_debug_targets _clang_debug_targets) - file(READ ${_target} _contents) - # LLVM tools should be located in the bin folder because llvm-config expects to be inside a bin dir. - # Rename `/tools/${PORT}` to `/bin` back because there is no way to avoid this in vcpkg_fixup_cmake_targets. - string(REPLACE "{_IMPORT_PREFIX}/tools/${PORT}" "{_IMPORT_PREFIX}/bin" _contents "${_contents}") - # Debug shared libraries should have `d` suffix and should be installed in the `/bin` directory. - # Rename `/debug/bin/` to `/bin` - string(REPLACE "{_IMPORT_PREFIX}/debug/bin/" "{_IMPORT_PREFIX}/bin/" _contents "${_contents}") - file(WRITE ${_target} "${_contents}") - endforeach() - - # Install debug shared libraries in the `/bin` directory - file(GLOB _debug_shared_libs ${CURRENT_PACKAGES_DIR}/debug/bin/*${CMAKE_SHARED_LIBRARY_SUFFIX}) - file(INSTALL ${_debug_shared_libs} DESTINATION ${CURRENT_PACKAGES_DIR}/bin) - - file(REMOVE_RECURSE - ${CURRENT_PACKAGES_DIR}/debug/bin - ${CURRENT_PACKAGES_DIR}/debug/include - ${CURRENT_PACKAGES_DIR}/debug/share - ) + file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) + file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) endif() # Handle copyright @@ -204,5 +178,8 @@ if("clang" IN_LIST FEATURES) file(INSTALL ${SOURCE_PATH}/clang/LICENSE.TXT DESTINATION ${CURRENT_PACKAGES_DIR}/share/clang RENAME copyright) endif() -# Don't fail if the bin folder exists. -set(VCPKG_POLICY_EMPTY_PACKAGE enabled) +# LLVM still generates a few DLLs in the static build: +# * libclang.dll +# * LTO.dll +# * Remarks.dll +set(VCPKG_POLICY_DLLS_IN_STATIC_LIBRARY enabled) diff --git a/scripts/build_info.cmake b/scripts/build_info.cmake index 7470560c851..a6208016ae5 100644 --- a/scripts/build_info.cmake +++ b/scripts/build_info.cmake @@ -8,6 +8,9 @@ endif() if (DEFINED VCPKG_POLICY_DLLS_WITHOUT_EXPORTS) file(APPEND ${BUILD_INFO_FILE_PATH} "PolicyDLLsWithoutExports: ${VCPKG_POLICY_DLLS_WITHOUT_EXPORTS}\n") endif() +if (DEFINED VCPKG_POLICY_DLLS_IN_STATIC_LIBRARY) + file(APPEND ${BUILD_INFO_FILE_PATH} "PolicyDLLsInStaticLibrary: ${VCPKG_POLICY_DLLS_IN_STATIC_LIBRARY}\n") +endif() if (DEFINED VCPKG_POLICY_MISMATCHED_NUMBER_OF_BINARIES) file(APPEND ${BUILD_INFO_FILE_PATH} "PolicyMismatchedNumberOfBinaries: ${VCPKG_POLICY_MISMATCHED_NUMBER_OF_BINARIES}\n") endif() diff --git a/test.cmake b/test.cmake new file mode 100644 index 00000000000..c239695cbd7 --- /dev/null +++ b/test.cmake @@ -0,0 +1,9 @@ +set(LLVM_EXECUTABLE_REGEX [[^([^.]*|[^.]*\.lld)\.exe$]]) +foreach(el "bugpoint.exe" "ld.lld.exe" "asdf.dll" "asdf") + message(STATUS "Matching ${el}") + if(el MATCHES "${LLVM_EXECUTABLE_REGEX}") + message(STATUS "Matching ${el} - match (${CMAKE_MATCH_1}).") + else() + message(STATUS "Matching ${el} - no match.") + endif() +endforeach() diff --git a/toolsrc/VERSION.txt b/toolsrc/VERSION.txt index 4f832d87765..26725b3876e 100644 --- a/toolsrc/VERSION.txt +++ b/toolsrc/VERSION.txt @@ -1 +1 @@ -"2020.11.09" +"2020.11.12" diff --git a/toolsrc/include/vcpkg/build.h b/toolsrc/include/vcpkg/build.h index f15a2f724a5..773d3eeefc1 100644 --- a/toolsrc/include/vcpkg/build.h +++ b/toolsrc/include/vcpkg/build.h @@ -243,6 +243,7 @@ namespace vcpkg::Build EMPTY_PACKAGE, DLLS_WITHOUT_LIBS, DLLS_WITHOUT_EXPORTS, + DLLS_IN_STATIC_LIBRARY, MISMATCHED_NUMBER_OF_BINARIES, ONLY_RELEASE_CRT, EMPTY_INCLUDE_FOLDER, @@ -254,7 +255,7 @@ namespace vcpkg::Build COUNT, }; - // could be constexpr, but we want to generate this and that's not constexpr + // could be constexpr, but we want to generate this and that's not constexpr in C++14 extern const std::array ALL_POLICIES; const std::string& to_string(BuildPolicy policy); diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index bae9372775c..e75f5b7c12d 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -203,6 +203,7 @@ namespace vcpkg::Build static const std::string NAME_EMPTY_PACKAGE = "PolicyEmptyPackage"; static const std::string NAME_DLLS_WITHOUT_LIBS = "PolicyDLLsWithoutLIBs"; static const std::string NAME_DLLS_WITHOUT_EXPORTS = "PolicyDLLsWithoutExports"; + static const std::string NAME_DLLS_IN_STATIC_LIBRARY = "PolicyDLLsInStaticLibrary"; static const std::string NAME_MISMATCHED_NUMBER_OF_BINARIES = "PolicyMismatchedNumberOfBinaries"; static const std::string NAME_ONLY_RELEASE_CRT = "PolicyOnlyReleaseCRT"; static const std::string NAME_EMPTY_INCLUDE_FOLDER = "PolicyEmptyIncludeFolder"; @@ -231,6 +232,7 @@ namespace vcpkg::Build case BuildPolicy::EMPTY_PACKAGE: return NAME_EMPTY_PACKAGE; case BuildPolicy::DLLS_WITHOUT_LIBS: return NAME_DLLS_WITHOUT_LIBS; case BuildPolicy::DLLS_WITHOUT_EXPORTS: return NAME_DLLS_WITHOUT_EXPORTS; + case BuildPolicy::DLLS_IN_STATIC_LIBRARY: return NAME_DLLS_IN_STATIC_LIBRARY; case BuildPolicy::MISMATCHED_NUMBER_OF_BINARIES: return NAME_MISMATCHED_NUMBER_OF_BINARIES; case BuildPolicy::ONLY_RELEASE_CRT: return NAME_ONLY_RELEASE_CRT; case BuildPolicy::EMPTY_INCLUDE_FOLDER: return NAME_EMPTY_INCLUDE_FOLDER; @@ -249,6 +251,7 @@ namespace vcpkg::Build case BuildPolicy::EMPTY_PACKAGE: return "VCPKG_POLICY_EMPTY_PACKAGE"; case BuildPolicy::DLLS_WITHOUT_LIBS: return "VCPKG_POLICY_DLLS_WITHOUT_LIBS"; case BuildPolicy::DLLS_WITHOUT_EXPORTS: return "VCPKG_POLICY_DLLS_WITHOUT_EXPORTS"; + case BuildPolicy::DLLS_IN_STATIC_LIBRARY: return "VCPKG_POLICY_DLLS_IN_STATIC_LIBRARY"; case BuildPolicy::MISMATCHED_NUMBER_OF_BINARIES: return "VCPKG_POLICY_MISMATCHED_NUMBER_OF_BINARIES"; case BuildPolicy::ONLY_RELEASE_CRT: return "VCPKG_POLICY_ONLY_RELEASE_CRT"; case BuildPolicy::EMPTY_INCLUDE_FOLDER: return "VCPKG_POLICY_EMPTY_INCLUDE_FOLDER"; diff --git a/toolsrc/src/vcpkg/postbuildlint.cpp b/toolsrc/src/vcpkg/postbuildlint.cpp index 8490ac36492..0ea5786f6a9 100644 --- a/toolsrc/src/vcpkg/postbuildlint.cpp +++ b/toolsrc/src/vcpkg/postbuildlint.cpp @@ -561,9 +561,9 @@ namespace vcpkg::PostBuildLint return LintStatus::SUCCESS; } - static LintStatus check_no_dlls_present(const std::vector& dlls) + static LintStatus check_no_dlls_present(const Build::BuildPolicies& policies, const std::vector& dlls) { - if (dlls.empty()) + if (dlls.empty() || policies.is_enabled(BuildPolicy::DLLS_IN_STATIC_LIBRARY)) { return LintStatus::SUCCESS; } @@ -628,9 +628,12 @@ namespace vcpkg::PostBuildLint return LintStatus::SUCCESS; } - static LintStatus check_bin_folders_are_not_present_in_static_build(const Files::Filesystem& fs, + static LintStatus check_bin_folders_are_not_present_in_static_build(const Build::BuildPolicies& policies, + const Files::Filesystem& fs, const fs::path& package_dir) { + if (policies.is_enabled(BuildPolicy::DLLS_IN_STATIC_LIBRARY)) return LintStatus::SUCCESS; + const fs::path bin = package_dir / "bin"; const fs::path debug_bin = package_dir / "debug" / "bin"; @@ -922,9 +925,9 @@ namespace vcpkg::PostBuildLint { auto dlls = release_dlls; dlls.insert(dlls.end(), debug_dlls.begin(), debug_dlls.end()); - error_count += check_no_dlls_present(dlls); + error_count += check_no_dlls_present(build_info.policies, dlls); - error_count += check_bin_folders_are_not_present_in_static_build(fs, package_dir); + error_count += check_bin_folders_are_not_present_in_static_build(build_info.policies, fs, package_dir); if (!toolset.dumpbin.empty() && !build_info.policies.is_enabled(BuildPolicy::SKIP_DUMPBIN_CHECKS)) {