2010-08-07 7 views
17

Tengo un proyecto CMake que contiene código y algunos archivos de datos (imágenes para ser precisos).¿Cómo manejar mejor los archivos de datos con CMake?

Mi estructura de directorios es la siguiente:

  • src
  • datos

src contiene el código fuente, los datos de los archivos de datos. CMake sugiere construcciones de origen, así que cuando invoco haga, tengo el programa ejecutable, pero no los archivos de datos, por lo tanto no puedo ejecutar el programa.

Por supuesto, hacen instalar sería copiar mis archivos de datos a la ubicación deseada y hacer que funcione, por lo tanto, se desarrollan como esto ahora: -DCMAKE_INSTALL_DIR

  1. cmake = dist
  2. <edit source code>
  3. hacen instalar
  4. dist/MyProgram.EXE

Está bien si estoy trabajando con la línea de comandos y un editor, pero recientemente decidí pasar a Eclipse CDT. Generar un proyecto de Eclipse desde CMake funciona muy bien, pero ejecutar manualmente el instalar el objetivo de Eclipse no es tan agradable.

¿Cómo pueden las personas abordar este problema? ¿Su programa tiene algunos algoritmos inteligentes para tratar de encontrar su directorio de datos, incluso si no está donde está el binario? ¿O no usas construcciones fuera de la fuente?

Respuesta

16

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 construcción cuando se invoca cmake, por lo que está disponible en el mismo lugar, incluso en construcciones fuera de la fuente.

configure_file no admite directorios Sin embargo, mientras que el comando file hace:

file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) 
+3

tengo que hacerlo para cada archivo por separado – Arne

+2

usar archivo '(activos destino de la copia $ {CMAKE_CURRENT_BINARY_DIR})' – WarmWaffles

11

Y si la copia de los archivos tarda mucho tiempo (son imágenes ...) que podría hacerlo aún mejor mediante la creación de un " "data_header.h" personalizado con archivo_configuración que contiene las rutas a los datos aún en su directorio-fuente.

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 = "@[email protected]"; 

y luego usar 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/) 

Entonces puedo # incluir "Global_Build_Config.h" en mis archivos cpp y referirme a la ruta fija.

+0

debe tener en cuenta que esta marca de envasado del proyecto mucho más complicado, ya que para una formación de la bobina cmake tiene que ejecutarse nuevamente, sin mencionar el código extremo que tiene que escribir. – Arne

2

su pregunta es un poco viejo, pero en caso de que todavía está interesado (u otra persona), tengo un escenario similar en el que copio testdata para un objetivo de unidad de prueba:

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 La idea principal es usar un objetivo posterior a la construcción, y se ejecuta después de cada compilación. Para mí, no son demasiados datos, y el sistema de archivos lo almacena en caché, por lo que no siento el proceso de copia en absoluto. Probablemente pueda mejorar esto copiando con copy_if_different. En ese caso, sin embargo, debe crear una lista de sus archivos de imagen y escribir un bucle, porque el comando está basado en archivos. Con el comando GLOB, esto no debería ser difícil si lo necesita.

Cuestiones relacionadas