CONAN NO_OUTPUT_DIRS

Beim ersten conan build Aufruf landen alle finalen Dateien im richtigen Verzeichnis. Man debugged ein bisschen und ruft cmake zur Aktualisierung auf … doch die Binärdateien werden nicht aktualisiert.

Anstatt dessen findet man die Dateien in anderen Verzeichnissen. Willkommen in der Conan (v1) Hilfegruppe.


Wenn Conan den CMake Generator benutzt, stellt dieser diverse Pfade für den Buildoutput ein. Denn Conan “wünscht” sich, dass Ausgabepfade wie bin für Binaries und lib für Bibliotheken benutzt werden.
Doch auch CMake interne Scripts können diese Pfade anpassen. Und so kommt es gerne mal zu Konflikten, die nicht immer gleich sichtbar werden.

Ich hatte in der Firma genau das Problem, dass der erste conan install und conan build Aufruf genau zu den Ergebnissen geführt hatte, die auch zu erwarten waren.

Wenn man nun aber während der aktiven Weiterentwicklung cmake oder make erneut aufrief, um Änderungen nachzukompilieren, landeten sie in den von CONAN definierten Verzeichnissen und nicht dort, wo die CMake Scripts sie hätten ablegen sollen.

Lösung: NO_OUTPUT_DIRS

In von Conan v1 addressierteb CMakeLists.txt Dateien befindet sich in der Regel der Aufruf:
conan_basic_setup().
Diese Makro holt alle notwendigen Variablen für den Buildprozess in das CMake-Projekt und ist unter anderem auch für die “ungewollte” Änderung der Pfade verantwortlich.
Doch die Conan Macher haben dem Makro einige Parameter übergeben, darunter auch:
conan_basic_setup(NO_OUTPUT_DIRS). Damit wird das manchmal störende Verhalten von Conan abgeschaltet und die Kontrolle alleine an CMake übergeben.

Fazit

Es gibt noch ein paar andere Optionen für das Basic-Setup, doch NO_OUTPUT_DIRS zeigt, dass die Conan Macher viele Varianten von Builds schon durchgedacht haben.
Im Standard schreibt Conan alles so um, dass es am Ende möglichst einfach wieder Paket erzeugen kann. Doch da viele CMake Scripts hier manuell eingreifen, kann dieses Feature optional ausgeschaltet werden.

Ein einfältiger Kollege meinte auch gleich, es müsse das gesamte Conan Build-System auf den Kopf stellen um Kontrolle über Pfade zu erhalten.
Naja, ein Blick in die Doku und 14 Zeichen lösen das Problem natürlich auch und beschreiten den vorgesehenen Pfad.

Zugegeben, Conan ist auf Grund seiner vielen Möglichkeiten ein komplexer Moloch geworden … doch je länger ich damit arbeite, um so mehr lerne ich, wie flexibel die Software gestaltet ist.

Und ab Conan v2 wird ohnehin die Verantwortung für den Build viel weitreichender an die Generator-Toolsets abgegeben.
Aber das ist eine andere Geschichte.