Comment puis-je faire des règles de construction en CMake à C ++ paresseux prétraiter .lzz fichiers qui génèrent des fichiers .h et .cpp?

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

  •  30-09-2019
  •  | 
  •  

Question

Ce que je voudrais faire est d'écrire juste Lazy C ++ .lzz fichiers et ensuite courir RHE avant une construction pour générer des fichiers .cpp et .h qui seront intégrés dans l'application finale, un peu comme la façon dont moc fonctionne avec Qt.

Est-il possible de le faire?

Était-ce utile?

La solution

Voici un exemple de la façon de le faire ... D'abord, vous devez trouver le programme lzz, pour que l'utilisation de la commande find_program:

find_program(LZZ_COMMAND lzz)

Ceci définit LZZ_COMMAND sur le chemin du compilateur. Ensuite, utilisez une commande personnalisée CMake pour compiler le fichier RHE à leurs fichiers C ++ en-tête / de mise en œuvre:

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

qui génère les fichiers dans le répertoire de construction en cours, dans le cas où vous faites hors de la source builds. Vous devrez également préciser que les sorties sont les fichiers générés:

set_source_files_properties(${output} PROPERTIES GENERATED TRUE)

Mettez tout cela ensemble et vous obtenez un fichier CMakeLists.txt quelque chose comme ceci:

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)

Vous auriez probablement également ajouter include_path et d'autres options pour RHE éventuellement. Si vous avez placé tous les trucs ++ Lazy C dans un fichier module et inclus que de la CMakeLists.txt il serait un peu plus propre. Mais cela est l'idée de base.

Autres conseils

Je voulais juste partager mon CMakeLists.txt, qui se base sur le script de richq. * Le Cpp et les fichiers * .hpp maintenant correctement dépendent des fichiers du *. sont ajoutés les fichiers du * au projet (qui répond à la question absense ci-dessus), mais maintenus séparés des fichiers générés à l'aide de la commande source_group.

Le seul reste dealbreaker pour moi est l'incapacité de compiler le fichier en cours pour les fichiers * .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})

Pour faire:

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

remplissage dans sourcecode.h, sourcecode.cpp et-cpp paresseux avec les valeurs correctes. Je ne les connais pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top