Kurz gesagt: Ich möchte zwei verschiedene Quellbäume aus dem aktuellen generieren, die nur darauf basieren, dass ein Präprozessormakro definiert und ein anderes undefiniert ist, ohne dass andere Änderungen am Quellcode vorgenommen werden.
Falls es Sie interessiert, hier ist meine Geschichte...
Am Anfang war mein Code sauber. Dann haben wir ein neues Produkt gemacht, und ja, es war besser. Aber der Code sah nur die gleichen Peripheriegeräte, also konnten wir den gleichen Code beibehalten.
Nun, fast.
Es gab eine kleine Bedingung, die geändert werden musste, also habe ich sie hinzugefügt:
#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif
...zu einer und nur einer Quelldatei. In der allgemeinen all-source-files-include-this Header-Datei hatte ich:
#if !(defined(PRODUCT_A)||defined(PRODUCT_B))
#error "Don't make me replace you with a small shell script. RTFM."
#endif
...so dass die Leute es nicht kompilieren konnten, wenn sie nicht ausdrücklich einen Produkttyp definierten.
Alles war gut. Oh... außer, dass Änderungen vorgenommen wurden, Komponenten ausgetauscht wurden, und da die neue Hardware besser funktionierte, konnten wir die Steuersysteme erheblich umschreiben. Wenn ich mir jetzt den Code ansehe, gibt es mehr als 60 separate Bereiche, die entweder durch einen oder durch einen anderen abgegrenzt sind:
#ifdef PRODUCT_A
...
#else
...
#endif
...oder dasselbe, aber für PRODUCT_B
. Oder sogar:
#if defined(PRODUCT_A)
...
#elif defined(PRODUCT_B)
...
#endif
Und natürlich nahm die Vernunft manchmal einen längeren Urlaub und:
#ifdef PRODUCT_A
...
#endif
#ifdef PRODUCT_B
...
#endif
Diese Bedingungen reichen von einem bis zu zweihundert Zeilen (man könnte meinen, dass der letzte Punkt durch den Austausch von Header-Dateien erledigt werden könnte, aber die Funktionsnamen müssen gleich sein).
Das ist Wahnsinn. Es wäre besser, wenn ich zwei getrennte produktbasierte Zweige im Quellcode-Repository pflegen und alle gemeinsamen Änderungen portieren würde. Das ist mir jetzt klar.
Gibt es etwas, das die beiden unterschiedlichen Quellbäume, die ich benötige, nur auf der Grundlage von PRODUCT_A
definiert werden und PRODUCT_B
undefiniert ist (und umgekehrt), sans irgendetwas anderes berühren (d.h. keine Einbindung von Headern, keine Makroerweiterung usw.)?