¿Cómo hago que la salida de CMake se convierta en un directorio 'bin'?

188

Actualmente estoy construyendo un proyecto con una estructura de complemento. Estoy usando CMake para compilar el proyecto. Los complementos se compilan en directorios separados. Mi problema es que CMake compila y guarda los binarios y complementos, bibliotecas dinámicas, en la estructura de directorios de la fuente. ¿Cómo hago para que CMake guarde los archivos en algo así como un directorio ./bin ?

Martin Kristiansen
fuente

Respuestas:

302

Como en la respuesta de Oleg, creo que la variable correcta para establecer es CMAKE_RUNTIME_OUTPUT_DIRECTORY . Usamos lo siguiente en nuestra raíz 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)

También puede especificar los directorios de salida por destino:

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"
)

En ambos casos se puede añadir _[CONFIG]al nombre de variable / propiedad para hacer el directorio de salida se aplica a una configuración específica (los valores estándar de configuración son DEBUG, RELEASE, MINSIZERELy RELWITHDEBINFO).

Adam Bowen
fuente
8
También puede anular esto según el objetivo estableciendo la propiedad de destino RUNTIME_OUTPUT_DIRECTORY. Ver documentación aquí: cmake.org/cmake/help/…
DLRdave
44
El enlace de DLRdave está muerto. Pruebe cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca
¿Cómo hacer que se aplique a todas las configuraciones a la vez?
emlai
Los primeros tres comandos deben aplicarse a todas las configuraciones (específicamente la configuración CMAKE_RUNTIME_OUTPUT_DIRECTORY). Solo establecería CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (por ejemplo) si desea un directorio diferente para la salida de depuración. El comportamiento exacto depende del generador / cadena de herramientas que esté utilizando (por ejemplo, los archivos de proyecto de Visual Studio incluyen todas las configuraciones en un árbol de compilación, mientras que el generador de archivos MAKE solo generará archivos MAKS para una configuración de compilación).
Adam Bowen
1
¿Cuál es el propósito de la configuración CMAKE_ARCHIVE_OUTPUT_DIRECTORY, considerando que el comando install(TARGETS <target_name>)todavía se queja de "dado que no hay DESTINO DE TIEMPO DE EJECUCIÓN para el objetivo ejecutable"? Esta variable supuestamente proporciona un valor predeterminado, por lo tanto, el installcomando no debería quejarse de la ausencia de a RUNTIME DESTINATION.
thiagowfx
30

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

ovk
fuente
10
Use el nombre completo de la ruta al directorio como el valor de la variable, y no ponga un "/" final en el valor ... como en la respuesta de Adam Bowen.
DLRdave
44
¿Por qué necesita agregar la ruta completa? Parece una molestia cuando mueves tu proyecto ...
ScottF
8

Use la EXECUTABLE_OUTPUT_PATHvariable CMake para establecer la ruta necesaria. Para más detalles, consulte la documentación en línea de CMake:

CMake 2.8.8 Documentación

gtikok
fuente
15
EXECUTABLE_OUTPUT_PATH todavía funciona en este momento, pero es la forma "antigua" de lograr este resultado. La respuesta de Adam Bowen es el enfoque recomendado.
DLRdave
4

En cuanto a mí, estoy usando cmake 3.5, el siguiente ( set variable) no funciona:

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/"
)

pero esto funciona ( 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
fuente
2
Estoy usando la respuesta de Adam con set (CMAKE _... y funciona, pero solo cuando lo haces antes de agregar bibliotecas, ejecutables, etc. Creo que es una nota importante para principiantes como yo.
ashrasmun
Guau. @ashrasmun me salvó de volverme loco después de unas horas. Absolutamente nada funcionaba hasta que nos dimos cuenta de que el orden de estos comandos es muy relevante.
artrópodo
2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)
mcandre
fuente
1

El inglés no es mi lengua materna; disculpe los errores de escritura.

use esta configuración de línea:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
coloque su proyecto CMakeLists.txt.
este $ {PROJECT_SOURCE_DIR} es su directorio fuente actual donde se ubica el proyecto.
y si deambular por qué es $ {EXECUTABLE_OUTPUT_PATH}
verifique este archivo y CMakeCache.txtluego busque la palabra clave output path,
todas las variables definidas aquí, darían una explicación completa del proyecto setting·

jdir.s
fuente
0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)
Conoce a Modia
fuente
8
¿Podría agregar alguna explicación a su respuesta?
Paul Floyd el
0

Independientemente de si defino esto en el CMakeLists.txt principal o en los individuales, todavía asume que quiero todas las bibliotecas y contenedores fuera de la ruta principal, que es el supuesto menos útil de todos.

Jerry Miller
fuente
0

Para agregar a esto:

Si está utilizando CMAKE para generar una solución de Visual Studio y desea que Visual Studio envíe archivos compilados a / bin, la respuesta de Peter debe modificarse un poco:

# 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
fuente