كيف أقوم بإنشاء قواعد بناء في CMake للمعالجة المسبقة C ++ .lzz ملفات تنشئ ملفات .h و .cpp؟

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

  •  30-09-2019
  •  | 
  •  

سؤال

ما أود القيام به هو كتابة ملفات Lazy C ++ .lzz فقط ، ثم تم تشغيل LZZ قبل إنشاء ملفات .CPP و .H التي سيتم دمجها في التطبيق النهائي ، مثل كيفية عمل MOC مع QT.

هل هناك أي طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

فيما يلي مثال على كيفية القيام بذلك ... أولاً تحتاج إلى العثور على lzz البرنامج ، لذلك استخدم find_program يأمر:

find_program(LZZ_COMMAND lzz)

هذه المجموعات LZZ_COMMAND إلى مسار المترجم. ثم استخدم الأمر CMAKE Custom لتجميع ملف LZZ إلى ملفات رأس/تطبيق C ++ الخاصة بهم:

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

هذا ينشئ الملفات في دليل الإنشاء الحالي ، في حالة قيامك ببناء خارج المصدر. ستحتاج أيضًا إلى تحديد أن المخرجات هي ملفات تم إنشاؤها:

set_source_files_properties(${output} PROPERTIES GENERATED TRUE)

ضع كل ذلك معًا وتحصل على ملف cmakelists.txt شيء من هذا القبيل:

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)

ربما ترغب أيضًا في إضافة تشمل المسار والخيارات الأخرى إلى LZZ في نهاية المطاف. إذا قمت بوضع جميع الأشياء الكسولة C ++ في ملف الوحدة النمطية وقمت بتضمينها من cmakelists.txt ، فسيكون ذلك أكثر نظافة. ولكن هذه هي الفكرة الأساسية.

نصائح أخرى

أردت فقط مشاركة cmakelists.txt ، الذي يعتمد على نص ريتشك. تعتمد ملفات *.cpp و *.hpp الآن بشكل صحيح على ملفات *.lzz. تتم إضافة ملفات *.lzz إلى المشروع (الذي يجيب على سؤال ABSENSE أعلاه) ولكنه أبقى منفصلًا عن الملفات التي تم إنشاؤها باستخدام أمر Source_Group.

إن Dealbreaker الوحيد المتبقي بالنسبة لي هو عدم القدرة على تجميع الملف الحالي لملفات *.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})

لكى تصنع:

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

املأ في sourcecode.h و sourcecode.cpp و Lazy-CPP مع القيم الصحيحة. أنا لا أعرفهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top