Repository: nfrechette/acl (cpp)

Issue:
Upgrade minimum cmake version to compile with cmake 4
Hi, I'm currently trying to integrate acl into [o3de](https://github.com/o3de/o3de). Currently I use cmake 4.0.3 and I was stuck with the following error:
```
CMake Error at build/windows/_deps/acl-src/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 3.5 has been removed from CMake.

  Update the VERSION argument <min> value.  Or, use the <min>...<max> syntax
  to tell CMake that the project requires at least <min> but has been updated
  to work with policies introduced by <max> or earlier.

  Or, add -DCMAKE_POLICY_VERSION_MINIMUM=3.5 to try configuring anyway.
```

Is the build script reliant on old cmake behavior or is it safe to simply bump the cmake version?


Discussion:
Hello and thanks for reaching out!

ACL is a header only library and so you shouldn't need to run it with CMake in order to use it as an end user.
CMake is exclusively used by the tools and test harness for internal development. CMake does not produce binaries or artifacts that you would need to use for non-development purposes.

I ran into this error as well as it broke CI when they updated the image. I attempted a fix in a branch not yet merged into `develop` but ran into other issues. Simply bumping the min version means that older toolchains that are limited to using older CMake versions break (e.g. not so old Android NDK, sadly). I haven't decided yet if I will drop support for older toolchains. As recently as ~3 years ago, users in China were still using ACL with GCC 4.9... The nature of game development means that some teams that maintain live games opt to stop updating their toolchains. This was more prevalent before C++14 when using compiler extensions was much more common.

The build scripts don't rely on any particular CMake features from the past decade, they should work with any version AFAIK although I've seen warnings with newer versions which can be ignored.

For the time being, I would recommend you avoid running CMake with ACL for non-development purposes. Is that an option for you? In my experience, changes to ACL are rarely necessary for integration and unless you plan to develop new features in ACL, it shouldn't be necessary to use CMake with it.

My plan to tackle this is to attempt to use the <max> version specifier in hope that it can suppress this error. If it fails, I may have no choice but to remove older toolchains or find some other way to work around it.

Note that you will likely run into the same issue with the 2 dependencies ACL relies on: Realtime Math is required and uses the same CMake scripts (more or less) and sjson-cpp while optional uses the same patterns as well.

Cheers,
Nicholas
Using the 'max' version argument seems to resolve this issue. I'll be merging a fix shortly, within the next few days (at most).

Patch:
diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml
--- a/.github/workflows/build_pull_request.yml
+++ b/.github/workflows/build_pull_request.yml
@@ -9,243 +9,6 @@ on:
       - '**/*.md'
 
 jobs:
-  linux-xenial:
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        compiler: [clang4]
-    steps:
-      - name: Git checkout
-        uses: actions/checkout@v4
-        with:
-          submodules: 'recursive'
-      - name: Building (debug-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x86 -build'
-      - name: Running unit tests (debug-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x86 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (debug-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x64 -build'
-      - name: Running unit tests (debug-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x64 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x86 -build'
-      - name: Running unit tests (release-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x86 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -build'
-      - name: Running unit tests (release-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64 nosimd)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -nosimd -build'
-      - name: Running unit tests (release-x64 nosimd)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -nosimd -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64 AVX)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -avx -build'
-      - name: Running unit tests (release-x64 AVX)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-xenial:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -avx -unit_test'
-
-  linux-bionic:
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        compiler: [gcc5, gcc6, gcc7, gcc8, clang5, clang6, clang7, clang8, clang9, clang10]
-    steps:
-      - name: Git checkout
-        uses: actions/checkout@v4
-        with:
-          submodules: 'recursive'
-      - name: Building (debug-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x86 -build'
-      - name: Running unit tests (debug-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x86 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (debug-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x64 -build'
-      - name: Running unit tests (debug-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x64 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x86 -build'
-      - name: Running unit tests (release-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x86 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -build'
-      - name: Running unit tests (release-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64 nosimd)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -nosimd -build'
-      - name: Running unit tests (release-x64 nosimd)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -nosimd -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64 AVX)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -avx -build'
-      - name: Running unit tests (release-x64 AVX)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-bionic:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -avx -unit_test'
-
-  linux-focal:
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        compiler: [gcc9, gcc10, gcc11, clang11, clang12, clang13, clang14]
-    steps:
-      - name: Git checkout
-        uses: actions/checkout@v4
-        with:
-          submodules: 'recursive'
-      - name: Building (debug-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x86 -build'
-      - name: Running unit tests (debug-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x86 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (debug-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x64 -build'
-      - name: Running unit tests (debug-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Debug -cpu x64 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x86 -build'
-      - name: Running unit tests (release-x86)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x86 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -build'
-      - name: Running unit tests (release-x64)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64 nosimd)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -nosimd -build'
-      - name: Running unit tests (release-x64 nosimd)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -nosimd -unit_test'
-      - name: Clean
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -clean_only'
-      - name: Building (release-x64 AVX)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -avx -build'
-      - name: Running unit tests (release-x64 AVX)
-        uses: docker://ghcr.io/nfrechette/toolchain-amd64-focal:v1
-        with:
-          args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -avx -unit_test'
-  
   linux-lunar:
     runs-on: ubuntu-latest
     strategy:
@@ -325,47 +88,6 @@ jobs:
         with:
           args: 'python3 make.py -ci -compiler ${{ matrix.compiler }} -config Release -cpu x64 -avx -unit_test'
 
-  osx-13:
-    runs-on: macos-13
-    strategy:
-      matrix:
-        compiler: [xcode14]
-    steps:
-      - name: Git checkout
-        uses: actions/checkout@v4
-        with:
-          submodules: 'recursive'
-      - name: Setup ${{ matrix.compiler }} compiler
-        run: ./tools/setup_osx_compiler.sh ${{ matrix.compiler }}
-      - name: Building (debug-x64)
-        run: python3 make.py -ci -compiler osx -config Debug -cpu x64 -build
-      - name: Running unit tests (debug-x64)
-        run: python3 make.py -ci -compiler osx -config Debug -cpu x64 -unit_test
-      - name: Clean
-        run: python3 make.py -ci -clean_only
-      - name: Building (release-x64)
-        run: python3 make.py -ci -compiler osx -config Release -cpu x64 -build
-      - name: Running unit tests (release-x64)
-        run: python3 make.py -ci -compiler osx -config Release -cpu x64 -unit_test
-      - name: Clean
-        run: python3 make.py -ci -clean_only
-      - name: Building (release-x64 nosimd)
-        run: python3 make.py -ci -compiler osx -config Release -cpu x64 -nosimd -build
-      - name: Running unit tests (release-x64 nosimd)
-        run: python3 make.py -ci -compiler osx -config Release -cpu x64 -nosimd -unit_test
-      - name: Clean
-        run: python3 make.py -ci -clean_only
-      - name: Building for iOS (debug-arm64)
-        run: python3 make.py -ci -compiler ios -config Debug -build
-      - name: Clean
-        run: python3 make.py -ci -clean_only
-      - name: Building for iOS (release-arm64)
-        run: python3 make.py -ci -compiler ios -config Release -build
-      - name: Clean
-        run: python3 make.py -ci -clean_only
-      - name: Building for iOS (release-arm64 nosimd)
-        run: python3 make.py -ci -compiler ios -config Release -build -nosimd
-        
   osx-14:
     runs-on: macos-14
     strategy:
@@ -434,31 +156,6 @@ jobs:
         with:
           args: 'python3 make.py -ci -compiler emscripten -config release -unit_test'
 
-  vs2019:
-    runs-on: windows-2019
-    strategy:
-      matrix:
-        compiler: [vs2019, vs2019-clang]
-        build_config: [debug, release]
-        cpu: [x86, x64, arm64]
-        simd: [-simd, -nosimd, -avx]
-        exclude:
-          # Don't run arm64 with clang
-          - compiler: vs2019-clang
-            cpu: arm64
-          # Don't run AVX with arm64
-          - cpu: arm64
-            simd: -avx
-    steps:
-      - name: Git checkout
-        uses: actions/checkout@v4
-        with:
-          submodules: 'recursive'
-      - name: Building (${{ matrix.build_config }}-${{ matrix.cpu }})
-        run: python3 make.py -ci -compiler ${{ matrix.compiler }} -config ${{ matrix.build_config }} -cpu ${{ matrix.cpu }} -build ${{ matrix.simd }}
-      - name: Running unit tests (${{ matrix.build_config }}-${{ matrix.cpu }})
-        run: python3 make.py -ci -compiler ${{ matrix.compiler }} -config ${{ matrix.build_config }} -cpu ${{ matrix.cpu }} -unit_test ${{ matrix.simd }}
-
   vs2022:
     runs-on: windows-2022
     strategy:
diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.20)
+cmake_minimum_required(VERSION 3.2...3.25)
 project(acl CXX)
 
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,5 @@
 [![CLA assistant](https://cla-assistant.io/readme/badge/nfrechette/acl)](https://cla-assistant.io/nfrechette/acl)
 [![All Contributors](https://img.shields.io/github/all-contributors/nfrechette/acl)](#contributors-)
-[![Build status](https://ci.appveyor.com/api/projects/status/8h1jwmhumqh9ie3h/branch/develop?svg=true)](https://ci.appveyor.com/project/nfrechette/acl)
 [![Build status](https://github.com/nfrechette/acl/actions/workflows/build_push.yml/badge.svg)](https://github.com/nfrechette/acl/actions)
 [![Sonar Status](https://sonarcloud.io/api/project_badges/measure?project=nfrechette_acl&metric=alert_status)](https://sonarcloud.io/dashboard?id=nfrechette_acl)
 [![GitHub release](https://img.shields.io/github/release/nfrechette/acl.svg)](https://github.com/nfrechette/acl/releases)
@@ -44,20 +43,17 @@ Much thought was put into designing the library for it to be as flexible and pow
 
 ## Supported platforms
 
-*  Windows VS2015 x86 and x64
-*  Windows (VS2017 to VS2022) x86, x64, and ARM64
-*  Windows (VS2017 to VS2022) with clang x86 and x64
-*  Linux (gcc 5 to 13) x86 and x64
-*  Linux (clang 4 to 15) x86 and x64
-*  OS X (12.5, 13.2, 14.2) x64 and ARM64
-*  Android (NDK 21) ARMv7-A and ARM64
-*  iOS (Xcode 10.3, 11.7, 12.5, 13.2, 14.2) ARM64
-*  Emscripten (1.39.11) WASM
-*  MSYS2 x64
+Continuous integration tests a variety of platforms and configurations but it generally runs as-is anywhere where C++11 (or later) is supported. CI currently tests:
 
-The above supported platform list is only what is tested every release but if it compiles, it should run just fine.
+*  Windows VS2022: x86, x64, ARM64
+*  Linux GCC 12+: x86, x64
+*  Linux Clang 15+: x86, x64
+*  OS X XCode 15+: ARM64
+*  Emscripten 1.39.11: WASM
 
-The [Unreal Engine](https://www.unrealengine.com/en-US/blog) is supported through a plugin found [here](https://github.com/nfrechette/acl-ue4-plugin).
+Each releases is also manually tested on iOS and Android.
+
+The [Unreal Engine](https://www.unrealengine.com/en-US/blog) is supported through a plugin originally found [here](https://github.com/nfrechette/acl-ue4-plugin) although it is now distributed with a more recent version as part of each engine release since UE 5.13.
 
 ## Getting started
 
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
--- a/appveyor.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-version: 2.1.99.{build}
-
-environment:
-  PYTHON: "C:\\Python36-x64\\python.exe"
-  matrix:
-    - toolchain: msvc
-    - toolchain: clang
-
-image:
-  - Visual Studio 2015
-  - Visual Studio 2017
-
-configuration:
-  - Release
-
-platform:
-  - x86
-  - x64
-  - arm64
-
-matrix:
-  exclude:
-    - image: Visual Studio 2015
-      platform: arm64
-    - image: Visual Studio 2015
-      toolchain: clang
-    - image: Visual Studio 2017
-      toolchain: clang
-
-init:
-# Only run latest compiler on push, run everything on pull request
-- ps: if (!$env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_WORKER_IMAGE -ne "Visual Studio 2019") {Exit-AppveyorBuild}
-
-install:
-- cmd: >-
-    git submodule update --init --recursive
-
-build_script:
-- cmd: >-
-    .\tools\appveyor_ci.bat "%APPVEYOR_BUILD_WORKER_IMAGE%" %platform% %configuration% %toolchain% "%PYTHON%"
diff --git a/includes/acl/core/impl/compiler_utils.h b/includes/acl/core/impl/compiler_utils.h
--- a/includes/acl/core/impl/compiler_utils.h
+++ b/includes/acl/core/impl/compiler_utils.h
@@ -130,10 +130,12 @@ namespace acl
 }
 
 //////////////////////////////////////////////////////////////////////////
-// Wraps the __has_attribute pre-processor macro to handle non-clang and early
-// GCC compilers
+// Wraps the __has_attribute and __has_cpp_attribute pre-processor macros
+// to allow for C++ language feature detection
 //////////////////////////////////////////////////////////////////////////
-#if defined(__has_attribute)
+#if defined(__has_cpp_attribute)
+	#define ACL_HAS_ATTRIBUTE(x) __has_cpp_attribute(x)
+#elif defined(__has_attribute)
 	#define ACL_HAS_ATTRIBUTE(x) __has_attribute(x)
 #else
 	#define ACL_HAS_ATTRIBUTE(x) 0
@@ -141,9 +143,11 @@ namespace acl
 
 //////////////////////////////////////////////////////////////////////////
 // Silence compiler warnings within switch cases that fall through
-// Note: C++17 has [[fallthrough]];
 //////////////////////////////////////////////////////////////////////////
-#if ACL_HAS_ATTRIBUTE(fallthrough)
+#if RTM_CPP_VERSION >= RTM_CPP_VERSION_17
+	#define ACL_SWITCH_CASE_FALLTHROUGH_INTENTIONAL [[fallthrough]]
+#elif ACL_HAS_ATTRIBUTE(fallthrough) && (defined(RTM_COMPILER_GCC) || defined(RTM_COMPILER_CLANG))
+	// For pre-C++17 support in GCC/Clang
 	#define ACL_SWITCH_CASE_FALLTHROUGH_INTENTIONAL __attribute__ ((fallthrough))
 #else
 	#define ACL_SWITCH_CASE_FALLTHROUGH_INTENTIONAL (void)0
@@ -161,7 +165,11 @@ namespace acl
 //////////////////////////////////////////////////////////////////////////
 // Allows us to specify branch hints
 //////////////////////////////////////////////////////////////////////////
-#if defined(RTM_COMPILER_CLANG) || RTM_CPP_VERSION >= RTM_CPP_VERSION_20
+#if RTM_CPP_VERSION >= RTM_CPP_VERSION_20
+	#define ACL_BRANCH_LIKELY [[likely]]
+	#define ACL_BRANCH_UNLIKELY [[unlikely]]
+#elif defined(RTM_COMPILER_CLANG) && ACL_HAS_ATTRIBUTE(likely) && ACL_HAS_ATTRIBUTE(unlikely)
+	// Clang supported the same syntax as C++20 much earlier
 	#define ACL_BRANCH_LIKELY [[likely]]
 	#define ACL_BRANCH_UNLIKELY [[unlikely]]
 #else
diff --git a/tools/acl_compressor/main_android/app/src/main/cpp/CMakeLists.txt b/tools/acl_compressor/main_android/app/src/main/cpp/CMakeLists.txt
--- a/tools/acl_compressor/main_android/app/src/main/cpp/CMakeLists.txt
+++ b/tools/acl_compressor/main_android/app/src/main/cpp/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.6)
+cmake_minimum_required(VERSION 3.2...3.25)
 project(acl_compressor CXX)
 
 # Project root is <acl-dir>\tools\compressor\main_android
diff --git a/tools/acl_decompressor/main_android/app/src/main/cpp/CMakeLists.txt b/tools/acl_decompressor/main_android/app/src/main/cpp/CMakeLists.txt
--- a/tools/acl_decompressor/main_android/app/src/main/cpp/CMakeLists.txt
+++ b/tools/acl_decompressor/main_android/app/src/main/cpp/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.6)
+cmake_minimum_required(VERSION 3.2...3.25)
 project(acl_decompressor CXX)
 
 # Project root is <acl-dir>\tools\decompressor\main_android
diff --git a/tools/regression_tester_android/app/src/main/cpp/CMakeLists.txt b/tools/regression_tester_android/app/src/main/cpp/CMakeLists.txt
--- a/tools/regression_tester_android/app/src/main/cpp/CMakeLists.txt
+++ b/tools/regression_tester_android/app/src/main/cpp/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.6)
+cmake_minimum_required(VERSION 3.2...3.25)
 project(acl_regression_tester_android CXX)
 
 # Project root is <acl-dir>\tools\regression_tester_android


Test patch:
diff --git a/tests/main_android/app/src/main/cpp/CMakeLists.txt b/tests/main_android/app/src/main/cpp/CMakeLists.txt
--- a/tests/main_android/app/src/main/cpp/CMakeLists.txt
+++ b/tests/main_android/app/src/main/cpp/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.6)
+cmake_minimum_required(VERSION 3.2...3.25)
 project(acl_unit_tests CXX)
 
 # Project root is <acl-dir>\tests\main_android