2012-10-16 33 views
5

Tôi có một dự án CMake với nhiều tiểu dự án. Mỗi người trong số họ có thể sử dụng một hàm tôi cung cấp để tạo một tệp văn bản nhỏ với một số thông tin nhất định (bằng cách gọi add_custom_command). Ở bước cuối cùng, tôi muốn kết hợp tất cả các tệp đó thành một tệp văn bản lớn.CMake: thêm phụ thuộc vào add_custom_command động

Tôi đã tạo lệnh tùy chỉnh tìm kiếm tệp được tạo (tất cả ở một nơi) và hợp nhất chúng.

Vấn đề là tôi muốn thực hiện bước cuối cùng này phụ thuộc vào tất cả các bước nhỏ được thực hiện trong các dự án con trong khi tôi thực sự không biết có bao nhiêu tệp sẽ được cung cấp.

lệnh cuối cùng của tôi trông giống như:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/) 

và tôi tạo-nhỏ-text-file-for-each-TDA lệnh trông giống như:

add_custom_command(OUTPUT /path/${sub_project_name}.txt 
        COMMAND create /path/${sub_project_name}.txt) 

Và khi tôi tạo ra các tập tin nhỏ Tôi muốn làm điều gì đó giống như để tạo "combination.txt" phụ thuộc vào /path/${sub_project_name}.txt

Vì vậy, tôi ước tôi có thể:

add_dependency(combination.txt /path/${sub_project_name}.txt) 

Tuy nhiên, điều này chỉ hoạt động cho các mục tiêu.

Tôi cũng đã cố gắng sử dụng set_source_files_properties với OBJECT_DEPENDS, nhưng nó dường như không hoạt động (có thể nó có ý định sẽ được sử dụng với các tập tin cpp add_target không?)

Cách cuối cùng để có được nó làm việc tôi thấy là để sử dụng biến bộ nhớ cache sẽ tích lũy tất cả các đường dẫn tệp nhỏ đó và sau đó sử dụng nó như sau:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/ 
        DEPENDS ${all_small_files_list}) 

nhưng đây là điều cuối cùng tôi muốn làm.

Trả lời

4

Thay vì sử dụng add_custom_command bạn có thể sử dụng add_custom_target với định nghĩa phụ thuộc chính xác (do đó không phải lúc nào cũng được xây dựng).

add_custom_target(project 
        COMMAND touch project.txt) 

add_custom_target(project2 
        COMMAND touch project2.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 

add_dependencies(combination project2) 
add_dependencies(combination project) 

add_executable(t t.c) 
add_dependencies(t combination.txt) 

Một lần nữa: chắc chắn rằng bạn đang sử dụng DEPENDS đối số của add_custom_target để tạo ra một chuỗi sự phụ thuộc thực tế để một dự án mục tiêu và do đó sự kết hợp mục tiêu được hết hiệu lực.

CẬP NHẬT: Tôi còn quá sớm. Trong thực tế cmake (ít nhất là lên đến 2.8.9) hoạt động như sau cho phụ thuộc: với một cuộc gọi đến add_dependencies bạn không thể thêm một phụ thuộc là OUTPUT của một lệnh tùy chỉnh IOW một (được tạo) tệp. Với add_dependencies bạn chỉ có thể thêm target như được tạo bởi add_custom_target. Tuy nhiên, trong một add_custom_target, bạn có thể phụ thuộc vào đầu ra của add_custom_command bằng cách sử dụng DEPENDS -directive. Điều đó nói rằng điều này làm cho nó hoạt động:

add_custom_command(OUTPUT project.txt 
        COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c) 
add_custom_target(project DEPENDS project.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 
add_dependencies(combination project) 

này sẽ làm cho mục tiêu kết hợp luôn được tái sinh như nó không có MAIN_DEPENDENCY hoặc DEPENDS, nhưng việc sử dụng add_dependencies được cho phép.

+0

Nó sẽ hoạt động nhưng không chính xác như mong đợi: Mỗi khi tôi gọi, tất cả các mục tiêu (kết hợp, dự án và dự án 2) sẽ được xây dựng lại - vì vậy các tệp sẽ được regenrated. Đây không phải là tốt đẹp như nó có thể được;) Hành vi mong đợi đối với tôi là không tái tạo bất kỳ tệp nào trừ khi cần thiết. Theo tài liệu của CMake - add_custom_target đang được xây dựng mọi lúc. Tôi ước tôi có một giải pháp làm việc như add_custom_command - chỉ xây dựng khi bất kỳ sự phụ thuộc nào thay đổi. –

+0

Bạn sử dụng điều gì làm phụ thuộc để tạo project.txt? Tôi _think_ những gì cmake-doc muốn nói là, một custom_target luôn được kiểm tra xem nó có được xây dựng lại hay không - ít nhất nó dường như hoạt động như thế đối với tôi. –

+0

Vâng, sau khi đọc một số thích hợp làm thế nào chúng ta làm điều đó, tôi phải thừa nhận rằng tôi đã quá sớm. Xem cập nhật của tôi về câu trả lời. –