2012-10-25 32 views
32

Trong tập lệnh CMake của tôi, tôi muốn xem liệu tôi có tệp trên hệ thống của mình không và nếu có thì hãy làm gì đó với tệp mặc định. Đây là mã:CMake kiểm tra xem tệp cục bộ có tồn tại

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

Nhưng có vẻ như, điều này không hoạt động.

Cách thích hợp để kiểm tra xem tệp có tồn tại trong CMake không?

Trả lời

89

Cách thích hợp để kiểm tra xem một tập tin tồn tại, nếu bạn đã biết tên đường dẫn đầy đủ đến tập tin chỉ đơn giản là:

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

[tài liệu ở đây] (https://cmake.org/cmake/help/v3.5/command/if.html?highlight=EXISTS) – teivaz

7

Bạn sẽ có thể chỉ cần sử dụng

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

Từ docs:

if(<constant>)

True nếu hằng số là 1, ON, YES, TRUE, Y, hoặc một số khác không. Sai nếu hằng số là 0, OFF, NO, FALSE, N, IGNORE, "" hoặc kết thúc ở hậu tố '-NOTFOUND'.

Tuy nhiên, nếu tập tin tìm thấy bằng find_file, giá trị được lưu trữ, và chạy tiếp theo của CMake sẽ không cố gắng để tìm thấy nó một lần nữa. Để buộc một kiểm tra lại trên mỗi chạy, trước khi find_file gọi làm:

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

Tôi tin rằng if (EXISTS <path>) là một giải pháp tốt. Tôi muốn chia sẻ một kịch bản gần đây tôi gặp phải, mặc dù bạn có thể sẽ không quan tâm đến kịch bản này trong hầu hết các trường hợp.

Xin lưu ý, giải pháp này sẽ không trả lại đúng nếu người dùng hiệu quả không thể truy cập tệp. Tệp này không tồn tại, nhưng nó không thể đọc được.

Có thể chỉnh lại kịch bản này nếu bạn quan tâm về việc liệu các tập tin thực sự tồn tại hay không, là để gọi execute_process(COMMAND ls /dev/fb0 RESULT_VARIABLE result OUTPUT_QUIET ERROR_QUIET) và sau đó kiểm tra result như thế này:

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

chỉnh sửa: thêm ERROR_QUIET trong execute_process hay bạn sẽ nhận được thông báo lỗi từ ls khi tệp không tồn tại.