2014-09-05 16 views
7

Tôi đang cố gắng để có CMake hoặc chạy ba lệnh bash hoặc một tập lệnh bash. Tuy nhiên, tôi không thể làm cho nó hoạt động được.Chạy lệnh bash qua CMake

Các lệnh bash là:

cd ${CMAKE_SOURCE_DIR}/dependencies/library 
    make 
    cd ${CMAKE_BINARY_DIR} 

Về cơ bản, tôi muốn CMake để xây dựng thư viện trong thư mục đó nếu nó chưa tồn tại.

Dưới đây là đoạn code CMake tôi đã cố gắng:

if(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 
    execute_process(COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/library) 
    execute_process(COMMAND make) 
    execute_process(COMMAND cd ${CMAKE_BINARY_DIR}) 
endif(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 

Tuy nhiên, nó không được xây dựng bất cứ điều gì. Tôi đang làm gì sai?

Ngoài ra, trong khi tôi ở đây yêu cầu điều này: lệnh thứ ba, để chuyển sang thư mục nhị phân, có được bao gồm không?

Cảm ơn!

+3

Trước hết, tại sao bạn không sử dụng tham số 'WORKING_DIRECTORY' thay vì các lệnh' cd'? Cái gì đó như 'execute_process (COMMAND make WORKING_DIRECTORY $ {CMAKE_SOURCE_DIR}/dependencies/library)'. Tôi cho rằng, các cuộc gọi 'execute_process()' không chia sẻ cùng một môi trường. Ngoài ra, nếu tôi là Bạn, tôi sẽ xem ['add_custom_target()'] (http://www.cmake.org/cmake/help/v3.0/command/add_custom_target.html?highlight=add_custom_target) và ['add_custom_command()'] (http://www.cmake.org/cmake/help/v3.0/command/add_custom_command.html?highlight=add_custom_command) cho loại điều này. – Kamiccolo

+1

Tôi không thể bình luận về hầu hết những gì @Kamiccolo nói nhưng tôi có thể nói rằng tôi nghĩ rằng các chi tiết về 'execute_process' không chia sẻ nhà nước gần như chắc chắn là chính xác. Đó là * cực kỳ * có khả năng là 'cd' trong lệnh đầu tiên chỉ thay đổi thư mục cho quá trình đó và không cho bất kỳ thư mục nào khác. –

+1

Nếu bạn có ý định xây dựng một thư viện của bên thứ ba, có lẽ bạn nên sử dụng mô-đun [ExternalProject] (http://www.cmake.org/cmake/help/v3.0/module/ExternalProject.html). – sakra

Trả lời

11

execute_process() được thực hiện trong thời gian định cấu hình. Nhưng bạn muốn điều này chạy vào thời gian xây dựng, do đó, add_custom_command()add_custom_target() là những gì bạn đang tìm kiếm.

Trong trường hợp đặc biệt này, bạn muốn tạo ra một tập tin đầu ra, vì vậy bạn nên đi cho add_custom_command() (cả hai đều là về cơ bản giống nhau, nhưng command sản xuất một hoặc nhiều file đầu ra, trong khi target không.

Đoạn cmake cho điều này nên trông giống như sau:

add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/dependencies/library/lib.o 
    WORKING_DIR ${CMAKE_SOURCE_DIR}/dependencies/library 
    COMMAND make 
) 

sau đó bạn phải thêm các tập tin đầu ra trong mục tiêu khác như phụ thuộc, và tất cả mọi thứ nên (hy vọng) làm việc như mong đợi

.

Bạn cũng có thể thêm các câu lệnh DEPENDS vào cuộc gọi add_custom_command() để xây dựng lại tệp đối tượng trong trường hợp một số nguồn đầu vào đã thay đổi.

Các vấn đề liên quan