From dc197701ee0cb4a1f79410df7ed4c188745e4fb7 Mon Sep 17 00:00:00 2001 From: Arkadiy Shapkin Date: Wed, 24 Aug 2016 18:06:03 +0300 Subject: [PATCH] AppVeyor MinGW-w64 gcc-5.3.0 test build, fix build with MinGW-w64 --- appveyor.yml | 89 +++++++++++-------- googletest/CMakeLists.txt | 9 ++ .../include/gtest/internal/gtest-port.h | 2 +- googletest/test/gtest-port_test.cc | 2 +- 4 files changed, 62 insertions(+), 40 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d613fd6027..fd05434cef 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,71 +1,84 @@ version: '{build}' -os: Visual Studio 2015 - environment: matrix: - - Toolset: v140 - - Toolset: v120 - - Toolset: v110 - - Toolset: v100 + - compiler: msvc-10-seh + generator: "Visual Studio 10 2010" + + - compiler: msvc-11-seh + generator: "Visual Studio 11 2012" + + - compiler: msvc-11-seh + generator: "Visual Studio 11 2012 Win64" + + - compiler: msvc-12-seh + generator: "Visual Studio 12 2013" + + - compiler: msvc-12-seh + generator: "Visual Studio 12 2013 Win64" -platform: - - Win32 - - x64 + - compiler: msvc-14-seh + generator: "Visual Studio 14 2015" + + - compiler: msvc-14-seh + generator: "Visual Studio 14 2015 Win64" + + - compiler: gcc-5.3.0-posix + generator: "MinGW Makefiles" configuration: -# - Release - Debug + - Release build: verbosity: minimal -artifacts: - - path: '_build/Testing/Temporary/*' - name: test_results - -before_build: +install: - ps: | - Write-Output "Configuration: $env:CONFIGURATION" - Write-Output "Platform: $env:PLATFORM" - $generator = switch ($env:TOOLSET) - { - "v140" {"Visual Studio 14 2015"} - "v120" {"Visual Studio 12 2013"} - "v110" {"Visual Studio 11 2012"} - "v100" {"Visual Studio 10 2010"} - } - if ($env:PLATFORM -eq "x64") - { - $generator = "$generator Win64" + Write-Output "Compiler: $env:compiler" + Write-Output "Generator: $env:generator" + + # git bash conflicts with MinGW makefiles + if ($env:generator -eq "MinGW Makefiles") { + $env:path = $env:path.replace("C:\Program Files\Git\usr\bin;", "") + if ($env:compiler -eq "gcc-5.3.0-posix") { + $cxx_path = "C:\mingw-w64\i686-5.3.0-posix-dwarf-rt_v4-rev0\mingw32\bin" + } + if ($cxx_path -ne "") { + $env:path += ";$cxx_path" + } } build_script: - ps: | - if (($env:TOOLSET -eq "v100") -and ($env:PLATFORM -eq "x64")) - { - return - } md _build -Force | Out-Null cd _build - & cmake -G "$generator" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -Dgtest_build_tests=ON -Dgtest_build_samples=ON -Dgmock_build_tests=ON .. + $conf = if ($env:generator -eq "MinGW Makefiles") {"-DCMAKE_BUILD_TYPE=$env:configuration"} else {"-DCMAKE_CONFIGURATION_TYPES=Debug;Release"} + # Disable test for MinGW (gtest tests fail, gmock tests can not build) + $gtest_build_tests = if ($env:generator -eq "MinGW Makefiles") {"-Dgtest_build_tests=OFF"} else {"-Dgtest_build_tests=ON"} + $gmock_build_tests = if ($env:generator -eq "MinGW Makefiles") {"-Dgmock_build_tests=OFF"} else {"-Dgmock_build_tests=ON"} + & cmake -G "$env:generator" $conf -Dgtest_build_samples=ON $gtest_build_tests $gmock_build_tests .. if ($LastExitCode -ne 0) { throw "Exec: $ErrorMessage" } - & cmake --build . --config $env:CONFIGURATION + & cmake --build . --config $env:configuration if ($LastExitCode -ne 0) { throw "Exec: $ErrorMessage" } test_script: - ps: | - if (($env:Toolset -eq "v100") -and ($env:PLATFORM -eq "x64")) - { - return + if ($env:generator -eq "MinGW Makefiles") { + return # No test available for MinGW } - - & ctest -C $env:CONFIGURATION --output-on-failure + & ctest -C $env:configuration --timeout 300 --output-on-failure if ($LastExitCode -ne 0) { throw "Exec: $ErrorMessage" } + +artifacts: + - path: '_build/CMakeFiles/*.log' + name: logs + - path: '_build/Testing/**/*.xml' + name: test_results diff --git a/googletest/CMakeLists.txt b/googletest/CMakeLists.txt index 621d0f0421..9e2f5cb409 100644 --- a/googletest/CMakeLists.txt +++ b/googletest/CMakeLists.txt @@ -27,6 +27,8 @@ option( "Build gtest with internal symbols hidden in shared libraries." OFF) +option(gtest_workaround_old_mingw64 "Enable workaround error with old MinGW w64." OFF) + # Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build(). include(cmake/hermetic_build.cmake OPTIONAL) @@ -79,6 +81,13 @@ if (MSVC AND MSVC_VERSION EQUAL 1700) add_definitions(/D _VARIADIC_MAX=10) endif() +# Enable this option if you have this error with MINGW64: +# "error: cannot convert 'CRITICAL_SECTION* {aka _CRITICAL_SECTION*}' to +# '_RTL_CRITICAL_SECTION*' in initialization critical_section_(new CRITICAL_SECTION)" +if (gtest_workaround_old_mingw64) + add_definitions(/D GTEST_WORKAROUND_OLD_MINGW64) +endif() + ######################################################################## # # Defines the gtest & gtest_main libraries. User tests should link diff --git a/googletest/include/gtest/internal/gtest-port.h b/googletest/include/gtest/internal/gtest-port.h index 92f4c11c4f..b0358b3e51 100644 --- a/googletest/include/gtest/internal/gtest-port.h +++ b/googletest/include/gtest/internal/gtest-port.h @@ -396,7 +396,7 @@ # include # endif // In order to avoid having to include , use forward declaration -#if GTEST_OS_WINDOWS_MINGW +#if GTEST_OS_WINDOWS_MINGW && defined(GTEST_WORKAROUND_OLD_MINGW64) // MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two // separate (equivalent) structs, instead of using typedef typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION; diff --git a/googletest/test/gtest-port_test.cc b/googletest/test/gtest-port_test.cc index 05f8821e9a..070ec62df8 100644 --- a/googletest/test/gtest-port_test.cc +++ b/googletest/test/gtest-port_test.cc @@ -1295,7 +1295,7 @@ TEST(WindowsTypesTest, HANDLEIsVoidStar) { StaticAssertTypeEq(); } -#if GTEST_OS_WINDOWS_MINGW +#if GTEST_OS_WINDOWS_MINGW && defined(GTEST_WORKAROUND_OLD_MINGW64) TEST(WindowsTypesTest, _CRITICAL_SECTIONIs_CRITICAL_SECTION) { StaticAssertTypeEq(); }