与生成的文件相关的CMake

与生成的文件相关的CMake,cmake,dynamically-generated,tntnet,Cmake,Dynamically Generated,Tntnet,大家好 我有以下情况:我有一个CMake文件,它应该用来编译我的应用程序,它包括: 一个或多个cpp文件 一些模板文件(ecpp),依次生成cpp文件,并编译到应用程序中(它们列在下面的WEB\u组件中,因此每个组件都有相关的.ecpp文件和将从中生成的.cpp) 这里是CMakeLists.txt(简化) 现在,发生了什么:第一次(即:生成构建目录,运行cmake gui,选择web组件,配置,生成,生成)cmake很好地执行${ECPPC}命令,即在二进制目录中生成所需的CPP文件,并将它们

大家好

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

  • 一个或多个
    cpp
    文件
  • 一些模板文件(
    ecpp
    ),依次生成
    cpp
    文件,并编译到应用程序中(它们列在下面的
    WEB\u组件
    中,因此每个组件都有相关的
    .ecpp
    文件和将从中生成的
    .cpp
  • 这里是CMakeLists.txt(简化)

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

    过了一段时间,显然是在我工作的时候,我修改了一个组件文件(比如
    images.ecpp
    ),并在build目录中再次运行
    make
    。但是现在,CMake无法获取
    ecpp
    文件的更改。我必须去CMAKEGUI,删除缓存,从零开始重新启动所有东西。这是非常令人厌烦和缓慢的

    因此,有两个问题:

  • 我能告诉CMake跟踪
    images.ecpp
    的更改,如果更改,调用
    ${ECPPC}
    编译器吗

  • 如何使
    make clean
    ,以便它同时删除生成的
    cpp
    文件


  • 感谢您抽出时间,f.

    而不是
    执行流程()
    您想使用
    添加自定义命令()
    。请看这里:


    基本上是告诉CMake
    输出(生成的文件名)、
    命令和
    依赖(文件名).ecpp)。这使得它了解如何将源转换为必需的C++生成文件。然后,将生成的文件添加到某个目标,例如
    add_executable()
    ,或添加到
    add_custom_命令()
    依赖项(如果不需要编译,您可能更需要它)。

    非常好。只是为了共享命令:
    add_custom_command(OUTPUT${CMAKE_CURRENT_BINARY_DIR}/${comp}.cpp command${ECPPC}-o${CMAKE_CURRENT_BINARY_DIR}/${comp comp}.cpp-v-n${comp comp}${CMAKE_CURRENT_SOURCE DIR}/${comp
    
    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)