2013-04-24 73 views
1

美好的一天大家。CMake与关于生成的文件

我有以下情况:我有一个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) 

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

过了一段时间,显然在工作时,我修改了其中一个组件文件(例如images.ecpp),并在build目录中再次运行make。但是现在,CMake并没有拿起ecpp文件的变化。我必须去cmake-gui,删除缓存,从零开始重新开始。这非常烦人而且缓慢。

于是,两个问题:

  1. C和我告诉CMake的跟踪images.ecpp的变化,并调用${ECPPC}编译器就可以了,如果它改变了吗?

  2. 我该如何才能make clean这样它也会删除生成的cpp文件。

谢谢你的时间,f。

回答

3

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

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

+1

非常好。只需共享命令:'add_custom_command(OUTPUT $ {CMAKE_CURRENT_BINARY_DIR}/$ {comp} .cpp COMMAND $ {ECPPC} -o $ {CMAKE_CURRENT_BINARY_DIR}/$ {comp} .cpp -v -n $ {comp} $ { CMAKE_CURRENT_SOURCE_DIR}/$ {comp} .ecpp DEPENDS $ {CMAKE_CURRENT_SOURCE_DIR}/$ {comp} .ecpp)' – fritzone 2013-04-25 06:13:45