2010-01-28 44 views
6

Trong CMake, tôi đang cố gắng xây dựng một dự án bao gồm các thư viện cho nhiều kiến ​​trúc xử lý khác nhau, được biên dịch bởi các công cụ khác nhau. Đối với mỗi kiến ​​trúc, các thư viện tĩnh được xây dựng trong nhiều thư mục con, và sau đó được thu thập vào một thư viện được chia sẻ trong thư mục gốc. Cho đến nay, tôi đã không thể tìm ra điều này.CMake add_custom_command/_target trong các thư mục khác nhau để biên dịch chéo

Gần nhất tôi đã đi cho đến nay là sử dụng add_custom_commandadd_custom_target trong các thư mục con để tạo tệp .a và sau đó cố gắng thu thập chúng thành một .so trong thư mục gốc sử dụng add_custom_commandadd_custom_target một lần nữa. Nhưng nếu tôi làm cho điểm phụ thuộc .so vào danh sách các đầu ra lệnh tùy chỉnh, makefile nói "Không có quy tắc để tạo ..." bởi vì các đầu ra lệnh tùy chỉnh không được xuất ra khỏi thư mục con. Vì vậy, tôi đã cố gắng tạo điểm .so phụ thuộc vào danh sách các mục tiêu tùy chỉnh trong thư mục con và nó phàn nàn rằng nó không thể tìm thấy tệp có tên đó.

Để đặt nó ở dạng mã, đây là những gì tôi có trong thư mục con:

add_custom_command(OUTPUT subout.a COMMAND ${MYAR} ...) 
add_custom_target(subout_target DEPENDS subout.a) 

Trong thư mục gốc, tôi đã cố gắng này:

add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS sub/subout.a) 
add_custom_target(dll ALL DEPENDS my.so) 

Và tôi nhận được "Không có quy tắc để đặt mục tiêu 'sub/subout.a', cần thiết bởi 'my.so'. Dừng lại. " Điều này có ý nghĩa vì mục tiêu add_custom_command không được xuất ra khỏi thư mục.

Và tôi đã cố gắng này:

add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS subout_target) 
add_custom_target(dll ALL DEPENDS my.so) 

Điều này thực sự sẽ gây ra các tập tin phụ/subout.a được tạo ra, nhưng sau đó nó bị chết, nói rằng "Không có quy tắc để thực hiện mục tiêu 'subout_target' ..."

Tôi nghĩ những gì tôi thực sự muốn là có thể bắt chước hành vi add_library cho nhiều kiến ​​trúc khác nhau. Nhưng rõ ràng, CMake không muốn tôi làm điều đó ... :)

Bất kỳ ý tưởng nào?

Trả lời

7

Tôi giả sử bạn cần sử dụng add_dependencies để xác định các phụ thuộc giữa các mục tiêu được xác định bằng cách sử dụng add_custom_target. Tùy chọn DEPENDS được sử dụng để chỉ định phụ thuộc cấp tệp trong quy tắc tùy chỉnh nhưng không phụ thuộc vào mức độ phụ thuộc mục tiêu.

Ví dụ: tạo lệnh .obj tệp dưới dạng đầu ra sử dụng DEPENDS để chỉ định tệp phụ thuộc vào tệp .cpp. Ngoài ra, một mục tiêu có thể phụ thuộc vào một tệp duy nhất, không chỉ trên các mục tiêu khác. Vì vậy, đối với phụ thuộc cấp tệp, hãy sử dụng tùy chọn DEPENDS, nhưng add_dependencies cho cấp mục tiêu.

+1

Điều đó hoàn toàn cố định. Cảm ơn nhiều. Bạn đã cứu tôi rất nhiều thất vọng. – boiler96

+1

Tôi rất vui và được chào đón! – mloskot

1

Spot On!

add_dependencies cho phép tôi để tạo ra các 'liên kết' thức sự phụ thuộc giữa add_custom_target mục tiêu tạo ra, và add_custom_target tạo ra các chỉ tiêu cần thiết để có được add_custom_command để tạo ra nội dung thực sự trong makefile, tức là, add_custom_command My sẽ không tạo đầu ra cho makefiles trừ khi OUTPUT 's từ add_custom_command được quy định như phụ thuộc vào add_custom_target lệnh.

Sau đó, để có được những add_custom_command 's để thực hiện theo đúng thứ tự, tôi đã phải sử dụng các tên đối tượng quy định tại các add_custom_target' s như phụ thuộc vào add_dependencies. LƯU Ý: Các OUTPUT 's được ghi rõ trong add_custom_commandadd_custom_target lệnh phải được quy định trong các nẻo trích dẫn riêng biệt, ví dụ:

add_custom_command(OUTPUT "out1 out2 out3" ...) # WRONG! 
add_custom_target(CUSTOMTARG1 "out1 out2 out3") # WRONG! 

add_custom_command(OUTPUT "out1" "out2" "out3" ...) # RIGHT! 
add_custom_target(CUSTOMTARG1 "out1" "out2" "out3") # RIGHT! 

Nếu tôi không có họ trong các nẻo trích dẫn riêng biệt, makefile xây dựng các kết quả đầu ra mỗi lần bất kể chúng tồn tại hay không!

+0

có thể đã diễn giải "out1 out2 out3" dưới dạng một tệp duy nhất có dấu cách trong tên. Vì quy tắc của bạn không tạo tệp đó, nên việc tạo sẽ luôn chạy. – Penz

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