如何在CMAKE中制定构建规则,以预处理懒惰的C ++ .lzz文件生成.H和.CPP文件?
题
我想做的就是仅编写懒惰的c ++ .lzz文件,然后在构建之前运行lzz以生成.cpp和.h文件,这些文件将内置在最终应用程序中,就像MOC如何与QT一起使用。
有什么办法做到这一点吗?
解决方案
这是一个如何做到这一点的示例...首先,您需要找到 lzz
程序,为此使用 find_program
命令:
find_program(LZZ_COMMAND lzz)
这设置 LZZ_COMMAND
到编译器的路径。然后使用CMAKE自定义命令将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,它基于Richq的脚本。 *.cpp和 *.hpp文件现在正确地取决于 *.lzz文件。 *.lzz文件已添加到项目中(上面回答了Habsense的问题),但使用source_group命令将其与生成的文件分开。
对我来说,唯一剩下的交易破坏者是无法编译 *.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。我不认识他们。
不隶属于 StackOverflow