2012-10-25 19 views
32

私のCMakeスクリプトで私は自分のシステムにファイルがあるかどうかを確認したいのですが、それがあれば何かをするか、そうでなければデフォルトファイルで何かを行います。ここにコード:CMakeローカルファイルが存在することを確認してください

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

しかし、これは動作していないようです。

ファイルがCMakeに存在するかどうかを確認する適切な方法は何ですか?

答えて

89

適切な方法は、チェックすることは、単純です:

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

[こちらのドキュメントはこちら](https://cmake.org/cmake/help/v3.5/command/if.html?highlight=EXISTS) – teivaz

7

あなただけdocsから

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

を使用することができるはずです:定数は、YES、ON、Y TRUE 1であれば

if(<constant>)

真、または非ゼロの数。定数が0、OFF、NO、FALSE、N、IGNORE、 ""、または接尾辞 '-NOTFOUND'で終わる場合はFalseです。ファイルfind_file使用したある場合

しかし、値がキャッシュされ、CMakeのその後の実行は再びそれを見つけようとしません。 find_file呼び出しの前に、すべての実行時に再チェックを強制的に実行します。ファイルが存在する場合は、既にファイルへのフルパス名を知っていれば

unset(${project_name}_${customer}_config CACHE) 
2

私はif (EXISTS <path>)が良い解決策であると信じています。私は最近遭遇したシナリオを共有したいと思いますが、ほとんどの場合このシナリオには気にしません。

有効なユーザーがファイルにアクセスできない場合、このソリューションはtrueを返しません。ファイルは存在しますが、読み込みができません。

このシナリオの回避策は、ファイルが実際に存在するかどうかを気にしない場合、execute_process(COMMAND ls /dev/fb0 RESULT_VARIABLE result OUTPUT_QUIET ERROR_QUIET)を呼び出してから、このようresultをチェックすることです:

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

編集execute_processERROR_QUIETを追加したり、ファイルが存在しない場合は、lsからエラーメッセージが表示されます。

関連する問題