2010-04-21 5 views

Respuesta

8

Aquí es un ejemplo de cómo hacer esto ... Lo primero que necesita para encontrar el programa lzz, para que utilice el comando find_program:

find_program(LZZ_COMMAND lzz) 

Ajusta LZZ_COMMAND a la ruta del compilador. A continuación, utilice un comando personalizado CMake para compilar el archivo LZZ a sus archivos de cabecera de C++/implementación:

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

que genera los archivos en el directorio de construcción actual, en caso de que fuera de la fuente de construcciones. También tendrá que especificar que las salidas se generan archivos:

set_source_files_properties(${output} PROPERTIES GENERATED TRUE) 

poner eso todos juntos y se obtiene un archivo CMakeLists.txt algo como esto:

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) 

Es probable que también desee agregar incluya ruta y otras opciones para lzz eventualmente. Si coloca todas las cosas de Lazy C++ en un archivo de módulo e incluye eso desde CMakeLists.txt sería un poco más limpio. Pero esta es la idea básica.

+0

Gracias, esto es justo lo que estaba buscando. – jjacksonRIAB

+0

Cuando CMake genera un proyecto de Visual Studio, example.cpp y example.h aparecen en el explorador de soluciones en lugar de example.lzz. ¿Es posible revertir esto? – absence

+0

Si se agrega una cláusula 'DEPEND $ {filename}' a la llamada 'add_custom_command', los archivos fuente se regeneran automáticamente si cambian los archivos lzz. – Sunday

-1

Para haga:

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

relleno en sourcecode.h, sourcecode.cpp, y perezoso-CPP con los valores correctos. No los conozco

+1

Agradezco la ayuda, pero estaba preguntando cómo hacer esto en cmake. – jjacksonRIAB

+0

Mis disculpas. Pensé que cmake era una variante de marca. Lo busqué, no lo es. Se requiere el mismo enfoque, sintaxis diferente. Aunque podría ser realmente flojo y tener un proceso de fabricación, esto depende e invocar cmake. – Joshua

4

Sólo quería compartir mi CMakeLists.txt, que se basa en el guión de richq. Los archivos * .cpp y * .hpp ahora dependen de los archivos * .lzz. Los archivos * .lzz se agregan al proyecto (que responde a la pregunta anterior de absent) pero se mantienen separados de los archivos generados mediante el comando source_group.

El dealbreaker único que queda para mí es la incapacidad para compilar el archivo actual para los archivos * .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}) 
Cuestiones relacionadas