2015-07-23 22 views

Trả lời

4

(Xin lưu ý rằng tôi đã thay đổi câu trả lời của tôi sau khi điều tra vấn đề này vì bình luận Florian. Thông tin thêm về chỉnh sửa dưới đây)

Các tài liệu của execute_process nêu rõ rằng nó không sử dụng vỏ trung gian, vì vậy chuyển hướng các nhà khai thác không hoạt động ở đó.

Nhưng điều này không đúng đối với add_custom_command. Chuyển hướng sẽ hoạt động ở đó như mong đợi. [EDIT] Lý do đôi khi nó dường như không hoạt động là một số sự kết hợp không may của máy phát điện CMake, thông số VERBATIM và khoảng trống (thiếu) giữa > và tên tệp.

Hóa ra nếu bạn chắc chắn rằng có một khoảng trống giữa > và tên tập tin nó làm việc với trong hầu hết các trường hợp, ngay cả với VERBATIM:

add_custom_command(OUTPUT ${some-file} 
    COMMAND cmake --version > ${some-file} 
    VERBATIM # optional 
) 

Lưu ý về một giải pháp thay thế: trước đây Tôi nghĩ rằng add_custom_command, giống như execute_process không sử dụng trình bao trung gian nên tôi đã đề xuất gọi một tập lệnh CMake có chứa lệnh execute_process chạy lệnh thực, chuyển hướng kết quả của nó bằng tùy chọn OUTPUT_FILE.

Nếu vì một số lý do giải pháp trên vẫn không cho bạn, hãy thử các giải pháp thay thế việc sử dụng một ExecuteProcessWrapper.cmake

+3

Tôi nghĩ rằng việc thực hiện các lệnh tùy chỉnh CMake có thể là nền tảng phụ thuộc. Bạn có thể thêm một ví dụ trong đó lệnh tùy chỉnh không sử dụng trình bao trung gian không? Tôi đã sử dụng thành công chuyển hướng stdout/stderr với các trình tạo Ninja và Visual Studio. Những máy phát điện này làm tiền tố 'cmd.exe/c' cho các lệnh tùy chỉnh trên Windows. Và các lệnh đường ống được kiểm tra trong [kiểm tra đơn vị lệnh tùy chỉnh] của CMake (https://github.com/Kitware/CMake/blob/master/Tests/CustomCommand/CMakeLists.txt#L231). – Florian

+0

@ Florian, bạn nói đúng, tôi đã sai. Tôi đang sửa câu trả lời của mình. –

+1

Tôi đã tìm thấy chuỗi đó trên diễn đàn của nhà phát triển CMake: http://cmake.3232098.n2.nabble.com/Redirect-output-from-add-custom-target-td7583901.html. Họ viết, chuyển hướng trong 'add_custom_target()' có thể không hoạt động trong một số trường hợp. Từ phía bên kia, cả hai 'add_custom_command()' và 'add_custom_target()' chấp nhận tùy chọn 'VERBATIM', không có sence cho đến khi shell được tham gia. Ngược lại, 'execute_process()' không chấp nhận tùy chọn đó và có nhận xét rõ ràng về chuyển hướng. Vì vậy, nơi nó là sự thật? – Tsyvarev

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