diff --git a/.gitignore b/.gitignore index 5b28596b8..297819bf4 100644 --- a/.gitignore +++ b/.gitignore @@ -294,8 +294,12 @@ __pycache__/ #ignore custom triplets /triplets/* #add vcpkg-designed triplets back in +!triplets/community/arm64-mingw.cmake !triplets/community/arm64-uwp.cmake +!triplets/community/arm-mingw.cmake !triplets/community/arm-windows.cmake +!triplets/community/x64-mingw.cmake +!triplets/community/x86-mingw.cmake !triplets/community/x86-uwp.cmake !triplets/community/x86-windows-static.cmake !triplets/arm-uwp.cmake diff --git a/scripts/cmake/vcpkg_common_definitions.cmake b/scripts/cmake/vcpkg_common_definitions.cmake index 14cf460af..3a1818bf5 100644 --- a/scripts/cmake/vcpkg_common_definitions.cmake +++ b/scripts/cmake/vcpkg_common_definitions.cmake @@ -37,9 +37,12 @@ elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Android") set(VCPKG_TARGET_IS_ANDROID 1) elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(VCPKG_TARGET_IS_FREEBSD 1) +elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "MinGW") + set(VCPKG_TARGET_IS_WINDOWS 1) + set(VCPKG_TARGET_IS_MINGW 1) endif() -#Helper variable to identify the host path separator. +#Helper variable to identify the host path separator. if(CMAKE_HOST_WIN32) set(VCPKG_HOST_PATH_SEPARATOR ";") elseif(CMAKE_HOST_UNIX) @@ -71,11 +74,15 @@ if(VCPKG_TARGET_IS_WINDOWS) set(VCPKG_TARGET_IMPORT_LIBRARY_PREFIX "") set(VCPKG_FIND_LIBRARY_SUFFIXES ".lib" ".dll") #This is a slight modification to CMakes value which does not include ".dll". set(VCPKG_FIND_LIBRARY_PREFIXES "" "lib") #This is a slight modification to CMakes value which does not include "lib". - ## For CYGWIN and Windows GNU, maybe VCPKG will support that in the future? - #set(VCPKG_TARGET_IMPORT_LIBRARY_SUFFIX ".dll.a") - #set(VCPKG_TARGET_IMPORT_LIBRARY_PREFIX "lib") - #set(VCPKG_FIND_LIBRARY_SUFFIXES ".dll" ".dll.a" ".a" ".lib") - #set(VCPKG_FIND_LIBRARY_PREFIXES "lib" "") +elseif(VCPKG_TARGET_IS_MINGW) + set(VCPKG_TARGET_STATIC_LIBRARY_SUFFIX ".a") + set(VCPKG_TARGET_IMPORT_LIBRARY_SUFFIX ".dll.a") + set(VCPKG_TARGET_SHARED_LIBRARY_SUFFIX ".dll") + set(VCPKG_TARGET_STATIC_LIBRARY_PREFIX "lib") + set(VCPKG_TARGET_SHARED_LIBRARY_PREFIX "lib") + set(VCPKG_TARGET_IMPORT_LIBRARY_PREFIX "lib") + set(VCPKG_FIND_LIBRARY_SUFFIXES ".dll" ".dll.a" ".a" ".lib") + set(VCPKG_FIND_LIBRARY_PREFIXES "lib" "") elseif(VCPKG_TARGET_IS_OSX) set(VCPKG_TARGET_STATIC_LIBRARY_SUFFIX ".a") set(VCPKG_TARGET_IMPORT_LIBRARY_SUFFIX "") diff --git a/scripts/cmake/vcpkg_configure_cmake.cmake b/scripts/cmake/vcpkg_configure_cmake.cmake index c31955fb2..260f2471e 100644 --- a/scripts/cmake/vcpkg_configure_cmake.cmake +++ b/scripts/cmake/vcpkg_configure_cmake.cmake @@ -59,7 +59,7 @@ ## * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake) ## * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake) function(vcpkg_configure_cmake) - cmake_parse_arguments(_csc + cmake_parse_arguments(_csc "PREFER_NINJA;DISABLE_PARALLEL_CONFIGURE;NO_CHARSET_FLAG" "SOURCE_PATH;GENERATOR" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" @@ -177,13 +177,13 @@ function(vcpkg_configure_cmake) "Invalid setting for VCPKG_LIBRARY_LINKAGE: \"${VCPKG_LIBRARY_LINKAGE}\". " "It must be \"static\" or \"dynamic\"") endif() - + macro(check_both_vars_are_set var1 var2) if((NOT DEFINED ${var1} OR NOT DEFINED ${var2}) AND (DEFINED ${var1} OR DEFINED ${var2})) message(FATAL_ERROR "Both ${var1} and ${var2} must be set.") endif() endmacro() - + check_both_vars_are_set(VCPKG_CXX_FLAGS_DEBUG VCPKG_C_FLAGS_DEBUG) check_both_vars_are_set(VCPKG_CXX_FLAGS_RELEASE VCPKG_C_FLAGS_RELEASE) check_both_vars_are_set(VCPKG_CXX_FLAGS VCPKG_C_FLAGS) @@ -204,6 +204,8 @@ function(vcpkg_configure_cmake) set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/osx.cmake") elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/freebsd.cmake") + elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "MinGW") + set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/mingw.cmake") endif() endif() diff --git a/scripts/templates/portfile.in.cmake b/scripts/templates/portfile.in.cmake index 62c53a6db..7ddf662e8 100644 --- a/scripts/templates/portfile.in.cmake +++ b/scripts/templates/portfile.in.cmake @@ -22,11 +22,12 @@ # VCPKG_TARGET_IS_OSX # VCPKG_TARGET_IS_FREEBSD # VCPKG_TARGET_IS_ANDROID +# VCPKG_TARGET_IS_MINGW # VCPKG_TARGET_EXECUTABLE_SUFFIX # VCPKG_TARGET_STATIC_LIBRARY_SUFFIX # VCPKG_TARGET_SHARED_LIBRARY_SUFFIX # -# See additional helpful variables in /docs/maintainers/vcpkg_common_definitions.md +# See additional helpful variables in /docs/maintainers/vcpkg_common_definitions.md # # Specifies if the port install should fail immediately given a condition # vcpkg_fail_port_install(MESSAGE "@PORT@ currently only supports Linux and Mac platforms" ON_TARGET "Windows") @@ -39,10 +40,10 @@ vcpkg_download_distfile(ARCHIVE vcpkg_extract_source_archive_ex( OUT_SOURCE_PATH SOURCE_PATH - ARCHIVE ${ARCHIVE} + ARCHIVE ${ARCHIVE} # (Optional) A friendly name to use instead of the filename of the archive (e.g.: a version number or tag). # REF 1.0.0 - # (Optional) Read the docs for how to generate patches at: + # (Optional) Read the docs for how to generate patches at: # https://github.com/Microsoft/vcpkg/blob/master/docs/examples/patching.md # PATCHES # 001_port_fixes.patch diff --git a/scripts/toolchains/mingw.cmake b/scripts/toolchains/mingw.cmake new file mode 100644 index 000000000..def98799f --- /dev/null +++ b/scripts/toolchains/mingw.cmake @@ -0,0 +1,40 @@ +if(NOT _VCPKG_MINGW_TOOLCHAIN) +set(_VCPKG_MINGW_TOOLCHAIN 1) +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(CMAKE_CROSSCOMPILING OFF CACHE BOOL "") +endif() + +# Need to override MinGW from VCPKG_CMAKE_SYSTEM_NAME +set(CMAKE_SYSTEM_NAME Windows CACHE STRING "" FORCE) + +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") + set(CMAKE_SYSTEM_PROCESSOR i686 CACHE STRING "") +elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(CMAKE_SYSTEM_PROCESSOR x86_64 CACHE STRING "") +elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm") + set(CMAKE_SYSTEM_PROCESSOR armv7 CACHE STRING "") +elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64") + set(CMAKE_SYSTEM_PROCESSOR aarch64 CACHE STRING "") +endif() + +foreach(lang C CXX) + set(CMAKE_${lang}_COMPILER_TARGET "${CMAKE_SYSTEM_PROCESSOR}-windows-gnu" CACHE STRING "") +endforeach() + +get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE ) +if(NOT _CMAKE_IN_TRY_COMPILE) + string(APPEND CMAKE_C_FLAGS_INIT " ${VCPKG_C_FLAGS} ") + string(APPEND CMAKE_CXX_FLAGS_INIT " ${VCPKG_CXX_FLAGS} ") + string(APPEND CMAKE_C_FLAGS_DEBUG_INIT " ${VCPKG_C_FLAGS_DEBUG} ") + string(APPEND CMAKE_CXX_FLAGS_DEBUG_INIT " ${VCPKG_CXX_FLAGS_DEBUG} ") + string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " ${VCPKG_C_FLAGS_RELEASE} ") + string(APPEND CMAKE_CXX_FLAGS_RELEASE_INIT " ${VCPKG_CXX_FLAGS_RELEASE} ") + + string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " ${VCPKG_LINKER_FLAGS} ") + string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " ${VCPKG_LINKER_FLAGS} ") + if(VCPKG_CRT_LINKAGE STREQUAL "static") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT "-static ") + string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT "-static ") + endif() +endif() +endif() diff --git a/toolsrc/CMakeLists.txt b/toolsrc/CMakeLists.txt index af6981155..9dcf95d14 100644 --- a/toolsrc/CMakeLists.txt +++ b/toolsrc/CMakeLists.txt @@ -65,7 +65,14 @@ if(CLANG AND NOT MSVC) endif() if(GCC OR (CLANG AND USES_LIBSTDCXX)) - link_libraries(stdc++fs) + include(CheckCXXSourceCompiles) + set(CMAKE_REQUIRED_LIBRARIES stdc++fs) + check_cxx_source_compiles("#include + int main() { return 0; }" LINKS_TO_STDCXX_FS) + unset(CMAKE_REQUIRED_LIBRARIES) + if (LINKS_TO_STDCXX_FS) + link_libraries(stdc++fs) + endif() elseif(CLANG AND NOT MSVC AND NOT NO_LIBCXXFS) link_libraries(c++fs) endif() @@ -94,7 +101,7 @@ elseif(GCC OR CLANG) add_compile_options(-std=c++1z) if(VCPKG_DEVELOPMENT_WARNINGS) - add_compile_options(-Wall -Wextra -Wpedantic -Wno-unknown-pragmas -Wno-missing-field-initializers -Werror) + add_compile_options(-Wall -Wextra -Wpedantic -Wno-unknown-pragmas -Wno-missing-field-initializers -Wno-redundant-move -Werror) # GCC and clang have different names for the same warning if (GCC) @@ -143,3 +150,22 @@ if(MSVC) target_sources(vcpkg PRIVATE src/pch.cpp) target_compile_options(vcpkg PRIVATE /Yupch.h /FIpch.h /Zm200) endif() + +if (MINGW) + include(CheckCXXSourceCompiles) + check_cxx_source_compiles("#include + int main() { return 0; }" USES_EXPERIMENTAL_FS) + + if (NOT USES_EXPERIMENTAL_FS) + add_compile_definitions(USE_STD_FILESYSTEM) + endif() + + add_compile_definitions( + UNICODE + _WIN32_WINNT=0x0601 + WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY=4 + __fastfail=exit) + foreach(tgt vcpkg vcpkg-test) + target_link_libraries(${tgt} PRIVATE winhttp bcrypt version ole32 uuid) + endforeach() +endif() diff --git a/toolsrc/include/pch.h b/toolsrc/include/pch.h index ce2a7c9c5..a6a442f0a 100644 --- a/toolsrc/include/pch.h +++ b/toolsrc/include/pch.h @@ -31,7 +31,11 @@ #include #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include +#if USE_STD_FILESYSTEM +#include +#else #include +#endif #include #include #include diff --git a/toolsrc/include/vcpkg/base/files.h b/toolsrc/include/vcpkg/base/files.h index e9d3d33bf..bb4a10d49 100644 --- a/toolsrc/include/vcpkg/base/files.h +++ b/toolsrc/include/vcpkg/base/files.h @@ -2,12 +2,20 @@ #include +#if USE_STD_FILESYSTEM +#include +#else #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include +#endif namespace fs { +#if USE_STD_FILESYSTEM + namespace stdfs = std::filesystem; +#else namespace stdfs = std::experimental::filesystem; +#endif using stdfs::copy_options; using stdfs::path; diff --git a/toolsrc/src/vcpkg.cpp b/toolsrc/src/vcpkg.cpp index 2dd13f43d..1f212dd94 100644 --- a/toolsrc/src/vcpkg.cpp +++ b/toolsrc/src/vcpkg.cpp @@ -263,7 +263,18 @@ static void load_config() #if defined(_WIN32) // note: this prevents a false positive for -Wmissing-prototypes on clang-cl -int wmain(int, const wchar_t* const*); +int wmain(int, const wchar_t* const* const); + +#if !defined(_MSC_VER) +#include +int main(int argc, const char* const* const /*argv*/) +{ + wchar_t **wargv; + wargv = CommandLineToArgvW(GetCommandLineW(), &argc); + return wmain(argc, wargv); +} +#endif + int wmain(const int argc, const wchar_t* const* const argv) #else int main(const int argc, const char* const* const argv) diff --git a/toolsrc/src/vcpkg/base/hash.cpp b/toolsrc/src/vcpkg/base/hash.cpp index 11df3e329..81635b875 100644 --- a/toolsrc/src/vcpkg/base/hash.cpp +++ b/toolsrc/src/vcpkg/base/hash.cpp @@ -123,9 +123,9 @@ namespace vcpkg::Hash void top_bits(T) = delete; static constexpr uchar top_bits(uchar x) noexcept { return x; } - static constexpr uchar top_bits(std::uint32_t x) noexcept { return (x >> 24) & 0xFF; } - static constexpr uchar top_bits(std::uint64_t x) noexcept { return (x >> 56) & 0xFF; } - static constexpr uchar top_bits(UInt128 x) noexcept { return top_bits(x.top); } + [[maybe_unused]] static constexpr uchar top_bits(std::uint32_t x) noexcept { return (x >> 24) & 0xFF; } + [[maybe_unused]] static constexpr uchar top_bits(std::uint64_t x) noexcept { return (x >> 56) & 0xFF; } + [[maybe_unused]] static constexpr uchar top_bits(UInt128 x) noexcept { return top_bits(x.top); } // treats UIntTy as big endian for the purpose of this mapping template @@ -145,7 +145,7 @@ namespace vcpkg::Hash for (uchar& ch : buff) { ch = top_bits(tmp); - tmp <<= 8; + tmp = UIntTy(tmp << 8); } for (const auto byte : buff) diff --git a/toolsrc/src/vcpkg/base/system.cpp b/toolsrc/src/vcpkg/base/system.cpp index c84b7f8be..5a446a330 100644 --- a/toolsrc/src/vcpkg/base/system.cpp +++ b/toolsrc/src/vcpkg/base/system.cpp @@ -378,7 +378,7 @@ namespace vcpkg g_ctrl_c_state.transition_to_spawn_process(); auto clean_env = compute_clean_environment(extra_env, prepend_to_path); - windows_create_process(cmd_line, clean_env.data(), process_info, NULL); + windows_create_process(cmd_line, clean_env.data(), process_info, 0); CloseHandle(process_info.hThread); @@ -542,7 +542,7 @@ namespace vcpkg { HKEY k = nullptr; const LSTATUS ec = - RegOpenKeyExW(reinterpret_cast(base_hkey), Strings::to_utf16(sub_key).c_str(), NULL, KEY_READ, &k); + RegOpenKeyExW(reinterpret_cast(base_hkey), Strings::to_utf16(sub_key).c_str(), 0, KEY_READ, &k); if (ec != ERROR_SUCCESS) return nullopt; auto w_valuename = Strings::to_utf16(valuename); diff --git a/triplets/community/arm-mingw.cmake b/triplets/community/arm-mingw.cmake new file mode 100644 index 000000000..ca99fac83 --- /dev/null +++ b/triplets/community/arm-mingw.cmake @@ -0,0 +1,6 @@ +set(VCPKG_TARGET_ARCHITECTURE arm) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) +set(VCPKG_ENV_PASSTHROUGH PATH) + +set(VCPKG_CMAKE_SYSTEM_NAME MinGW) diff --git a/triplets/community/arm64-mingw.cmake b/triplets/community/arm64-mingw.cmake new file mode 100644 index 000000000..c4d88830f --- /dev/null +++ b/triplets/community/arm64-mingw.cmake @@ -0,0 +1,6 @@ +set(VCPKG_TARGET_ARCHITECTURE arm64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) +set(VCPKG_ENV_PASSTHROUGH PATH) + +set(VCPKG_CMAKE_SYSTEM_NAME MinGW) diff --git a/triplets/community/x64-mingw.cmake b/triplets/community/x64-mingw.cmake new file mode 100644 index 000000000..28600f0cc --- /dev/null +++ b/triplets/community/x64-mingw.cmake @@ -0,0 +1,6 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) +set(VCPKG_ENV_PASSTHROUGH PATH) + +set(VCPKG_CMAKE_SYSTEM_NAME MinGW) diff --git a/triplets/community/x86-mingw.cmake b/triplets/community/x86-mingw.cmake new file mode 100644 index 000000000..3769b85f0 --- /dev/null +++ b/triplets/community/x86-mingw.cmake @@ -0,0 +1,6 @@ +set(VCPKG_TARGET_ARCHITECTURE x86) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) +set(VCPKG_ENV_PASSTHROUGH PATH) + +set(VCPKG_CMAKE_SYSTEM_NAME MinGW)