关于生成的文件

时间:2013-04-24 13:30:19

标签: cmake dynamically-generated tntnet

大家好日子。

我有以下情况:我有一个CMake文件,它应该编译我的应用程序,其中包括:

  1. 一个或多个cpp个文件
  2. 一些模板文件(ecpp),它们又被生成cpp文件,这些文件被编译到应用程序中(它们列在WEB_COMPONENTS下面,因此对于每个组件有相关的.ecpp文件和将从中生成的.cpp
  3. 这是CMakeLists.txt(简化)

    cmake_minimum_required (VERSION 2.6)
    set (PROJECT sinfonifry)
    set (ECPPC /usr/local/bin/ecppc)
    set (WEB_COMPONENTS 
         images 
         menu
         css
    )
    
    set(${PROJECT}_SOURCES
      ""
      CACHE INTERNAL ${PROJECT}_SOURCES
    )
    
    foreach(comp ${WEB_COMPONENTS})
      list(APPEND ${PROJECT}_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${comp}.cpp )
    
      execute_process(COMMAND ${ECPPC} -o ${CMAKE_CURRENT_BINARY_DIR}/${comp}.cpp -v
                      ${CMAKE_CURRENT_SOURCE_DIR}/${comp}.ecpp 
                      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_QUIET
                     )
    endforeach()
    
    list(APPEND ${PROJECT}_SOURCES main.cpp )
    add_executable(${PROJECT}_exe ${${PROJECT}_SOURCES})
    target_link_libraries(${PROJECT}_exe cxxtools dl tntnet tntdb)
    

    现在,会发生什么:第一次(即:制作构建目录,运行cmake-gui,选择web组件,配置,生成,制作),CMake很好地执行${ECPPC}命令,即。它在二进制目录中生成所需的CPP文件,并将它们链接在一起。

    过了一段时间,显然在我工作的时候,我修改了一个组件文件(例如images.ecpp)并在构建目录中再次运行make。但现在,CMake没有获取ecpp文件的更改。我必须去cmake-gui,删除缓存,从零重启一切。这非常烦人而且很慢。

    所以,有两个问题:

    1. Cand我告诉CMake跟踪images.ecpp的变化,如果它发生了变化,就调用${ECPPC}编译器吗?

    2. 我如何make clean以便它还会删除生成的cpp文件。

    3. 感谢您的时间,f。

1 个答案:

答案 0 :(得分:3)

而不是execute_process()您要使用add_custom_command()。见这里:https://stackoverflow.com/a/2362222/4323

基本上你告诉CMake OUTPUT(生成的文件名),COMMANDDEPENDS(.ecpp文件名)。这使它了解如何将源转换为必要的C ++生成文件。然后,将生成的文件添加到某个目标,例如add_executable()add_custom_command()依赖项(如果不需要编译,则更有可能需要编译)。

相关问题