Skip to content

Cmake std fix#2373

Merged
andrewfb merged 2 commits intocinder:masterfrom
andrewfb:cmake_std_fix
Oct 10, 2025
Merged

Cmake std fix#2373
andrewfb merged 2 commits intocinder:masterfrom
andrewfb:cmake_std_fix

Conversation

@andrewfb
Copy link
Collaborator

@andrewfb andrewfb commented Oct 9, 2025

I investigated this more and discovered that CMake's export() command doesn't propagate INTERFACE_CXX_STANDARD or related properties to consuming applications. The solution appears to be capturing Cinder's C++ standard and extensions settings in cinderConfig.cmake and explicitly applying them to all applications via ci_make_app(). You'll note that the implementation uses a priority chain: user's explicit CMAKE_CXX_STANDARD override > Cinder's standard > default C++17. Extensions default to OFF (preventing the "namespace linux" issue) unless explicitly enabled with CMAKE_CXX_EXTENSIONS=ON.

Part of what this PR changes is that overriding the C++ standard - including specifying gnu++, should work now, and Cinder can actually build despite the linux definition with an additional flag.

These are the combinations I tested:

Test Scenario Compiler Cinder Build Command App Build Command Result
Default g++, clang++ cmake .. cmake .. Both use -std=c++17
Cinder C++20, App inherits g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=20 cmake .. Both use -std=c++20
Cinder C++23, App inherits g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=23 cmake .. Both use -std=c++23
Cinder default, App C++20 g++, clang++ cmake .. cmake .. -DCMAKE_CXX_STANDARD=20 Cinder -std=c++17, App -std=c++20
Cinder C++20, App C++23 g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=20 cmake .. -DCMAKE_CXX_STANDARD=23 Cinder -std=c++20, App -std=c++23
Cinder gnu++17, App inherits g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_EXTENSIONS=ON -DCMAKE_CXX_FLAGS="-Ulinux" cmake .. -DCMAKE_CXX_FLAGS="-Ulinux" Both use -std=gnu++17 with -Ulinux
Cinder gnu++20, App inherits g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_EXTENSIONS=ON -DCMAKE_CXX_FLAGS="-Ulinux" cmake .. -DCMAKE_CXX_FLAGS="-Ulinux" Both use -std=gnu++20 with -Ulinux
Cinder default, App gnu++17 g++, clang++ cmake .. cmake .. -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_EXTENSIONS=ON -DCMAKE_CXX_FLAGS="-Ulinux" Cinder -std=c++17, App -std=gnu++17 with -Ulinux
Cinder gnu++17, App c++20 g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_EXTENSIONS=ON -DCMAKE_CXX_FLAGS="-Ulinux" cmake .. -DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_EXTENSIONS=OFF Cinder -std=gnu++17 with -Ulinux, App -std=c++20
Cinder c++17, App gnu++20 g++, clang++ cmake .. cmake .. -DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_EXTENSIONS=ON -DCMAKE_CXX_FLAGS="-Ulinux" Cinder -std=c++17, App -std=gnu++20 with -Ulinux
Reject C++14 g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=14 N/A ❌ Correctly rejected
Reject C++11 g++, clang++ cmake .. -DCMAKE_CXX_STANDARD=11 N/A ❌ Correctly rejected

As a bonus this includes a small fix to build with C++20. Hoping this addresses @PetrosKataras' issue seen against #2361

@andrewfb andrewfb merged commit bbd6641 into cinder:master Oct 10, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant