Wie mache ich Build Regeln in Cmake vorverarbeitet faul C ++ .lzz Dateien, die .h und CPP-Dateien erzeugen?

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

  •  30-09-2019
  •  | 
  •  

Frage

Was ich möchte, ist zu tun, schreiben Sie einfach faul C ++ .lzz Dateien und dann haben LZZ Lauf vor einem Build CPP und H-Dateien zu erzeugen, die in der Endanwendung gebaut werden soll, Art wie wie moc Arbeiten mit Qt.

Gibt es eine Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Hier ist ein Beispiel dafür, wie dies zu tun ... Zuerst müssen Sie das lzz Programm finden, die für diese Verwendung den find_program Befehl:

find_program(LZZ_COMMAND lzz)

LZZ_COMMAND Diese Sätze auf den Pfad des Compilers. Verwenden Sie einen CMake benutzerdefinierten Befehl die LZZ Datei an ihre C ++ Header / Implementierungsdateien zu kompilieren:

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

Das erzeugt die Dateien im aktuellen Build-Verzeichnis, falls Sie tun out-of-Source-Builds. Dort finden Sie auch, dass die Ausgänge Dateien erzeugt werden, angeben müssen:

set_source_files_properties(${output} PROPERTIES GENERATED TRUE)

Setzen Sie, dass alle zusammen und Sie erhalten eine CMakeLists.txt Datei etwas wie folgt aus:

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)

Sie würden wahrscheinlich wollen auch Pfad und andere Optionen LZZ umfassen hinzuzufügen schließlich. Wenn Sie all faulen C ++ Sachen in eine Modul-Datei abgelegt und aufgenommen, dass von der CMakeLists.txt wäre es etwas sauberer sein. Aber das ist die Grundidee.

Andere Tipps

Ich wollte nur meine CMakeLists.txt teilen, die auf richq Drehbuch aufbaut. Der * CPP und * .hpp Dateien jetzt hängen richtig auf der * .lzz Dateien. Die * .lzz Dateien werden das Projekt hinzugefügt (die oben absense Frage beantwortet), aber getrennt von den erzeugten Dateien des source_group Befehl.

Die einzige für mich verbleibenden dealbreaker ist die Unfähigkeit, die aktuelle Datei für * .lzz Dateien zu kompilieren.

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

Für stellen:

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

fill in sourcecode.h, sourcecode.cpp und lazy-CPP mit den richtigen Werten. Ich kenne sie nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top