smart - ¿Cómo manejar mejor los archivos de datos con CMake?
programar contratos inteligentes (3)
Su pregunta es un poco antigua, pero en caso de que todavía esté interesado (o de alguien más), tengo una situación similar en la que copio los datos de prueba para un objetivo de prueba de unidad:
add_custom_command( TARGET ${UTEST_EXE_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "Copying unit test data.."
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_HOME_DIRECTORY}/utest/testdata ${CMAKE_BINARY_DIR}
)
Así que la idea principal es usar un objetivo posterior a la construcción, y se ejecuta después de cada construcción. Para mí, no son muchos datos, y el sistema de archivos los almacena en caché, por lo que no siento el proceso de copia. Probablemente podría mejorar esto copiando con copy_if_different . Sin embargo, en ese caso, debe crear una lista de sus archivos de imagen y escribir un bucle, ya que el comando se basa en archivos. Con el comando GLOB , esto no debería ser difícil de hacer si es necesario.
Tengo un proyecto CMake que contiene código y algunos archivos de datos (imágenes para ser precisos).
Mi estructura de directorio es así:
- src
- datos
src contiene el código fuente, datos de los archivos de datos. CMake sugiere compilaciones fuera de origen, así que cuando invoco make , tengo el programa ejecutable, pero no los archivos de datos, por lo que no puedo ejecutar el programa.
Por supuesto, make install copiaría mis archivos de datos a la ubicación requerida y lo haría funcionar, por lo tanto, me desarrollo así ahora:
- cmake -DCMAKE_INSTALL_DIR = dist
<edit source code>
- hacer instalar
- dist / myprogram.exe
Está bien si estoy trabajando con la línea de comandos y un editor, pero recientemente decidí cambiarme a Eclipse CDT. Generar un proyecto Eclipse desde CMake funciona muy bien, pero ejecutar manualmente el objetivo de instalación desde Eclipse no es tan bueno.
¿Cómo abordan ustedes este problema? ¿Tiene su programa algunos algoritmos inteligentes para tratar de encontrar su directorio de datos, incluso si no es donde está el binario? ¿O no usas construcciones fuera de código fuente?
Y si la copia de los archivos lleva demasiado tiempo (son imágenes ...), podría mejorarlo aún más creando un data_header.h "personalizado" con el archivo configure_file que contiene las rutas a los datos que aún se encuentran en su directorio de origen.
Esto es lo que hago: tengo un archivo "global_build_config.h.in" en mi fuente, que contiene lo siguiente:
const char* const global_testdatapath = "@Test_Data_Path@";
y luego use configure_file en CMake:
# Assume CMake knows a variable Test_Data_Path, it will be filled in automatically
# in the generated config/Global_Build_Config.h
configure_file( Global_Build_Config.h.in ${CMAKE_BINARY_DIR}/config/Global_Build_Config.h )
# The config directory should be added as a include-searchpath
include_directories( ${CMAKE_BINARY_DIR}/config/ )
Luego puedo #incluir "Global_Build_Config.h" en mis archivos cpp y referirme a la ruta fija.
configure_file
debería resolver ese problema.
Tengo un archivo CMakeLists.txt en mi directorio de datos que contiene lo siguiente:
configure_file(data_file ${CMAKE_CURRENT_BINARY_DIR}/data_file COPYONLY)
Esto copia el archivo especificado en el directorio de compilación cuando se invoca cmake, por lo que está disponible en la misma ubicación incluso en compilaciones fuera de origen.
Sin embargo, configure_file
no admite directorios, mientras que el comando de file
sí lo hace:
file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})