From b206bd163b4f4ef64154589c3f16bb421b8ca51e Mon Sep 17 00:00:00 2001 From: Carson Radtke Date: Fri, 11 Oct 2024 18:05:20 -0500 Subject: [PATCH 1/4] [ci]: fix android job (#1158) Job has been failing for months and is preventing other PRs from getting merged. This PR fixes the pipeline - it changed the following: - runs on macos-latest-large (which is a non-arm image) - starts the emulator under java8 (see https://learn.microsoft.com/en-us/java/openjdk/transition-from-java-8-to-java-11) - runs emulator with -no-audio The above were requirements to get the pipeline running. Other changes include the following: - The job will auto-cancel when a newer commit is pushed to the PR. - The 'Wait for emulator ready' step now has a 2 minute timeout. This is necessary because we get no indication on whether or not the command that started the emulator suceeded. I believe there is room for improvement here, but it is outside the scope of the PR. --- .github/workflows/android.yml | 23 ++++++++++++++++------- tests/CMakeLists.txt | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 939c461..a2c88fc 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -1,4 +1,9 @@ name: CI_Android + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + on: push: branches: [ main ] @@ -7,7 +12,7 @@ on: jobs: Android: - runs-on: macos-latest + runs-on: macos-latest-large defaults: run: working-directory: build @@ -18,15 +23,19 @@ jobs: run: mkdir -p build working-directory: . - - name: Start emulator + - uses: actions/setup-java@v4 + with: + java-version: 8 + distribution: zulu + + - name: Start Emulator run: | echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install 'system-images;android-24;default;x86_64' echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n xamarin_android_emulator -k 'system-images;android-24;default;x86_64' --force $ANDROID_HOME/emulator/emulator -list-avds - echo "Starting emulator" - # Start emulator in background - nohup $ANDROID_HOME/emulator/emulator -avd xamarin_android_emulator -no-snapshot > /dev/null 2>&1 & - echo "Emulator starting" + echo "Starting emulator..." + nohup $ANDROID_HOME/emulator/emulator -no-audio -no-snapshot -avd xamarin_android_emulator &> /dev/null & + echo "Emulator starting in background" - name: Configure run: cmake -Werror=dev -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_LATEST_HOME/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=16 -DANDROID_ABI=x86_64 -DCMAKE_BUILD_TYPE=Debug .. @@ -35,11 +44,11 @@ jobs: run: cmake --build . --parallel - name: Wait for emulator ready + timeout-minutes: 2 run: | $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 10; done; input keyevent 82' $ANDROID_HOME/platform-tools/adb devices $ANDROID_HOME/platform-tools/adb shell getprop ro.product.cpu.abi - echo "Emulator started" - name: Deploy tests run: | diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 519e4a4..9de2519 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -146,6 +146,7 @@ else() -Wno-global-constructors # GTest -Wno-missing-prototypes -Wno-padded + -Wno-switch-default -Wno-unknown-attributes -Wno-used-but-marked-unused # GTest EXPECT_DEATH -Wno-weak-vtables From 3275f9ccb93a559a34baeb52f86c192a30e914b0 Mon Sep 17 00:00:00 2001 From: Werner Henze <34543625+beinhaerter@users.noreply.github.com> Date: Sat, 12 Oct 2024 02:46:21 +0200 Subject: [PATCH 2/4] Fix gcc build problem (#1149) Closes issue #1148 by fixing problems introduced in PR #1140. Co-authored-by: Werner Henze --- include/gsl/span | 12 ++++++++---- include/gsl/util | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/gsl/span b/include/gsl/span index 0de2932..d2ef9f7 100644 --- a/include/gsl/span +++ b/include/gsl/span @@ -64,10 +64,12 @@ #endif // Turn off clang unsafe buffer warnings as all accessed are guarded by runtime checks -#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#if defined(__clang__) +#if __has_warning("-Wunsafe-buffer-usage") #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunsafe-buffer-usage" -#endif // defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#endif // __has_warning("-Wunsafe-buffer-usage") +#endif // defined(__clang__) namespace gsl { @@ -852,8 +854,10 @@ as_writable_bytes(span s) noexcept #pragma GCC diagnostic pop #endif // __GNUC__ > 6 -#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#if defined(__clang__) +#if __has_warning("-Wunsafe-buffer-usage") #pragma clang diagnostic pop -#endif +#endif // __has_warning("-Wunsafe-buffer-usage") +#endif // defined(__clang__) #endif // GSL_SPAN_H diff --git a/include/gsl/util b/include/gsl/util index b853017..26b2f5f 100644 --- a/include/gsl/util +++ b/include/gsl/util @@ -41,10 +41,12 @@ #endif // _MSC_VER // Turn off clang unsafe buffer warnings as all accessed are guarded by runtime checks -#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#if defined(__clang__) +#if __has_warning("-Wunsafe-buffer-usage") #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunsafe-buffer-usage" -#endif // defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#endif // __has_warning("-Wunsafe-buffer-usage") +#endif // defined(__clang__) #if defined(__cplusplus) && (__cplusplus >= 201703L) #define GSL_NODISCARD [[nodiscard]] @@ -160,8 +162,10 @@ constexpr auto at(std::span sp, const index i) -> decltype(sp[sp.size #endif // _MSC_VER -#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#if defined(__clang__) +#if __has_warning("-Wunsafe-buffer-usage") #pragma clang diagnostic pop -#endif +#endif // __has_warning("-Wunsafe-buffer-usage") +#endif // defined(__clang__) #endif // GSL_UTIL_H From 11fe02d1ac77a4b2634b48bcbc01d7277ac4b9e8 Mon Sep 17 00:00:00 2001 From: Brian Kroth Date: Mon, 14 Oct 2024 09:43:43 -0500 Subject: [PATCH 3/4] Add a MS GSL disambiguation note (#1156) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6f1c499..c587ed7 100644 --- a/README.md +++ b/README.md @@ -216,3 +216,7 @@ target_link_libraries(foobar PRIVATE Microsoft.GSL::GSL) ## Debugging visualization support For Visual Studio users, the file [GSL.natvis](./GSL.natvis) in the root directory of the repository can be added to your project if you would like more helpful visualization of GSL types in the Visual Studio debugger than would be offered by default. + +## See Also + +For information on [Microsoft Gray Systems Lab (GSL)](https://aka.ms/gsl) of applied data management and system research see . From ce2a959e02565507717b86e7017ac964cdfb8b70 Mon Sep 17 00:00:00 2001 From: Carson Radtke Date: Mon, 14 Oct 2024 15:05:13 -0500 Subject: [PATCH 4/4] [ci]: add testing pipelines to github actions (#1159) move pipeline testing from AzDO to GitHub Actions. * update clang versions to 13-15 * update gcc versions to 10-12 * update xcode versions to 14.3.1 and 15.4 * test against C++23 (where supported) --- .github/workflows/cmake/action.yml | 56 ++++++++++++++++ .github/workflows/compilers.yml | 104 +++++++++++++++++++++++++++++ README.md | 23 +++---- azure-pipelines.yml | 66 ------------------ pipelines/jobs.yml | 43 ------------ pipelines/setup_apple.yml | 9 --- pipelines/setup_clang.yml | 13 ---- pipelines/setup_gcc.yml | 14 ---- pipelines/steps.yml | 0 9 files changed, 168 insertions(+), 160 deletions(-) create mode 100644 .github/workflows/cmake/action.yml create mode 100644 .github/workflows/compilers.yml delete mode 100644 azure-pipelines.yml delete mode 100644 pipelines/jobs.yml delete mode 100644 pipelines/setup_apple.yml delete mode 100644 pipelines/setup_clang.yml delete mode 100644 pipelines/setup_gcc.yml delete mode 100644 pipelines/steps.yml diff --git a/.github/workflows/cmake/action.yml b/.github/workflows/cmake/action.yml new file mode 100644 index 0000000..0ac09bf --- /dev/null +++ b/.github/workflows/cmake/action.yml @@ -0,0 +1,56 @@ +name: Composite CMake +inputs: + cmake_generator: + required: false + type: string + default: 'Unix Makefiles' + cmake_build_type: + required: true + type: string + default: '' + cmake_cxx_compiler: + required: false + type: string + gsl_cxx_standard: + required: true + type: number + extra_cmake_args: + required: false + type: string + default: '' + build_cmd: + required: true + type: string + default: 'make' + test_cmd: + required: false + type: string + default: 'make test' + shell: + required: false + type: string + default: 'bash' + + +runs: + using: composite + steps: + - name: Create build directory + run: mkdir build + shell: ${{ inputs.shell }} + + - name: Configure CMake + working-directory: build + run: cmake -G "${{ inputs.cmake_generator }}" -DCMAKE_BUILD_TYPE=${{ inputs.cmake_build_type }} -DCMAKE_CXX_COMPILER=${{ inputs.cmake_cxx_compiler }} -DGSL_CXX_STANDARD=${{ inputs.gsl_cxx_standard }} -DCI_TESTING:BOOL=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -Werror=dev ${{ inputs.extra_cmake_args }} .. + shell: ${{ inputs.shell }} + + - name: Build + working-directory: build + run: ${{ inputs.build_cmd }} + shell: ${{ inputs.shell }} + + - name: Test + working-directory: build + run: ${{ inputs.test_cmd }} + shell: ${{ inputs.shell }} + diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml new file mode 100644 index 0000000..23866a6 --- /dev/null +++ b/.github/workflows/compilers.yml @@ -0,0 +1,104 @@ +name: Compiler Integration Tests + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +# These jobs are correlated with the officially supported compilers +# and toolsets. If you change any versions, please update README.md. + +jobs: + gcc: + strategy: + matrix: + gcc_version: [ 10, 11, 12 ] + build_type: [ Debug, Release ] + cxx_version: [ 14, 17, 20, 23 ] + exclude: + - gcc_version: 10 + cxx_version: 23 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Run CMake (configure, build, test) + uses: ./.github/workflows/cmake + with: + cmake_build_type: ${{ matrix.build_type }} + cmake_cxx_compiler: g++-${{ matrix.gcc_version }} + gsl_cxx_standard: ${{ matrix.cxx_version }} + + clang: + strategy: + matrix: + clang_version: [ 13, 14, 15 ] + build_type: [ Debug, Release ] + cxx_version: [ 14, 17, 20, 23 ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Run CMake (configure, build, test) + uses: ./.github/workflows/cmake + with: + cmake_build_type: ${{ matrix.build_type }} + cmake_cxx_compiler: clang++-${{ matrix.clang_version }} + gsl_cxx_standard: ${{ matrix.cxx_version }} + + xcode: + strategy: + matrix: + xcode_version: [ '14.3.1', '15.4' ] + build_type: [ Debug, Release ] + cxx_version: [ 14, 17, 20, 23 ] + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + + - name: select xcode version + run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode_version }}.app + + - name: Run CMake (configure, build, test) + uses: ./.github/workflows/cmake + with: + cmake_build_type: ${{ matrix.build_type }} + cmake_cxx_compiler: clang++ + gsl_cxx_standard: ${{ matrix.cxx_version }} + + VisualStudio: + strategy: + matrix: + generator: [ 'Visual Studio 16 2019', 'Visual Studio 17 2022' ] + image: [ windows-2019, windows-2022 ] + build_type: [ Debug, Release ] + extra_args: [ '', '-T ClangCL' ] + cxx_version: [ 14, 17, 20, 23 ] + exclude: + - generator: 'Visual Studio 17 2022' + image: windows-2019 + - generator: 'Visual Studio 16 2019' + image: windows-2022 + - generator: 'Visual Studio 16 2019' + cxx_version: 23 + runs-on: ${{ matrix.image }} + steps: + - uses: actions/checkout@v4 + - uses: microsoft/setup-msbuild@v2 + + - name: Run CMake (configure, build, test) + uses: ./.github/workflows/cmake + with: + cmake_generator: ${{ matrix.generator }} + cmake_build_type: ${{ matrix.build_type }} + gsl_cxx_standard: ${{ matrix.cxx_version }} + extra_cmake_args: ${{ matrix.extra_args }} + build_cmd: msbuild GSL.sln + test_cmd: ctest . --output-on-failure --no-compress-output + shell: pwsh + diff --git a/README.md b/README.md index c587ed7..0e266b4 100644 --- a/README.md +++ b/README.md @@ -86,24 +86,17 @@ This is based on [CppCoreGuidelines semi-specification](https://github.com/isocp # Quick Start ## Supported Compilers / Toolsets -The GSL officially supports the latest and previous major versions of VS with MSVC & LLVM, GCC, Clang, and XCode with Apple-Clang. -Within these two major versions, we try to target the latest minor updates / revisions (although this may be affected by -delays between a toolchain's release and when it becomes widely available for use). -Below is a table showing the versions currently being tested. +The GSL officially supports recent major versions of Visual Studio with both MSVC and LLVM, GCC, Clang, and XCode with Apple-Clang. +For each of these major versions, the GSL officially supports C++14, C++17, C++20, and C++23 (when supported by the compiler). +Below is a table showing the versions currently being tested (also see [.github/workflows/compilers.yml](the workflow).) Compiler |Toolset Versions Currently Tested :------- |--: - XCode | 13.2.1 & 12.5.1 - GCC | 11[^1] & 10[^2] - Clang | 12[^2] & 11[^2] - Visual Studio with MSVC | VS2022[^3] & VS2019[^4] - Visual Studio with LLVM | VS2022[^3] & VS2019[^4] - - -[^1]: Precise version may be found in the [latest CI results](https://dev.azure.com/cppstat/GSL/_build?definitionId=1&branchFilter=26). -[^2]: Precise version may be found in the [latest CI results](https://dev.azure.com/cppstat/GSL/_build?definitionId=1&branchFilter=26). Should be the version specified [here](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md#language-and-runtime). -[^3]: Precise version may be found in the [latest CI results](https://dev.azure.com/cppstat/GSL/_build?definitionId=1&branchFilter=26). Should be the version specified [here](https://github.com/actions/virtual-environments/blob/main/images/win/Windows2022-Readme.md#visual-studio-enterprise-2022). -[^4]: Precise version may be found in the [latest CI results](https://dev.azure.com/cppstat/GSL/_build?definitionId=1&branchFilter=26). Should be the version specified [here](https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md#visual-studio-enterprise-2019). + GCC | 10, 11, 12 + XCode | 14.3.1, 15.4 + Clang | 13, 14, 15 + Visual Studio with MSVC | VS2019, VS2022 + Visual Studio with LLVM | VS2019, VS2022 --- If you successfully port GSL to another platform, we would love to hear from you! diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index ba16ee9..0000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,66 +0,0 @@ -trigger: - - main - -pr: - autoCancel: true - -stages: -- stage: GCC - dependsOn: [] - jobs: - - template: ./pipelines/jobs.yml - parameters: - compiler: gcc - image: ubuntu-20.04 - compilerVersions: [ 11, 10 ] - setupfile: 'setup_gcc.yml' - -- stage: Clang - dependsOn: [] - jobs: - - template: ./pipelines/jobs.yml - parameters: - compiler: clang - image: ubuntu-20.04 - compilerVersions: [ 12, 11 ] - setupfile: 'setup_clang.yml' - -- stage: Xcode - dependsOn: [] - jobs: - - template: ./pipelines/jobs.yml - parameters: - compiler: 'Xcode' - image: macOS-11 - compilerVersions: [ '12.5.1', '13.2.1' ] - setupfile: 'setup_apple.yml' - -- stage: VS_MSVC - dependsOn: [] - jobs: - - template: ./pipelines/jobs.yml - parameters: - compiler: 'VS2019 (MSVC)' - compilerVersions: [ 'default' ] - image: windows-2019 - - template: ./pipelines/jobs.yml - parameters: - compiler: 'VS2022 (MSVC)' - compilerVersions: [ 'default' ] - image: windows-2022 - -- stage: VS_LLVM - dependsOn: [] - jobs: - - template: ./pipelines/jobs.yml - parameters: - compiler: 'VS2019 (LLVM)' - compilerVersions: [ 'default' ] - image: windows-2019 - extraCmakeArgs: '-T ClangCL' - - template: ./pipelines/jobs.yml - parameters: - compiler: 'VS2022 (LLVM)' - compilerVersions: [ 'default' ] - image: windows-2022 - extraCmakeArgs: '-T ClangCL' diff --git a/pipelines/jobs.yml b/pipelines/jobs.yml deleted file mode 100644 index aabd3db..0000000 --- a/pipelines/jobs.yml +++ /dev/null @@ -1,43 +0,0 @@ -parameters: - CXXVersions: [ 14, 17, 20 ] - buildTypes: [ 'Debug', 'Release' ] - image: '' - - compiler: '' - compilerVersions: ["default"] # if default value, simply uses whatever version is on the machine. - # the text of this default value doesn't actually matter. - setupfile: '' - extraCmakeArgs: '' - -jobs: -- ${{ each compilerVersion in parameters.compilerVersions }}: - - ${{ each CXXVersion in parameters.CXXVersions }}: - - ${{ each buildType in parameters.buildTypes }}: - - job: - displayName: ${{ format('{0} {1} C++{2} {3}', parameters.compiler, compilerVersion, CXXVersion, buildType) }} - pool: - vmImage: ${{ parameters.image }} - continueOnError: false - - steps: - - ${{ if not(eq(parameters.setupfile, '')) }}: - - template: ${{ parameters.setupfile }} - parameters: - version: ${{ compilerVersion }} - - - task: CMake@1 - name: Configure - inputs: - workingDirectory: build - cmakeArgs: '-DGSL_CXX_STANDARD=${{ CXXVersion }} -DCMAKE_BUILD_TYPE=${{ buildType }} -DCI_TESTING:BOOL=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -Werror=dev ${{ parameters.extraCmakeArgs }} .. ' - - - task: CMake@1 - name: Build - inputs: - workingDirectory: build - cmakeArgs: '--build . ' - - - script: ctest . --output-on-failure --no-compress-output - name: CTest - workingDirectory: build - failOnStderr: true diff --git a/pipelines/setup_apple.yml b/pipelines/setup_apple.yml deleted file mode 100644 index 6a256a5..0000000 --- a/pipelines/setup_apple.yml +++ /dev/null @@ -1,9 +0,0 @@ -parameters: - version: 0 - -steps: - - script: | - if [ "${{ parameters.version }}" != "default" ]; then sudo xcode-select -switch /Applications/Xcode_${{ parameters.version }}.app; fi - - displayName: "Setup Xcode Version" - failOnStderr: true diff --git a/pipelines/setup_clang.yml b/pipelines/setup_clang.yml deleted file mode 100644 index 58403b4..0000000 --- a/pipelines/setup_clang.yml +++ /dev/null @@ -1,13 +0,0 @@ -parameters: - version: 0 - -steps: - - script: | - echo "##vso[task.setvariable variable=CXX;]${CXX}" - echo "##vso[task.setvariable variable=CC;]${CC}" - - displayName: "Setup Clang Version" - failOnStderr: true - env: - CC: clang-${{ parameters.version }} - CXX: clang++-${{ parameters.version }} diff --git a/pipelines/setup_gcc.yml b/pipelines/setup_gcc.yml deleted file mode 100644 index 6480f67..0000000 --- a/pipelines/setup_gcc.yml +++ /dev/null @@ -1,14 +0,0 @@ -parameters: - version: 0 - -steps: - - script: | - echo "##vso[task.setvariable variable=CXX;]${CXX}" - echo "##vso[task.setvariable variable=CC;]${CC}" - if [ "${{ parameters.version }}" = "11" ]; then sudo apt-get install $CXX; fi - - displayName: "Setup GCC Version" - failOnStderr: true - env: - CC: gcc-${{ parameters.version }} - CXX: g++-${{ parameters.version }} diff --git a/pipelines/steps.yml b/pipelines/steps.yml deleted file mode 100644 index e69de29..0000000