78

私の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にファイルが存在するかどうかを確認する適切な方法は何ですか?

4

4 に答える 4

172

ファイルへのフルパス名がすでにわかっている場合、ファイルが存在するかどうかを確認する適切な方法は次のとおりです。

if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
   ...
else()
   ...
endif()
于 2012-10-26T14:59:52.773 に答える
9

あなたはただ使うことができるはずです

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

ドキュメントから:

if(<constant>)

定数が1、ON、YES、TRUE、Y、またはゼロ以外の数値の場合はTrue。定数が0、OFF、NO、FALSE、N、IGNORE、 ""の場合、または接尾辞'-NOTFOUND'で終わる場合はFalse。

ただし、を使用してファイル見つかった場合find_file、値はキャッシュされ、その後のCMakeの実行ではファイルの検索は再試行されません。find_file呼び出しの前に、実行ごとに再チェックを強制するには、次のようにします。

unset(${project_name}_${customer}_config CACHE)
于 2012-10-25T12:29:42.263 に答える
7

私はそれ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()

編集:追加ERROR_QUIETexecute_processないと、ファイルが存在しない場合にlsからエラーメッセージが表示されます。

于 2016-06-16T03:49:10.220 に答える
4

条件構文ドキュメントから:

if(EXISTS path-to-file-or-directory)

指定されたファイルまたはディレクトリが存在する場合はTrue。動作は、フルパスに対してのみ明確に定義されています。シンボリックリンクを解決します。つまり、指定されたファイルまたはディレクトリがシンボリックリンクの場合、シンボリックリンクのターゲットが存在する場合はtrueを返します。

探しているファイルが現在のcmakelist-file内にある場合、1つの解決策は次のようになります。

if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE_WORKING_ON}) ..。

于 2019-12-30T09:45:07.770 に答える