Comment faire de la sortie CMake dans un répertoire «bin»?

188

Je construis actuellement un projet avec une structure de plugin. J'utilise CMake pour compiler le projet. Les plugins sont compilés dans des répertoires séparés. Mon problème est que CMake compile et enregistre les binaires et les plugins, les bibliothèques dynamiques, dans la structure de répertoires de la source. Comment faire en sorte que CMake enregistre les fichiers dans quelque chose comme un répertoire ./bin ?

Martin Kristiansen
la source

Réponses:

302

Comme dans la réponse d'Oleg, je crois que la variable correcte à définir est CMAKE_RUNTIME_OUTPUT_DIRECTORY . Nous utilisons ce qui suit dans notre racine CMakeLists.txt:

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

Vous pouvez également spécifier les répertoires de sortie sur une base par cible:

set_target_properties( targets...
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

Dans les deux cas , vous pouvez ajouter _[CONFIG]au nom de la variable / propriété pour rendre le répertoire de sortie appliquer à une configuration spécifique (les valeurs standard pour la configuration sont DEBUG, RELEASE, MINSIZERELet RELWITHDEBINFO).

Adam Bowen
la source
8
Vous pouvez également remplacer cela par cible en définissant la propriété cible RUNTIME_OUTPUT_DIRECTORY. Voir la documentation ici: cmake.org/cmake/help/…
DLRdave
4
Le lien de DLRdave est mort. Essayez cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca
Comment l'appliquer à toutes les configurations à la fois?
emlai
Les trois premières commandes doivent s'appliquer à toutes les configurations (en particulier en définissant CMAKE_RUNTIME_OUTPUT_DIRECTORY). Vous ne définiriez CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (par exemple) que si vous vouliez un répertoire différent pour la sortie de débogage. Le comportement exact dépend du générateur / de la chaîne d'outils que vous utilisez (par exemple, les fichiers de projet Visual Studio incluent toutes les configurations dans une arborescence de construction, tandis que le générateur de makefile ne générera que des makefiles pour une configuration de construction).
Adam Bowen
1
Quel est le but de la configuration CMAKE_ARCHIVE_OUTPUT_DIRECTORY, étant donné que la commande install(TARGETS <target_name>)se plaint toujours de "donné aucune DESTINATION RUNTIME pour la cible exécutable"? Cette variable est censée fournir une valeur par défaut, donc la installcommande ne doit pas se plaindre de l'absence de RUNTIME DESTINATION.
thiagowfx
30

Utilisation set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")

ovk
la source
10
Utilisez le chemin complet du répertoire comme valeur de variable, et ne mettez pas de "/" à la fin de la valeur ... comme dans la réponse d'Adam Bowen.
DLRdave
4
Pourquoi avez-vous besoin d'ajouter le chemin complet? Cela semble être une gêne lorsque vous déplacez votre projet ...
ScottF
8

Utilisez la EXECUTABLE_OUTPUT_PATHvariable CMake pour définir le chemin requis. Pour plus de détails, reportez-vous à la documentation en ligne de CMake:

Documentation CMake 2.8.8

gtikok
la source
15
EXECUTABLE_OUTPUT_PATH fonctionne toujours en ce moment, mais c'est la "vieille" façon d'atteindre ce résultat. La réponse d'Adam Bowen est l'approche recommandée.
DLRdave
4

Quant à moi, j'utilise cmake 3.5, ci-dessous ( set variable) ne fonctionne pas:

set(
      ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

mais cela fonctionne ( set set_target_properties):

set_target_properties(demo5
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)
Jayhello
la source
2
J'utilise la réponse d'Adam avec set (CMAKE _... et cela fonctionne, mais seulement quand vous le faites avant d'ajouter des bibliothèques, des exécutables, etc. Je pense que c'est une note importante pour les débutants comme moi.
ashrasmun
Sensationnel. @ashrasmun m'a évité de devenir fou après quelques heures. Absolument rien ne fonctionnait jusqu'à ce que l'on se rende compte que l'ordre de ces commandes est très pertinent.
arthropode
2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)
mcandre
la source
1

L'anglais n'est pas ma langue maternelle; veuillez excuser les erreurs de frappe.

utilisez cette configuration de ligne:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
placez votre projet CMakeLists.txt.
this $ {PROJECT_SOURCE_DIR} est votre répertoire source actuel où se trouve le projet.
et si vous vous demandez pourquoi $ {EXECUTABLE_OUTPUT_PATH}
vérifiez ce fichier CMakeCache.txtpuis recherchez le mot-clé output path,
toutes les variables définies ici, cela donnerait une explication complète du projet tout setting·

jdir.s
la source
0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)
Rencontrez Modia
la source
8
Pouvez-vous ajouter quelques explications à votre réponse?
Paul Floyd
0

Indépendamment du fait que je le définis dans le CMakeLists.txt principal ou dans les fichiers individuels, cela suppose toujours que je veux que toutes les bibliothèques et tous les bacs soient hors du chemin principal, ce qui est l'hypothèse la moins utile de toutes.

Jerry Miller
la source
0

Pour ajouter à cela:

Si vous utilisez CMAKE pour générer une solution Visual Studio et que vous souhaitez que Visual Studio génère des fichiers compilés dans / bin, la réponse de Peter doit être légèrement modifiée:

# set output directories for all builds (Debug, Release, etc.)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
serg06
la source