2010-04-21 2 views

risposta

8

Ecco un esempio di come fare questo ... In primo luogo è necessario trovare il programma lzz, per tale uso il comando find_program:

find_program(LZZ_COMMAND lzz) 

Questa imposta LZZ_COMMAND al percorso del compilatore. Quindi utilizzare un comando personalizzato CMake per compilare il file LZZ ai loro file header C++/implementazione:

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

che genera i file nella directory di compilazione corrente, nel caso in cui si fa out-of-source build. Sarà inoltre necessario specificare che le uscite sono file generati:

set_source_files_properties(${output} PROPERTIES GENERATED TRUE) 

Metti che tutti insieme e si ottiene un file CMakeLists.txt qualcosa di simile:

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) 

E 'probabile che anche voler aggiungere includere il percorso e altre opzioni per lzz eventualmente. Se hai inserito tutte le cose di Lazy C++ in un file di modulo e l'hai incluso da CMakeLists.txt, sarebbe un po 'più pulito. Ma questa è l'idea di base.

+0

Grazie, questo è proprio quello che stavo cercando. – jjacksonRIAB

+0

Quando CMake genera un progetto di Visual Studio, example.cpp e example.h vengono visualizzati in solution explorer anziché example.lzz. È possibile invertire questo? – absence

+0

Se si aggiunge una clausola 'DEPEND $ {filename}' alla chiamata 'add_custom_command', i file di origine vengono rigenerati automaticamente se i file lzz cambiano. – Sunday

-1

Per marca:

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

riempimento in sourcecode.h, sourcecode.cpp, e pigro-cpp con i valori corretti. Non li conosco

+1

Apprezzo l'aiuto, ma stavo chiedendo come farlo in cmake. – jjacksonRIAB

+0

Le mie scuse. Pensavo che cmake fosse una variante della marca. L'ho cercato, non lo è. Stesso approccio richiesto, diversa sintassi. Sebbene tu possa diventare veramente pigro e fare processo, dipende e invoca cmake. – Joshua

4

Volevo solo condividere il mio CMakeLists.txt, che si basa sullo script di Richq. I file * .cpp e * .hpp ora dipendono correttamente dai file * .lzz. I file * .lzz vengono aggiunti al progetto (che risponde alla domanda di absense sopra) ma tenuti separati dai file generati usando il comando source_group.

L'unico dealbreak rimanente per me è l'impossibilità di compilare il file corrente per i file * .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})