From e60280e79d89cebe2c0863ec9c4602f7375caec4 Mon Sep 17 00:00:00 2001 From: haroonq <29288912+haroonq@users.noreply.github.com> Date: Wed, 22 Oct 2025 00:34:04 +0100 Subject: [PATCH] Add a FILAMENT_ENABLE_EXPERIMENTAL_GCC_SUPPORT cmake flag. (#9339) Adds support for compiling filament libraries with GCC. Since GCC is not officially supported, we prefer to disable warnings (incl. not treating warnings as errors) rather than updating the code in order to compile cleanly. This flag is disabled by default. --- CMakeLists.txt | 33 +++++++++++++++++++-------------- filament/CMakeLists.txt | 12 ++++++++++++ filament/backend/CMakeLists.txt | 7 +++++++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 91ea1fbf75..054a97dd92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,8 @@ option(FILAMENT_ENABLE_FGVIEWER "Enable the frame graph viewer" OFF) option(FILAMENT_USE_ABSEIL_LOGGING "Use Abseil to log, may increase binary size" OFF) +option(FILAMENT_ENABLE_EXPERIMENTAL_GCC_SUPPORT "Enable GCC support (unsupported)" OFF) + # This is to disable GTAO for the short-term while we investigate a way to better manage size increases. # On the regular filament build (where size is of less concern), we enable GTAO by default. option(FILAMENT_DISABLE_GTAO "Disable GTAO" OFF) @@ -295,15 +297,10 @@ set(TOOLS ${CMAKE_CURRENT_SOURCE_DIR}/tools) # ================================================================================================== set(MIN_CLANG_VERSION "6.0") -if (CMAKE_C_COMPILER_ID MATCHES "Clang") - if (CMAKE_C_COMPILER_VERSION VERSION_LESS MIN_CLANG_VERSION) - message(FATAL_ERROR "Detected C compiler Clang ${CMAKE_C_COMPILER_VERSION} < ${MIN_CLANG_VERSION}") - endif() -elseif (NOT MSVC) - message(FATAL_ERROR "Detected C compiler ${CMAKE_C_COMPILER_ID} is unsupported") -endif() - -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +set(FILAMENT_USING_GCC OFF) +if (CMAKE_C_COMPILER_ID MATCHES "GNU" AND FILAMENT_ENABLE_EXPERIMENTAL_GCC_SUPPORT) + set(FILAMENT_USING_GCC ON) +elseif (CMAKE_C_COMPILER_ID MATCHES "Clang") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS MIN_CLANG_VERSION) message(FATAL_ERROR "Detected CXX compiler Clang ${CMAKE_CXX_COMPILER_VERSION} < ${MIN_CLANG_VERSION}") endif() @@ -344,7 +341,11 @@ if (MSVC) set(CXX_STANDARD "/std:c++latest") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_STANDARD} /W0 /Zc:__cplusplus") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_STANDARD} -fstrict-aliasing -Wno-unknown-pragmas -Wno-unused-function -Wno-deprecated-declarations") + if(FILAMENT_USING_GCC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_STANDARD} -Wno-changes-meaning -Wno-return-type -Wno-attributes -Wno-unknown-pragmas -Wno-class-memaccess -Wno-multichar -Wno-deprecated-declarations -Wno-subobject-linkage -Wno-invalid-constexpr") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_STANDARD} -fstrict-aliasing -Wno-unknown-pragmas -Wno-unused-function -Wno-deprecated-declarations") + endif() if (APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nullability-extension") endif() @@ -365,10 +366,14 @@ endif() if (LINUX) option(USE_STATIC_LIBCXX "Link against the static runtime libraries." ON) if (${USE_STATIC_LIBCXX}) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") - link_libraries("-static-libgcc -static-libstdc++") - link_libraries(libc++.a) - link_libraries(libc++abi.a) + if (FILAMENT_USING_GCC) + link_libraries("-static-libgcc -static-libstdc++") + else () + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + link_libraries("-static-libgcc -static-libstdc++") + link_libraries(libc++.a) + link_libraries(libc++abi.a) + endif() endif() # Only linux, clang doesn't want to use a shared library that is not PIC. diff --git a/filament/CMakeLists.txt b/filament/CMakeLists.txt index 8811eb1742..d9fe507939 100644 --- a/filament/CMakeLists.txt +++ b/filament/CMakeLists.txt @@ -729,6 +729,18 @@ set(LINUX_COMPILER_FLAGS if (MSVC) set(FILAMENT_WARNINGS /W3) +elseif (FILAMENT_USING_GCC) + # GCC is not officially supported, so use a weaker set of warnings (incl. not using -Werror). + set(FILAMENT_WARNINGS + -Wall -Wextra-semi -Wundef + -Wno-unused-parameter -Wno-missing-field-initializers + -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unused-function + -Wnon-virtual-dtor -Wimplicit-fallthrough + -Wno-strict-aliasing + -Wno-changes-meaning -Wno-return-type + -Wno-invalid-constexpr -Wno-parentheses + -Wno-sign-compare -Wno-deprecated-declarations + ) else() set(FILAMENT_WARNINGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers diff --git a/filament/backend/CMakeLists.txt b/filament/backend/CMakeLists.txt index a1afda64b5..00e8c6fd63 100644 --- a/filament/backend/CMakeLists.txt +++ b/filament/backend/CMakeLists.txt @@ -495,6 +495,13 @@ endif() if (MSVC) set(FILAMENT_WARNINGS /W3) +elseif (FILAMENT_USING_GCC) + # GCC is not officially supported, so use a weaker set of warnings (incl. not using -Werror) + set(FILAMENT_WARNINGS + -Wall -Wno-unused-parameter -Wno-missing-field-initializers + -Wdeprecated -Wnon-virtual-dtor -Wno-strict-aliasing + -Wno-invalid-constexpr -Wno-parentheses -Wno-unused-variable + ) else() set(FILAMENT_WARNINGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers