tutorial make descarga cmake

descarga - cmake vs make



Copie el archivo del directorio de origen al directorio binario usando CMake (5)

El archivo_configuración sugerido es probablemente la solución más fácil. Sin embargo, no volverá a ejecutar el comando copiar si eliminó manualmente el archivo del directorio de compilación. Para manejar también este caso, lo siguiente funciona para mí:

add_custom_target(copy-test-makefile ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/input.txt) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/input.txt)

Estoy tratando de crear un proyecto simple en CLion. Utiliza CMake (soy nuevo aquí) para generar Makefiles para construir proyectos (o algún tipo de)

Todo lo que necesito es transferir algún archivo que no sea del proyecto (algún tipo de archivo de recursos) al directorio binario cada vez que ejecuto mi código.

Ese archivo contiene datos de prueba y la aplicación lo abre para leerlos. Intenté varias formas de hacerlo:

  • Vía file(COPY ...

    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt

    Se ve bien, pero funciona solo una vez y no vuelve a copiar el archivo después de la próxima ejecución.

  • Vía add_custom_command

    • Versión de OUTPUT

      add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)

    • Versión TARGET

      add_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR})

    Pero nadie de eso funciona.

¿Qué estoy haciendo mal?


La primera opción que probaste no funciona por dos razones.

Primero, olvidó cerrar el paréntesis.

Segundo, el DESTINATION debe ser un directorio, no un nombre de archivo. Suponiendo que cerró el paréntesis, el archivo terminaría en una carpeta llamada input.txt .

Para que funcione, simplemente cámbielo a

file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR})


Puede considerar usar configure_file con la opción COPYONLY :

configure_file(<input> <output> COPYONLY)

A diferencia del file(COPY ...) crea una dependencia a nivel de archivo entre entrada y salida, es decir:

Si se modifica el archivo de entrada, el sistema de compilación volverá a ejecutar CMake para reconfigurar el archivo y generar el sistema de compilación nuevamente.


Sugeriría TARGET_FILE_DIR si desea que el archivo se copie en la misma carpeta que su archivo .exe.

$ Directorio del archivo principal (.exe, .so.1.2, .a).

add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt $<TARGET_FILE_DIR:${PROJECT_NAME}>)

En VS, este script cmake copiará input.txt en el mismo archivo que su exe final, sin importar si se trata de depuración o lanzamiento.


ambas opciones son válidas y apuntan a dos pasos diferentes de su compilación:

  1. file(COPY ... copia el archivo en el paso de configuración y solo en este paso. Cuando reconstruye su proyecto sin haber cambiado su configuración de cmake, este comando no se ejecutará.
  2. add_custom_command es la opción preferida cuando desea copiar el archivo en cada paso de compilación.

La versión correcta para su tarea sería:

add_custom_command( TARGET foo POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/test/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)

puedes elegir entre PRE_BUILD , PRE_LINK , POST_BUILD mejor si lees la documentación de add_custom_command

Puede encontrar un ejemplo sobre cómo usar la primera versión aquí: Use CMake add_custom_command para generar la fuente para otro objetivo