Das tue ich cmake . && make all install
. Dies funktioniert, wird aber installiert /usr/local
.
Ich muss zu einem anderen Präfix installieren (zum Beispiel zu /usr
).
Auf welcher cmake
und- make
Befehlszeile soll statt installiert /usr
werden /usr/local
?
CMakeLists.txt
damit Sie sie festlegen und vergessen können. Ich sage nicht, dass es keinen allgemeinen Anwendungsfall gibt, um das Installationsverzeichnis im laufenden Betrieb zu ändern - es wird eindeutig anhand der Anzahl der Stimmen beurteilt - ich bin für CMake noch ziemlich neu und neugierig, wenn dieses Problem auftritt.make install
Pfad auf einen temporären Pfad teste , um sicherzustellen, dass alles, was installiert werden muss, am richtigen Ort installiert wurde, ohne meine Entwicklungsmaschine zu beschädigen. Nur ein Beispiel. Ein anderer Fall ist das Cross-Compilieren für eine andere Architektur.CMakeLists.txt
ich die Originalquelle patchen. Wenn ich nur eine Befehlszeilenoption habe, kann ich die Pfade direkt in der Fedora-spec
Datei finden.CMakeLists.txt
Datei zu bearbeiten , wenn Sie nur Software erstellen und installieren - das Überschreiben / Festlegen von Variablen über die Befehlszeile oder die anfängliche Cache-Datei usw. ist der bevorzugte "Verbraucher". Art der Einstellung von Optionen.Antworten:
Sie können jede CMake-Variable in der Befehlszeile übergeben oder zwischengespeicherte Variablen mit ccmake / cmake-gui bearbeiten. In der Befehlszeile
Würde das Projekt konfigurieren, alle Ziele erstellen und unter dem Präfix / usr installieren. Der Typ (PATH) ist nicht unbedingt erforderlich, würde jedoch dazu führen, dass die Qt-basierte cmake-gui den Dialog zur Verzeichnisauswahl anzeigt.
Einige kleinere Ergänzungen als Kommentare machen deutlich, dass die Bereitstellung einer einfachen Äquivalenz für einige nicht ausreicht. Die beste Vorgehensweise wäre, ein externes Build-Verzeichnis zu verwenden, dh nicht die Quelle direkt. Verwenden Sie auch eine allgemeinere CMake-Syntax, um den Generator zu abstrahieren.
Sie können sehen, dass es etwas länger wird und nicht mehr direkt gleichwertig ist, sondern in einer ziemlich präzisen Form näher an den Best Practices liegt ... Die --config wird nur von Generatoren mit mehreren Konfigurationen (dh MSVC) verwendet und ignoriert Von anderen.
quelle
/usr .
Der Teil ": PATH" in der akzeptierten Antwort kann weggelassen werden. Diese Syntax kann einprägsamer sein:
... wie in den Antworten hier verwendet .
quelle
:PATH
ist kein Fehler .Beachten Sie, dass Sie sowohl in CMake als auch in Autotools nicht immer den Installationspfad zur Konfigurationszeit festlegen müssen. Sie können DESTDIR zur Installationszeit verwenden (siehe auch hier ), wie in:
Siehe auch diese Frage, die den subtilen Unterschied zwischen DESTDIR und PREFIX erklärt.
Dies ist für inszenierte Installationen vorgesehen und ermöglicht das Speichern von Programmen an einem anderen Ort als dem, an dem sie ausgeführt werden, z
/etc/alternatives
. B. über symbolische Links.Wenn Ihr Paket jedoch verschiebbar ist und keine fest codierten (Präfix-) Pfade benötigt, die über die Konfigurationsphase festgelegt wurden, können Sie es möglicherweise überspringen. Also statt:
du würdest rennen:
Beachten Sie, dass dies, wie user7498341 betont, nicht für Fälle geeignet ist, in denen Sie PREFIX wirklich verwenden sollten.
quelle
DESTDIR
. Aber eigentlich ist das falsch. Sie sollten auf das verweisen Cmake docs cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ... ,make DESTDIR=/home/john install
welche die betreffende Software mit dem Installations Präfix, zB installieren „/ usr / local“ mit dem DESTDIR Wert vorangestellt was schließlich "/ home / john / usr / local" gibt.cmake --build build --target install -- DESTDIR=/usr
Hinweis: Dies sollte auch mit Ninja Generator funktionieren (Regeln scheinen zu enthalten$ENV{DESTDIR}
)Die Art und Weise, wie ich plattformübergreifende CMake-Projekte erstelle, ist folgende:
./project-root/build/stage
- der Pfad wird immer relativ zum aktuellen Verzeichnis betrachtet, wenn er nicht absolut ist)..
mit dem in der vorherigen Zeile konfigurierten Buildsystem konfiguriert wurde. Es führt dasinstall
Ziel aus, das auch alle erforderlichen abhängigen Ziele erstellt, wenn diese erstellt werden müssen, und kopiert dann die Dateien in dasCMAKE_INSTALL_PREFIX
(in diesem Fall./project-root/build/stage
. Bei Builds mit mehreren Konfigurationen, wie in Visual Studio, können Sie auch die Konfiguration mit angeben die optionale--config <config>
Flagge.cmake --build
Befehls ist, dass er für alle Generatoren (dh Makefiles und Visual Studio) funktioniert, ohne dass unterschiedliche Befehle erforderlich sind.Danach verwende ich die installierten Dateien, um Pakete zu erstellen oder sie in andere Projekte aufzunehmen ...
quelle
cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
make -j $(nproc)
um die Anzahl der Build-Threads anzugeben,cmake --build . --target=install --config=Release -- -j 8
für den Makefile-Generator odercmake --build . --target=install --config=Release -- /m:8
für den Visual Studio-Generator mit 8 Threads. Tatsächlich können Sie alle Befehlszeilenparameter nach--
-j
ist kein Flag für cmake, alle Flags, die danach kommen--
, werden an das zugrunde liegende Build-System übergeben ...In Bezug auf Bruce Adams Antwort:
Ihre Antwort schafft gefährliche Verwirrung. DESTDIR ist für Installationen außerhalb des Stammbaums vorgesehen. Man kann sehen, was im Stammbaum installiert werden würde, wenn man DESTDIR nicht angeben würde. PREFIX ist das Basisverzeichnis, auf dem die eigentliche Installation basiert.
Beispielsweise gibt PREFIX = / usr / local an, dass das endgültige Ziel eines Pakets / usr / local ist. Wenn Sie DESTDIR = $ HOME verwenden, werden die Dateien so installiert, als ob $ HOME das Stammverzeichnis (/) wäre. Wenn, sagen wir DESTDIR, / tmp / destdir wäre, könnte man sehen, wie sich 'make install' auswirken würde. In diesem Sinne sollte DESTDIR niemals die gebauten Objekte beeinflussen.
Ein Makefile-Segment, um es zu erklären:
Programme müssen davon ausgehen, dass PREFIX das Basisverzeichnis des endgültigen Verzeichnisses (dh des Produktionsverzeichnisses) ist. Die Möglichkeit, ein in DESTDIR = / etwas installiertes Programm zu verknüpfen, bedeutet nur, dass das Programm nicht auf Dateien zugreift, die auf PREFIX basieren, da dies einfach nicht funktionieren würde. cat (1) ist ein Programm, das (in seiner einfachsten Form) von überall ausgeführt werden kann. Hier ist ein Beispiel, das nicht geht:
Wenn Sie versuchen würden, prog von einem anderen Ort als $ PREFIX / bin / prog auszuführen, wird prog.db niemals gefunden, da es sich nicht an der erwarteten Position befindet.
Schließlich funktioniert / etc / alternatives wirklich nicht so. Es gibt Symlinks zu Programmen, die im Stammbaum installiert sind (z. B. vi -> / usr / bin / nvi, vi -> / usr / bin / vim usw.).
quelle
Es wird als schlechte Praxis angesehen, den tatsächlichen Generator (z. B. via
make
) aufzurufen, wenn CMake verwendet wird . Es wird dringend empfohlen, dies folgendermaßen zu tun:Phase konfigurieren:
Phasen erstellen und installieren
Wenn Sie diesem Ansatz folgen, kann der Generator einfach umgeschaltet werden (z. B.
-GNinja
für Ninja ), ohne sich an generatorspezifische Befehle erinnern zu müssen.quelle
--config
Argument?Ab CMake 3.15 wäre der richtige Weg, dies zu erreichen, folgende:
Offizielle Dokumentation
quelle