2010-05-30 34 views
36

Tôi đang cố sử dụng add_custom_command để tạo tệp trong khi tạo. Lệnh này dường như không bao giờ được chạy, vì vậy tôi đã thực hiện tệp thử nghiệm này.CMake add_custom_command không được chạy

cmake_minimum_required(VERSION 2.6) 

add_custom_command(
    OUTPUT hello.txt 
    COMMAND touch hello.txt 
    DEPENDS hello.txt 
) 

Tôi cố gắng chạy:

cmake . 
make 

Và hello.txt chưa được tạo. Tôi đã làm gì sai?

+0

add_custom_target [can] (http://stackoverflow.com/a/15973676/704244) là một thay thế cho add_custom_command –

Trả lời

23

Thêm dòng sau:

add_custom_target(run ALL 
    DEPENDS hello.txt) 

Nếu bạn đã quen thuộc với makefiles, điều này có nghĩa là:

all: run 
run: hello.txt 
+0

Tính năng này không hoạt động, đối với tôi, CMake 3.6.1, OSX. Tôi đã làm như sau trong CMakeLists.txt tôi 'add_custom_command ( OUTPUT hello.txt COMMAND lạc ARGS hello.txt TÙY THUỘC hello.txt ) 'và thêm' add_custom_target (chạy ALL TÙY THUỘC hello.txt ) ' – linello

+0

' add_custom_target' được chạy mỗi lần, sử dụng 'add_custom_command' như được chủ trương bởi Rian thay vì –

+0

@linello Loại bỏ DEPENDS khỏi lệnh' add_custom_command() 'của bạn, nó tạo ra một phụ thuộc vòng tròn. Chỉ 'add_custom_target()' mới có đối số DEPENDS ở đây. Nó làm việc cho tôi trên OS X khi bạn sửa lỗi đó (thử nghiệm với CMake 3.8.0). –

40

Giải pháp add_custom_target(run ALL ... sẽ làm việc đối với trường hợp đơn giản khi bạn chỉ có một mục tiêu mà bạn đang xây dựng, nhưng bị phá vỡ khi bạn có nhiều mục tiêu cấp cao nhất, vd ứng dụng và thử nghiệm.

Tôi gặp phải vấn đề tương tự khi tôi cố gắng đóng gói một số tệp dữ liệu thử nghiệm thành tệp đối tượng để kiểm tra đơn vị của tôi sẽ không phụ thuộc vào bất kỳ thứ gì bên ngoài. Tôi đã giải quyết nó bằng cách sử dụng add_custom_command và một số phép thuật phụ thuộc bổ sung với set_property.

add_custom_command(
    OUTPUT testData.cpp 
    COMMAND reswrap 
    ARGS testData.src > testData.cpp 
    DEPENDS testData.src 
) 
set_property(SOURCE unit-tests.cpp APPEND PROPERTY OBJECT_DEPENDS testData.cpp) 

add_executable(app main.cpp) 
add_executable(tests unit-tests.cpp) 

Vì vậy, bây giờ testData.cpp sẽ được tạo trước khi đơn vị-tests.cpp được biên soạn và bất kỳ thay đổi testData.src nào. Nếu lệnh bạn đang gọi thực sự chậm, bạn sẽ nhận được phần thưởng thêm khi bạn xây dựng chỉ mục tiêu ứng dụng, bạn sẽ không phải chờ đợi cho lệnh đó (chỉ các nhu cầu thực thi kiểm tra) mới kết thúc.

Nó không được hiển thị ở trên, nhưng việc áp dụng cẩn thận ${PROJECT_BINARY_DIR}, ${PROJECT_SOURCE_DIR} and include_directories() sẽ giữ cho cây nguồn của bạn sạch các tệp được tạo.

+4

Khoảnh khắc khó xử này khi câu trả lời hay nhất không phải là câu trả lời có biểu tượng kiểm tra màu xanh lá cây :) Cảm ơn Rian! –

+2

Không nên 'add_dependencies' có thể làm công việc của' set_property (... 'dòng? – dom0

+0

Có rất nhiều điều tốt khác về cmake. Một trong những điều chính mà tôi thực sự thích là các máy phát điện (Makefiles, các tệp ninja, Visual Studio, Eclipse, v.v.) Ngôn ngữ của CMake không được phát triển như ngôn ngữ lập trình cấp cao thông thường, nhưng nó rất dễ dàng khi bạn bị treo trong một vài giờ. Hãy suy nghĩ về điều này: Tại sao có rất nhiều người sử dụng cmake thay vì autotools? Nó dễ dàng hơn để tìm hiểu và cung cấp nhiều lợi ích hơn nữa –

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