Comment utiliser CMAKE_INSTALL_PREFIX

97

Je veux générer Makefile avec la cible d'installation, en effectuant l'installation sur / usr au lieu de par défaut / usr / local. En supposant que le répertoire de construction est fait dans le sous-répertoire source, j'exécute:

cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..

CMakeCache.txt contient: CMAKE_INSTALL_PREFIX:PATH=/usr(OK?)

Maintenant j'exécute:

faire
faire installer

Tous les fichiers sont toujours installés sur usr / local. Qu'est-ce qui ne va pas?

Edit: Il n'y a aucun CMAKE_INSTALL_PREFIX dans aucun des fichiers de projet CMakeLists.txt. Avant d'exécuter cmake, je supprime tout du répertoire de sortie. Les directives d'installation dans CMakeLists.txt ressemblent à:

install(TARGETS mylibrary DESTINATION lib)

Alex F
la source

Réponses:

30

Il existe deux façons d'utiliser cette variable:

  • en le passant comme argument de ligne de commande, comme Job l'a mentionné:

    cmake -DCMAKE_INSTALL_PREFIX=< install_path > ..

  • lui attribuer une valeur dans CMakeLists.txt:

    SET(CMAKE_INSTALL_PREFIX < install_path >)

    Mais n'oubliez pas de le placer AVANT la PROJECT(< project_name>) commande, sinon cela ne fonctionnera pas!

ryan_tu
la source
4
Étrange, l'instruction SET () ne fonctionne pour moi que si je la place APRÈS l'instruction PROJECT () (CMake 2.8).
AstroFloyd
2
Cette réponse et la référence à laquelle elle renvoie abordent plus directement le problème de la commande avant / après project ().
Craig Scott
Quelle est cette PROJECTcommande et comment avoir cette cmakeoption avant elle? Vous auriez un exemple?
Stephane
6

Mais n'oubliez pas de placer la commande AVANT PROJET (<nom_projet>), sinon cela ne fonctionnera pas!

Ma première semaine d'utilisation de cmake - après quelques années d'autotools GNU - donc j'apprends toujours (mieux que d'écrire des macros m4), mais je pense que modifier CMAKE_INSTALL_PREFIX après avoir défini le projet est le meilleur endroit.

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
project (BarkBark)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")

Première exécution (pas de cache)

CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- The C compiler identification is GNU 4.4.7
-- etc, etc,...
CIP = /usr/local (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Deuxième manche

CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Faites-moi savoir si je me trompe, j'ai beaucoup à apprendre. C'est marrant.

Jim
la source
Essayez d'utiliser FORCE lorsque vous faites SET: set (CMAKE_INSTALL_PREFIX / foo / bar / bubba CACHE PATH "Cmake prefix" FORCE)
Jav_Rock