2010-04-21 8 views

Antwort

8

ist ein Beispiel dafür, wie dies zu tun ... Zuerst müssen Sie die lzz Programm finden, denn das ist die find_program Befehl verwenden:

find_program(LZZ_COMMAND lzz) 

Dies setzt LZZ_COMMAND auf den Pfad des Compilers. Dann mit einem CMake benutzerdefinierten Befehl der LZZ Datei an ihre C++ Header/Implementierungsdateien kompilieren:

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

, dass die Dateien im aktuellen Build-Verzeichnis erzeugt, Sie im Fall tun out-of-Source-Builds. Sie müssen auch angeben, dass die Ausgänge Dateien erzeugt werden:

set_source_files_properties(${output} PROPERTIES GENERATED TRUE) 

setzen, die alle zusammen und Sie eine CMakeLists.txt Datei etwas wie diese:

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) 

Sie würden wahrscheinlich auch hinzufügen möchten Fügen Sie Pfad und andere Optionen zu lzz hinzu. Wenn Sie all das Lazy C++ - Zeug in eine Moduldatei gelegt und das aus der CMakeLists.txt aufgenommen haben, wäre es etwas sauberer. Aber das ist die Grundidee.

+0

Danke, das ist genau das, was ich gesucht habe. – jjacksonRIAB

+0

Wenn CMake ein Visual Studio-Projekt generiert, werden example.cpp und beispiel.h im Lösungsexplorer anstelle von example.lzz angezeigt. Ist es möglich, das umzukehren? – absence

+0

Wenn man dem 'add_custom_command'-Aufruf eine' DEPEND $ {filename} '- Klausel hinzufügt, werden die Quelldateien automatisch neu generiert, wenn sich die lzz-Dateien ändern. – Sunday

-1

Für Hersteller:

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

fill in sourcecode.h, sourcecode.cpp und lazy-CPP mit den richtigen Werten. Ich kenne sie nicht. Hier

+1

Ich schätze die Hilfe, aber ich fragte, wie dies in cmake zu tun. – jjacksonRIAB

+0

Entschuldigung. Ich dachte, Cmake wäre eine Make-Variante. Ich habe nachgesehen, ist es nicht. Gleiche Vorgehensweise erforderlich, andere Syntax. Obwohl Sie wirklich faul werden und diese Prozesse verarbeiten können, hängt das ab und ruft cmake auf. – Joshua

4

Ich wollte nur meine CMakeLists.txt teilen, die auf dem Skript richq aufbaut. Die Dateien * .cpp und * .hpp hängen nun korrekt von den * .lzz-Dateien ab. Die * .lzz-Dateien werden dem Projekt hinzugefügt (das die obige Frage von absense beantwortet), aber mit dem Befehl source_group von den generierten Dateien getrennt gehalten.

Der einzige verbleibende Dealbreaker für mich ist die Unfähigkeit, die aktuelle Datei für * .lzz-Dateien zu kompilieren.

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})