2012-10-25 34 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

你應該能夠只使用

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

docs

if(<constant>)

真要是常數爲1,ON,YES,TRUE,Y或非零數字。如果常量爲0,OFF,NO,FALSE,N,IGNORE,「」,或以後綴'-NOTFOUND'結尾,則爲假。

但是,如果該文件使用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_process添加ERROR_QUIET或當文件不存在時,您將收到來自ls的錯誤消息。