大家好日子。
我有以下情况:我有一个CMake文件,它应该编译我的应用程序,其中包括:
cpp
个文件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,删除缓存,从零重启一切。这非常烦人而且很慢。
所以,有两个问题:
Cand我告诉CMake跟踪images.ecpp
的变化,如果它发生了变化,就调用${ECPPC}
编译器吗?
我如何make clean
以便它还会删除生成的cpp
文件。
感谢您的时间,f。
答案 0 :(得分:3)
而不是execute_process()
您要使用add_custom_command()
。见这里:https://stackoverflow.com/a/2362222/4323
基本上你告诉CMake OUTPUT
(生成的文件名),COMMAND
和DEPENDS
(.ecpp文件名)。这使它了解如何将源转换为必要的C ++生成文件。然后,将生成的文件添加到某个目标,例如add_executable()
或add_custom_command()
依赖项(如果不需要编译,则更有可能需要编译)。