2013-04-12 24 views
17

Tôi có một lệnh tùy chỉnhCMake: Làm thế nào để chạy một add_custom_command trước khi mọi thứ khác

add_custom_command(
    OUTPUT config.h 
    PRE_BUILD 
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_config_h.py ${CMAKE_CURRENT_BINARY_DIR}/config.h 
) 

Tôi đang cố gắng để chạy nó trước khi mọi thứ khác và tôi tạo unix Makefiles.

Tuy nhiên PRE_BUILD chỉ được hỗ trợ cho VS2010 có nghĩa là config.h được tạo trước khi liên kết.

làm cách nào để tạo lệnh tùy chỉnh trước khi bắt đầu tạo các nguồn biên dịch.

+1

là các tập tin đầu ra từ lệnh tùy chỉnh của bạn (ví dụ config.h) được sử dụng như một tập tin nguồn trong một mục tiêu CMake (tức là trong danh sách các nguồn truyền qua 'add_executable' hoặc 'add_library')? Nếu vậy, bạn không cần phải lo lắng về thứ tự thực hiện - CMake sẽ gọi lệnh tùy chỉnh và khi được yêu cầu. – Fraser

Trả lời

28

Bạn nên sử dụng add_custom_target thay vào đó và add_dependencies để làm cho mục tiêu bình thường của bạn phụ thuộc vào nó:

add_custom_target(
    myCustomTarget 
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_config_h.py ${CMAKE_CURRENT_BINARY_DIR}/config.h 
) 
add_dependencies(myTarget myCustomTarget) 

này phải đảm bảo rằng các lệnh được chạy trước khi biên soạn các nguồn myTarget.

+0

Nó đã cho tôi một thời gian mà add_custom_target là tốt hơn cho chạy một thực thi hơn add_custom_command. Cảm ơn bạn vì giải pháp đó! – Anonymous

1

Hệ thống xây dựng thông thường dựa trên makefiles không cần phải đề cập đến tiêu đề như là một phần của mục tiêu. Hơn nữa, thêm tiêu đề để nhắm mục tiêu được coi là một antipattern. Nhưng tạo ra một tiêu đề là một ngoại lệ từ quy tắc này.

http://voices.canonical.com/jussi.pakkanen/2013/03/26/a-list-of-common-cmake-antipatterns/

Bạn nên đặt ${CMAKE_CURRENT_BINARY_DIR}/config.h của bạn như là một phần của một số mục tiêu compilled khác. Ví dụ:

set(PROGRAM1_SOURCES main_program1.cpp) 
set(PROGRAM1_HEADERS main_program1.h ${CMAKE_CURRENT_BINARY_DIR}/config.h) 
add_executable(program1 ${PROGRAM1_SOURCES} ${PROGRAM1_HEADERS}) 

Vì vậy mà, CMake sẽ biết được nhắm mục tiêu thực sự cần tạo config.h và sẽ có thể chèn các lệnh hệ vào quyền xây dựng bước.

Ngoài ra, xem một ví dụ tại https://cmake.org/cmake-tutorial/#s5

+2

Bạn cần tiêu đề nếu bạn muốn phân tích mã từ các IDE khác nhau để hoạt động. – ZeroPhase

+0

@zerophase, tôi đồng ý. Các tệp dự án cho IDE thường cần tham chiếu đến tất cả các tệp của dự án. Nhưng cmake có thể xây dựng dự án mà không cần tệp tiêu đề. – Piroxiljin

+0

Oh chắc chắn. Chỉ các tiêu đề thường sẽ phải được thêm vào để hỗ trợ những người dùng cuối khác nhau. – ZeroPhase

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