1

今天是个好日子。

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

  1. 一个或多个cpp文件
  2. 有些模板文件(ecpp_ cpp_WEB_COMPONENTS.ecpp.cpp

这是 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. 我可以告诉 CMake 跟踪它的变化并在它发生变化时images.ecpp调用它的编译器吗?${ECPPC}

  2. 我怎样才能make clean让它也删除生成的cpp文件。

谢谢你的时间,f。

4

1 回答 1

3

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

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

于 2013-04-24T14:00:34.687 回答