2016-07-05 13 views
0

Ich verwende cmake, um einen Linux-Treiber zu installieren. Um die Kernel-Version zu erhalten, verwende ich CMAKE_SYSTEM_VERSION, was die Ausgabe von uname -r ergeben sollte.CMAKE_SYSTEM_VERSION für neuen Kernel nicht aktualisiert

Allerdings, nachdem ich einen neuen Kernel installiert habe, habe ich versucht, den Treiber mit cmake neu zu installieren, nur um festzustellen, dass es zu /lib/modules/<previous kernel>/... statt zu dem Verzeichnis für den aktuellen Kernel installiert wurde. uname- r gibt das korrekte Ergebnis.

Ich verwende die folgende Zeile in meinem CMakeLists.txt:

install(PROGRAMS myDevice.ko DESTINATION "/lib/modules/${CMAKE_SYSTEM_VERSION}/kernel/drivers/myDevice" COMPONENT driver) 

ich nicht CMAKE_SYSTEM_VERSION im CMakeCache.txt finden konnte, und erneut ausführen nur cmake .. auch nicht den Trick zu tun haben. Ich musste den gesamten Build-Ordner neu erstellen.

Ich würde gerne wissen, ob es einen besseren Weg gibt, da der Build-Ordner auch Anwendungen enthält, die nicht neu aufgebaut werden sollten, nur weil es einen neuen Kernel gibt.

+1

Was ist Ihre CMake-Version? Ich denke, dass es sein Verhalten geändert hat, sehen Sie sich die neueste Dokumentation von CMAKE_SYSTEM_VERSION an: https://cmake.org/cmake/help/v3.6/variable/CMAKE_SYSTEM_VERSION.html – usr1234567

+0

@ usr1234567 Die Version ist 3.5.2. Ich habe die Variable nicht explizit gesetzt, also sollte sie 'CMAKE_HOST_SYSTEM_VERSION' werden, was 'uname -r' sein sollte. Und ich finde 'CMAKE_HOST_SYSTEM_VERSION' in CMakeCache.txt auch nicht, also sollte es immer noch die aktuelle Kernelversion darstellen, oder? – ted

+0

@ usr1234567 Ja sollte es: die Dokumentation (auf die Sie zeigen) besagt, dass 'CMAKE_SYSTEM_VERSION' standardmäßig auf [' CMAKE_HOST_SYSTEM_VERSION'] gesetzt ist (https://cmake.org/cmake/help/v3.5/variable/CMAKE_HOST_SYSTEM_VERSION.html# Variable: CMAKE_HOST_SYSTEM_VERSION), die 'uname -r' ist. – ted

Antwort

1

Es gibt CMake-Variablen, die seit der ersten Konfiguration behoben wurden. CMAKE_SYSTEM_VERSION ist einer von ihnen. CMAKE_C_COMPILER ist ein weiteres Beispiel für "feste" Variablen: Durch Änderung wird der Cache vollständig ungültig.

Sie müssen also verschiedene Builds für verschiedene Kernel erstellen.

Sie können die Konfiguration und das Erstellen von User-Space-Anwendungen von Kernel-Modulen trennen. Der Neuaufbau des Kernel-Moduls erzwingt somit keinen Neuaufbau der Anwendungen.

Genau diesen Ansatz habe ich in meinen Projekten verwendet: Einstellung einer Option (eingeführt mit option() Befehl) baut nur Anwendungen, Einstellung einer anderen Option baut nur Kernel-Module. Standardmäßig ist keine Option festgelegt, und sowohl Kernel-Space- als auch User-Space-Komponenten werden erstellt.