web-dev-qa-db-fra.com

CMake vérifier qu'un fichier local existe

Dans mon script CMake, je veux voir si j'ai un fichier sur mon système, et s'il y est, faire quelque chose avec lui, sinon faire quelque chose avec un fichier par défaut. Voici le code:

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()

Mais il semble que cela ne fonctionne pas.

Quelle est la bonne façon de vérifier si un fichier existe dans CMake?

51
Ferenc Deak

La bonne façon de vérifier si un fichier existe, si vous connaissez déjà le nom complet du chemin d'accès au fichier est simplement:

if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
   ...
else()
   ...
endif()
123
DLRdave

Vous devriez pouvoir simplement utiliser

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

De la docs :

if(<constant>)

Vrai si la constante est 1, ON, YES, TRUE, Y ou un nombre non nul. False si la constante est 0, OFF, NO, FALSE, N, IGNORE, "" ou se termine par le suffixe "-NOTFOUND".

Cependant, si le fichier est trouvé en utilisant find_file , la valeur est mise en cache et les exécutions suivantes de CMake n'essaiera pas de le retrouver. Pour forcer une nouvelle vérification à chaque exécution, avant l'appel de find_file, Procédez comme suit:

unset(${project_name}_${customer}_config CACHE)
9
Fraser

Je pense que la if (EXISTS <path>) est une bonne solution. J'aimerais partager un scénario que j'ai rencontré récemment, bien que vous ne vous en soucierez probablement pas dans la plupart des cas.

Veuillez noter que cette solution ne retournera pas true si le fichier n'est pas accessible par l'utilisateur effectif. Le fichier existe, mais il n'est tout simplement pas lisible.

Une solution de contournement pour ce scénario si vous vous souciez de savoir si le fichier existe vraiment ou non, consiste à appeler execute_process(COMMAND ls /dev/fb0 RESULT_VARIABLE result OUTPUT_QUIET ERROR_QUIET) puis à vérifier le result comme ceci:

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

modifier : ajouter ERROR_QUIET dans execute_process ou vous obtiendrez des messages d'erreur de ls lorsque le fichier n'existe pas.

5
ZHANG Zikai