¿Cómo hago reglas de generación en cmake preprocesasen C ++ perezoso .lzz archivos que generan archivos .cpp y .h?

StackOverflow https://stackoverflow.com/questions/2687136

  •  30-09-2019
  •  | 
  •  

Pregunta

Lo que me gustaría hacer es escribir un vago C ++ .lzz archivos y luego tienen plazo Lzz antes de una acumulación de generar archivos .cpp y .h que se construirán en la aplicación final, una especie de cómo funciona la moc con Qt.

¿Hay alguna manera de hacer esto?

¿Fue útil?

Solución

Este es un ejemplo de cómo hacer esto ... Lo primero que necesita para encontrar el programa lzz, para que el uso del comando find_program:

find_program(LZZ_COMMAND lzz)

Este conjuntos 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 ++ / C de aplicación:

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

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

put que 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 ruta de inclusión y otras opciones para Lzz finalmente. Si ha colocado todas las cosas de la Lazy C ++ en un archivo de módulo e incluyó que desde el CMakeLists.txt sería un poco más limpia. Pero esta es la idea básica.

Otros consejos

Sólo quería compartir mi CMakeLists.txt, que se basa en el guión de richq. Los archivos * * .cpp .hpp y ahora dependen correctamente en los archivos del * .lzz. El archivos * .lzz se añaden al proyecto (que responde a la pregunta de ausencia arriba), pero mantienen separados de los ficheros generados con 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})

Para hacer:

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

relleno en sourcecode.h, sourcecode.cpp, y lazy-CPP con los valores correctos. No sé ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top