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.txtSe 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_commandOUTPUTversió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)TARGETversió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_fileno 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_commandes 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_BUILDmejor 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_DIRsi eltest/input.txtarchivo es relativo alCMakeLists.txtarchivo 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,
DESTINATIONdebe 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_DIRsi 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.txtarchivo 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