CMake project oder project C

Es ist zum Durchdrehen.

Mit project(xyz) laufen Standard-Builds (Windows, Linux) aber der Tiny C Compiler (TCC) streikt, weil CMake hier C++ Code-Tests exekutiert.

Mit project(xyz C) streikt wieder Watcom, weil der dann C++ gar nicht mehr nutzen kann.


Fangen wir am Anfang an: Es ist ein philosophisches Problem.

C und C++ sind historisch in fast allen Betriebssystemen stark mit einander verbunden. Und ich sehe das GATE Projekt als eine Brücke zwischen den beiden Sprachen.
Doch in Wahrheit sprechen wir von zwei Sprachen, die wie zwei Länder zwei getrennte Rechtsräume, Gesetzgebung und Kultur beinhalten.
Auch Bjarne Stroustrup hat schon mehrfach verkündet:

Es gibt kein C/C++.

Soll heißen:

Es gibt entweder C oder C++.

TCC ist nur C

Der Tiny-C-Compiler ist im Gegensatz zu “den großen Brüdern” ein reiner C Compiler, während MSVC, GCC, CLANG und WATCOM beide Welten abdecken.

Wer also sein CMake Projekt mit

1project(myproject)

einleitet, lässt CMake nach einem C und einem C++ Compiler suchen, wobei zweiteres mit dem TCC fehlschlägt und CMake abbricht.

Die Lösung lautet:

1project(myproject C)

und alles ist wieder gut.

Optionaler C++ Support

Da im GATE Projekt jedoch C und C++ Targets vorkommen, hätte ich bereits eine NO_CPP Option eingeführt, die C++ Targets nur dann einschließt, wenn die NO_CPP Option NICHT gesetzt ist.
Das funktioniert auch mit MSVC und GCC, doch nun fängt OpenWatcom an zu spinnen.

Ist dort ein Top-Level-Projekt an die Sprache C gebunden, können keine C++ Unterprojekte mehr angefügt werden.

Als “schnelle” Lösung fiel mir am Ende nur folgende Lösung ein:

1option(GATE_NO_CPP "Build C files only, no C++ support" OFF)
2
3if(GATE_NO_CPP)
4  project(gate C)
5else()
6  project(gate)
7endif()

Im Toplevel CMakeLists.txt wird die NO_CPP Option definiert und abhängig davon wird ein reines C oder allgemeines Projekt angelegt.
Die Option wird nur für den TCC of ON geschaltet und im Nachgang können weitere C und optional auch C++ angelegt werden.

Fazit

Auf Details kommt es an.

Ich liebe CMake für seine unglaublichen vielen Anbindungen an unterschiedliche Compiler. Doch hier habe ich einmal ein Problem identifiziert, das CMake nicht selbst löst und mir etwas Nacharbeit beschert.

Toplevel-Projekte sind rein technisch auch gar nicht notwendig, doch sie helfen in IDEs bei der Schaffung einer überordneten Instanz wie “Solutions” bei Visual Studio.
Dass deren (sonst wirkungslose) Konfiguration Arbeitsläufe negativ beeinflussen kann, war mir bisher nicht aufgefallen.

However … wieder was gelernt.

📧 📋 🐘 | 🔗 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!