Oui cmake . && make all install
. Cela fonctionne, mais s'installe sur /usr/local
.
Je dois installer sur un préfixe différent (par exemple, pour /usr
).
Quelle est la ligne de commande cmake
et make
sur laquelle installer au /usr
lieu de /usr/local
?
CMakeLists.txt
pour pouvoir la définir et l'oublier. Je ne dis pas qu'il n'y a pas de cas d'utilisation commun pour changer le répertoire d'installation à la volée - il y a clairement à en juger par le nombre de votes - je suis juste assez nouveau pour CMake et curieux quand ce problème se pose.make install
chemin temporaire pour m'assurer que tout ce qui doit être installé est installé au bon endroit sans gâcher ma machine de développement. Un seul exemple. Un autre cas est la compilation croisée pour une autre architecture.CMakeLists.txt
, je dois patcher la source d'origine. Le simple fait d'avoir une option en ligne de commande me permet d'obtenir les bons chemins dans lespec
fichier Fedora .CMakeLists.txt
fichier si vous êtes juste en train de créer et d'installer un logiciel - remplacer / définir des variables à partir de la ligne de commande ou du fichier de cache initial, etc. est le "consommateur" préféré façon de définir les options.Réponses:
Vous pouvez passer n'importe quelle variable CMake sur la ligne de commande ou modifier des variables mises en cache à l'aide de ccmake / cmake-gui. Sur la ligne de commande,
Configurerait le projet, créerait toutes les cibles et installerait le préfixe / usr. Le type (PATH) n'est pas strictement nécessaire, mais entraînerait le cmake-gui basé sur Qt à présenter la boîte de dialogue de sélection de répertoire.
Quelques ajouts mineurs en tant que commentaires montrent clairement que fournir une équivalence simple ne suffit pas pour certains. La meilleure pratique serait d'utiliser un répertoire de construction externe, c'est-à-dire pas directement la source. Également pour utiliser une syntaxe CMake plus générique faisant abstraction du générateur.
Vous pouvez voir qu'il devient un peu plus long et n'est plus directement équivalent, mais est plus proche des meilleures pratiques sous une forme assez concise ... Le --config n'est utilisé que par les générateurs multi-configuration (c'est-à-dire MSVC), ignoré par d'autres.
la source
/usr .
La partie ": CHEMIN" de la réponse acceptée peut être omise. Cette syntaxe peut être plus mémorable:
... comme utilisé dans les réponses ici .
la source
:PATH
n'est pas une erreur .Notez que dans CMake et Autotools, vous n'avez pas toujours à définir le chemin d'installation au moment de la configuration. Vous pouvez utiliser DESTDIR au moment de l'installation (voir également ici ) à la place comme dans:
Voir aussi cette question qui explique la subtile différence entre DESTDIR et PREFIX.
Ceci est destiné aux installations par étapes et permet de stocker des programmes dans un emplacement différent de celui où ils sont exécutés, par exemple
/etc/alternatives
via des liens symboliques.Cependant, si votre package est déplaçable et n'a pas besoin de chemins codés en dur (préfixe) définis via l'étape de configuration, vous pourrez peut- être l'ignorer. Donc au lieu de:
vous courriez:
Notez que, comme le souligne user7498341, ce n'est pas approprié dans les cas où vous devriez vraiment utiliser PREFIX.
la source
DESTDIR
. Mais en fait, c'est faux. Vous devriez vous référer à la documentation de cmake cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ...make DESTDIR=/home/john install
qui installera le logiciel concerné en utilisant le préfixe d'installation, par exemple «/ usr / local» ajouté avec la valeur DESTDIR ce qui donne finalement «/ home / john / usr / local».cmake --build build --target install -- DESTDIR=/usr
noter: cela devrait également fonctionner avec le générateur Ninja (les règles semblent contenir$ENV{DESTDIR}
)La façon dont je construis la plateforme multi-projets CMake est la suivante:
./project-root/build/stage
- le chemin est toujours considéré par rapport au répertoire courant s'il n'est pas absolu).
avec le buildsystem configuré dans la ligne précédente. Il exécutera lainstall
cible qui crée également toutes les cibles dépendantes nécessaires si elles doivent être générées, puis copie les fichiers dans leCMAKE_INSTALL_PREFIX
(ce qui est le cas dans ce cas./project-root/build/stage
. Pour les générations multi-configuration, comme dans Visual Studio, vous pouvez également spécifier la configuration avec le--config <config>
drapeau optionnel .cmake --build
commande est qu'elle fonctionne pour tous les générateurs (c'est-à-dire les makefiles et Visual Studio) sans avoir besoin de commandes différentes.Ensuite, j'utilise les fichiers installés pour créer des packages ou les inclure dans d'autres projets ...
la source
cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
make -j $(nproc)
, pour spécifier le nombre de threads de construction, fairecmake --build . --target=install --config=Release -- -j 8
pour le générateur Makefile oucmake --build . --target=install --config=Release -- /m:8
pour le générateur Visual Studio avec 8 threads. En fait, vous pouvez passer tous les paramètres de ligne de commande après--
-j
n'est pas un drapeau pour cmake, tous les drapeaux qui suivent--
passent au système de build sous-jacent ...Concernant la réponse de Bruce Adams:
Votre réponse crée une confusion dangereuse. DESTDIR est destiné aux installations hors de l'arborescence racine. Il permet de voir ce qui serait installé dans l'arborescence racine si l'on n'a pas spécifié DESTDIR. PREFIX est le répertoire de base sur lequel est basée l'installation réelle.
Par exemple, PREFIX = / usr / local indique que la destination finale d'un package est / usr / local. L'utilisation de DESTDIR = $ HOME installera les fichiers comme si $ HOME était la racine (/). Si, disons DESTDIR, était / tmp / destdir, on pourrait voir ce que «make install» affecterait. Dans cet esprit, DESTDIR ne devrait jamais affecter les objets construits.
Un segment makefile pour l'expliquer:
Les programmes doivent supposer que PREFIX est le répertoire de base du répertoire final (c'est-à-dire de production). La possibilité de créer un lien symbolique vers un programme installé dans DESTDIR = / quelque chose signifie simplement que le programme n'accède pas aux fichiers basés sur PREFIX car il ne fonctionnerait tout simplement pas. cat (1) est un programme qui (dans sa forme la plus simple) peut s'exécuter de n'importe où. Voici un exemple qui ne fonctionnera pas:
Si vous avez essayé d'exécuter prog ailleurs que $ PREFIX / bin / prog, prog.db ne sera jamais trouvé car il ne se trouve pas à son emplacement prévu.
Enfin, / etc / alternatives ne fonctionne vraiment pas de cette façon. Il existe des liens symboliques vers des programmes installés dans l'arborescence racine (par exemple, vi -> / usr / bin / nvi, vi -> / usr / bin / vim, etc.).
la source
Il est considéré comme une mauvaise pratique d'invoquer le générateur réel (par exemple via
make
) si vous utilisez CMake . Il est fortement recommandé de le faire comme ceci:Configurer la phase:
Phases de construction et d' installation
En suivant cette approche, le générateur peut être facilement commuté (par exemple
-GNinja
pour Ninja ) sans avoir à mémoriser les commandes spécifiques au générateur.la source
--config
argument?À partir de CMake 3.15, la bonne façon d'y parvenir serait d'utiliser:
Documentation officielle
la source