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:
-
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á. -
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