8
votes

Comment faire des règles de construction dans CMAKE à PreProcessez les fichiers paresseux C ++ qui génèrent des fichiers .h et .cpp?

Ce que j'aimerais faire, c'est écrire juste des fichiers paresseux C ++ .LZz, puis avoir la course Lzz avant une construction pour générer des fichiers .cpp et .h qui seront intégrés à l'application finale, en quelque sorte comme le fonctionnement MOC avec Qt.

Y a-t-il un moyen de faire cela?


0 commentaires

3 Réponses :


0
votes

Pour faire:

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


2 commentaires

J'apprécie l'aide, mais je me demandais comment procéder à cmake.


Mes excuses. Je pensais que Clake était une variante de fabrication. Je l'ai regardé, ce n'est pas le cas. Même approche requise, syntaxe différente. Bien que vous puissiez devenir vraiment paresseux et que vous avez un processus, cela dépend et invoquer la cmake.



9
votes

Voici un exemple de comment faire cela ... Vous devez d'abord trouver le programme lzz code>, pour celui-ci Utilisez la commande Find_Program code> Commande:

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)


4 commentaires

Merci, c'est ce que je cherchais.


Lorsque Cmake génère un projet Visual Studio, exemple.CPP et exemple.h apparaît dans l'explorateur de solution au lieu de l'exemple.LZZ. Est-il possible d'inverser cela?


Si l'on ajoute un dépend de $ {FileName} Clause au add_custom_command -Call Les fichiers source sont automatiquement régénérés si les fichiers LZZ changent.


La commande set_source_files_properties ne semble plus nécessaire en raison de ce qui suit dans la documentation de add_custom_command : "Chaque fichier de sortie sera marqué par la propriété de fichier source générée automatiquement", se référant aux fichiers après la directive de sortie



6
votes

Je voulais juste partager mes CMAKELIST.TXT, qui repose sur le script de Richq. Les fichiers *. .CPP et * .HPP dépendent désormais correctement sur les fichiers * .LZZ. Les fichiers * .LZZ sont ajoutés au projet (qui répond à la question de Absense ci-dessus) mais restait séparément des fichiers générés à l'aide de la commande Source_Group.

Le seul autre pépiteur pour moi est l'incapacité de compiler le fichier actuel de * .LZZ Fichiers. P>

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


0 commentaires