2010-04-21 30 views

Trả lời

8

Dưới đây là một ví dụ về cách để làm điều này ... Trước tiên, bạn cần phải tìm chương trình lzz, cho rằng sử dụng find_program lệnh:

find_program(LZZ_COMMAND lzz) 

này đặt LZZ_COMMAND đến đường dẫn của trình biên dịch. Sau đó sử dụng một lệnh tùy chỉnh CMake để biên dịch các tập tin LZZ để tiêu đề C++/file thực thi của họ:

add_custom_command(
    OUTPUT ${output} 
    COMMAND ${LZZ_COMMAND} -o ${CMAKE_CURRENT_BINARY_DIR} ${filename}) 

Đó tạo ra các tập tin trong thư mục build hiện tại, trong trường hợp bạn làm out-of-nguồn xây dựng. Bạn cũng sẽ cần phải xác định rằng các kết quả đầu ra được tập tin được tạo:

set_source_files_properties(${output} PROPERTIES GENERATED TRUE) 

Đặt rằng tất cả với nhau và bạn sẽ có được một cái gì đó tập tin CMakeLists.txt như thế này:

cmake_minimum_required(VERSION 2.8) 
project(lazy_test) 
find_program(LZZ_COMMAND lzz) 
function(lazy_compile filename) 
    get_filename_component(base ${filename} NAME_WE) 
    set(base_abs ${CMAKE_CURRENT_BINARY_DIR}/${base}) 
    set(output ${base_abs}.cpp ${base_abs}.h) 
    add_custom_command(
     OUTPUT ${output} 
     COMMAND ${LZZ_COMMAND} -o ${CMAKE_CURRENT_BINARY_DIR} ${filename}) 
    set_source_files_properties(${output} PROPERTIES GENERATED TRUE) 
endfunction() 
lazy_compile(${CMAKE_CURRENT_SOURCE_DIR}/example.lzz) 
add_executable(test example.cpp example.h) 

Bạn có lẽ cũng muốn thêm bao gồm đường dẫn và các tùy chọn khác để lzz cuối cùng. Nếu bạn đặt tất cả các công cụ Lazy C++ vào một tập tin mô-đun và bao gồm rằng từ CMakeLists.txt nó sẽ là một chút sạch hơn. Nhưng đây là ý tưởng cơ bản.

+0

Cảm ơn, đây chỉ là những gì tôi đang tìm kiếm. – jjacksonRIAB

+0

Khi CMake tạo dự án Visual Studio, example.cpp và example.h hiển thị trong trình khám phá giải pháp thay vì example.lzz. Có thể đảo ngược điều này không? – absence

+0

Nếu người ta thêm mệnh đề 'DEPEND $ {filename}' vào 'add_custom_command'-call thì các tệp nguồn sẽ tự động được tái tạo nếu các tệp lzz thay đổi. – Sunday

-1

Đối với thực hiện:

sourcecode.h sourcecode.cpp: sourcecode.lzz 
<TAB>lazy-cpp sourcecode.lzz 

điền vào sourcecode.h, sourcecode.cpp, và lười biếng-cpp với các giá trị chính xác. Tôi không biết họ.

+1

Tôi đánh giá cao sự trợ giúp, nhưng tôi đã hỏi cách thực hiện điều này bằng cmake. – jjacksonRIAB

+0

Lời xin lỗi của tôi. Tôi nghĩ cmake là một biến thể. Tôi nhìn nó lên, không phải. Cùng một cách tiếp cận cần thiết, cú pháp khác nhau. Mặc dù bạn có thể thực sự lười biếng và làm cho quá trình này phụ thuộc và gọi cmake. – Joshua

4

Tôi chỉ muốn chia sẻ CMakeLists.txt của mình, được xây dựng dựa trên tập lệnh richq. Các tệp * .cpp và * .hpp giờ đây phụ thuộc đúng vào các tệp * .lzz. Các tệp * .lzz được thêm vào dự án (câu trả lời cho câu hỏi của absense ở trên) nhưng được giữ riêng biệt với các tệp được tạo ra bằng cách sử dụng lệnh source_group.

Lệnh giao dịch còn lại duy nhất đối với tôi là không thể biên dịch tệp hiện tại cho các tệp * .lzz.

cmake_minimum_required(VERSION 2.8) 

PROJECT(LzzTest) 

find_program(LZZ_COMMAND lzz.exe) 

# Syntax: 
# add_lzz_file(<output> <lzz file>) 
# Adds a build rule for the specified lzz file. The absolute paths of the generated 
# files are added to the <output> list. The files are generated in the binary dir. 
# 
# TODO: Support for generating template files etc. 
function(add_lzz_file output filename) 
    # Only process *.lzz files 
    get_filename_component(ext ${filename} EXT) 
    if(NOT ext STREQUAL ".lzz") 
    return() 
    endif() 

    set(header_extension "hpp") 
    get_filename_component(base ${filename} NAME_WE) 
    set(base_abs ${CMAKE_CURRENT_BINARY_DIR}/${base}) 
    set(outfiles ${base_abs}.cpp ${base_abs}.${header_extension}) 
    set(${output} ${${output}} ${outfiles} PARENT_SCOPE) 

    #message("outfiles=${outfiles}, DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${filename}") 
    add_custom_command(
    OUTPUT ${outfiles} 
    COMMAND ${LZZ_COMMAND} 
     -o ${CMAKE_CURRENT_BINARY_DIR} # output dir 
     -hx ${header_extension} 
     -sl -hl -il -tl -nl -x # insert #line commands w/ absolute paths 
     -sd -hd -id -td -nd # don't output files that didn't change 
     ${CMAKE_CURRENT_SOURCE_DIR}/${filename} 
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${filename}" 
) 

    set_source_files_properties(${outfiles} PROPERTIES GENERATED TRUE) 
endfunction() 

include_directories(${CMAKE_CURRENT_BINARY_DIR}) 

set(SOURCES 
    A.lzz 
    B.lzz 
    main.cpp 
) 

foreach(file ${SOURCES}) 
    add_lzz_file(GENERATED_SOURCES ${file}) 
endforeach() 

source_group("" FILES ${SOURCES}) 
source_group(generated FILES ${GENERATED_SOURCES}) 

add_executable(LzzTest ${SOURCES} ${GENERATED_SOURCES}) 
Các vấn đề liên quan