Come faccio a fare le regole di compilazione in CMake alla pre-elaborazione pigro C ++ .lzz file che generano file .he cpp?

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

  •  30-09-2019
  •  | 
  •  

Domanda

Quello che mi piacerebbe fare è scrivere semplicemente pigri C ++ .lzz file e poi hanno eseguito LZZ prima di una build per generare file .h che saranno costruite nell'applicazione finale cpp e, un po 'come funziona come MOC con Qt.

Esiste un modo per fare questo?

È stato utile?

Soluzione

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)

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

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)

che mettere tutti insieme e si ottiene un file qualcosa CMakeLists.txt in questo modo:

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 percorso e altre opzioni per LZZ alla fine. Se hai inserito tutta roba Lazy C ++ in un file di modulo ed incluso che dalla CMakeLists.txt sarebbe un po 'più pulito. Ma questa è l'idea di base.

Altri suggerimenti

Volevo solo condividere la mia CMakeLists.txt, che si basa su sceneggiatura di richq. Il file * .hpp cpp * e ora dipendono correttamente i file * .lzz. Il file * .lzz vengono aggiunti al progetto (che risponde alla domanda di absense sopra), ma tenuti separati dai file generati con il comando source_group.

L'dealbreaker unica rimasta per me è l'incapacità 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})

Per il trucco:

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top