En mi CMake script quiero ver si tengo un archivo en mi sistema, y si es que hay algo con ella, de lo contrario hacer algo con el archivo predeterminado. Aquí está el código:

find_file(
          ${project_name}_${customer}_config 
          ${ROOT}/configuration/${customer}/configuration.${project_name}.xml
)

if(NOT ${${project_name}_${customer}_config} STREQUAL
   ${project_name}_${customer}_config-NOTFOUND )
        configure_file(${ROOT}/configuration/${customer}/configuration.${project_name}.xml
                       ${CMAKE_CURRENT_BINARY_DIR}/conf/configuration.xml)
else()
    configure_file(${FAPP_ROOT}/configuration/Default/configuration.${project_name}.xml
                   ${CMAKE_CURRENT_BINARY_DIR}/conf/configuration.xml)
endif()

Pero parece que esto no va a funcionar.

Cuál es la forma correcta de comprobar si existe un archivo en CMake?

InformationsquelleAutor Ferenc Deak | 2012-10-25

3 Comentarios

  1. 128

    La forma correcta para comprobar si existe un archivo, si ya sabes el nombre de ruta completo del archivo es simplemente:

    if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
       ...
    else()
       ...
    endif()
    
    • documentación es aquí
    • Lamentablemente no, EXISTS no hace lo que dice. Si el archivo desprotegido no puede ser leído o escrito, se devuelve falso, a pesar de que el archivo es visible. Este es un triste error, porque esto a veces puede ser útil, como la existencia de un determinado archivo de dispositivo.
    • curiosamente este simple comando no funciona para cualquier archivo que creo :/
    • Puede usted dar un ejemplo que no funciona? ¿Hay algún tipo de condición de carrera donde el archivo es, posiblemente, creado poco después de tratar de utilizar el EXISTE prueba?
    • Para la última cmake (al menos 3.14+) esta es la respuesta incompleta. Tiene, además, la prueba en ruta de directorio: if (EXISTS "..." AND NOT IS_DIRECTORY "...") mientras EXISTS devuelve true en caso de directorios también!
    • Este es un punto válido. Ha sido el caso de ir de nuevo a por lo menos CMake 3.0, if (EXISTS "...") devolverá true si el archivo O directorio existe. Aquí están las docs.

  2. 9

    Usted debería ser capaz de simplemente utilizar

    if(NOT ${project_name}_${customer}_config)
    

    De la docs:

    if(<constant>)

    True si la constante es 1, EN, SÍ, es CIERTO, Y, o un número distinto de cero. False si la constante es 0, DESACTIVADO, NO, FALSO, N, IGNORAR, «», o terminan en el sufijo «- NOTFOUND’.

    Sin embargo, si el archivo es encuentra utilizando find_file, el valor se almacena en la caché, y posteriores ejecuciones de CMake no van a tratar de encontrarlo de nuevo. A fuerza de un volver a comprobar en cada carrera, antes de la find_file llamada:

    unset(${project_name}_${customer}_config CACHE)
    
  3. 6

    Creo que la if (EXISTS <path>) es una buena solución. Me gustaría compartir un escenario recientemente he encontrado, aunque probablemente usted no se preocupa por esta situación en la mayoría de los casos.

    Por favor, tenga en cuenta que esta solución no devolverá true si el archivo no es accesible por el usuario efectivo. El archivo no existe, pero simplemente no es legible.

    Una solución para esta situación si se preocupan acerca de si el archivo existe realmente o no, es llamar a execute_process(COMMAND ls /dev/fb0 RESULT_VARIABLE result OUTPUT_QUIET ERROR_QUIET) y, a continuación, compruebe la result como este:

    if (result)
        message("/dev/fb0 doesn't exist.")
    endif()
    

    editar: añadir ERROR_QUIET en execute_process o usted recibirá los mensajes de error de ls cuando el archivo no existe.

Dejar respuesta

Please enter your comment!
Please enter your name here