web-dev-qa-db-ja.com

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

51
Ferenc Deak

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

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

あなたはただ使用できるはずです

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

docs から:

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)
_
9
Fraser

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からエラーメッセージが表示されます。

5
ZHANG Zikai