Estoy intentando crear un proyecto simple en CLion. Utiliza CMake (soy nuevo aquí) para generar Makefiles para construir un proyecto (o algún tipo de él)
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 my code.
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 siguiente ejecución.
Vía
add_custom_command
OUTPUT
versiónadd_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)
TARGET
versiónadd_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR})
Pero ninguno de ellos funciona.
¿Qué estoy haciendo mal?
configure_file
no funcionará con subdirectorios, incluso si usa GLOB para crear una lista de archivos.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 reconstruya 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:
se puede elegir entre
PRE_BUILD
,PRE_LINK
,POST_BUILD
mejor es leer la documentación de add_custom_commandse 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
fuente
CMAKE_CURRENT_SOURCE_DIR
si eltest/input.txt
archivo es relativo alCMakeLists.txt
archivo actual . Si es relativo a la raízCMakeLists.txt
, utiliceCMAKE_SOURCE_DIR
.La primera de las opciones que probó no funciona por dos razones.
Primero, olvidó cerrar el paréntesis.
En segundo lugar,
DESTINATION
debe ser un directorio, no un nombre de archivo. Suponiendo que cerró el paréntesis, el archivo terminaría en una carpeta llamadainput.txt
.Para que funcione, cámbialo a
fuente
Sugeriría
TARGET_FILE_DIR
si desea que el archivo se copie en la misma carpeta que su archivo .exe.En VS, este script cmake copiará input.txt al mismo archivo que su archivo ejecutable final, sin importar si es depurado o liberado.
fuente
Esto es lo que usé para copiar algunos archivos de recursos: los archivos de copia son un objetivo vacío para ignorar errores
fuente
add_dependencies(MainTarget copy-files)
para que se ejecute automáticamente cuando construyo MainTargetadd_dependencies(MainTarget copy-files)
elCMakeLists.txt
archivo raíz significa que se puede utilizar durante todo el proyecto.si desea copiar la carpeta del directorio currant a la carpeta binaria (carpeta de compilación)
entonces el syntexe es:
fuente
El configure_file sugerido es probablemente la solución más sencilla. Sin embargo, no volverá a ejecutar el comando de copia si eliminó manualmente el archivo del directorio de compilación. Para manejar también este caso, lo siguiente funciona para mí:
fuente