首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在cmake中创建构建规则,以预处理生成.h和.cpp文件的惰性C++ .lzz文件?

如何在cmake中创建构建规则,以预处理生成.h和.cpp文件的惰性C++ .lzz文件?
EN

Stack Overflow用户
提问于 2010-04-22 07:00:42
回答 3查看 4.1K关注 0票数 8

我想要做的就是编写惰性的C++ .lzz文件,然后在构建之前运行lzz,以生成.cpp和.h文件,这些文件将被构建到最终的应用程序中,有点像moc与Qt的工作方式。

有没有办法做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-22 19:59:47

这里有一个如何做到这一点的例子。首先,您需要使用find_program命令找到lzz程序:

代码语言:javascript
运行
复制
find_program(LZZ_COMMAND lzz)

这会将LZZ_COMMAND设置为编译器的路径。然后使用CMake自定义命令将LZZ文件编译为它们的C++头文件/实现文件:

代码语言:javascript
运行
复制
add_custom_command(
    OUTPUT ${output}
    COMMAND ${LZZ_COMMAND} -o ${CMAKE_CURRENT_BINARY_DIR} ${filename})

它在当前构建目录中生成文件,以防您进行源代码外的构建。您还需要指定输出是生成的文件:

代码语言:javascript
运行
复制
set_source_files_properties(${output} PROPERTIES GENERATED TRUE)

把所有这些放在一起,你就会得到一个类似下面这样的CMakeLists.txt文件:

代码语言:javascript
运行
复制
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的内容,它将会更干净一些。但这是基本的想法。

票数 9
EN

Stack Overflow用户

发布于 2012-03-12 22:54:28

我只想分享我的CMakeLists.txt,它构建在richq的脚本之上。*.cpp和*.hpp文件现在可以正确地依赖于*.lzz文件。使用source_group命令将*.lzz文件添加到项目中(这回答了absense上面的问题),但将其与生成的文件分开。

对我来说,唯一的问题是无法为*.lzz文件编译当前文件。

代码语言:javascript
运行
复制
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})
票数 6
EN

Stack Overflow用户

发布于 2010-04-22 07:08:09

对于make:

代码语言:javascript
运行
复制
sourcecode.h sourcecode.cpp: sourcecode.lzz
<TAB>lazy-cpp sourcecode.lzz

用正确的值填充sourecode.h、sourcecode.cpp和lazy-cpp。我不认识他们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2687136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档