2017-08-09 127 views
0

我有一个相当大的项目文件结构,我需要转换成多平台cmake项目。现在它接近cmake需要永远单个cpp文件单独添加到可执行文件。但有没有一个脚本可以自动执行此操作?那通过文件结构窥探,并且只是自动添加每个源文件?由于该项目可能会获得更多的源文件,我可能无法手动添加每一个。CMake递归地将目录的所有子目录内的所有源文件添加到可执行文件?

+0

'file(GLOB ...)'是你的朋友。 – arrowd

+0

谢谢,我会研究它 – user1510024

+1

Unfortunatley他们在维基中明确声明它不应该用于搜索源文件,因为如果没有cmake文件发生更改,cmake不会重新生成makefiles。但我可能会这样做,并创建一个shell脚本,强制cmake每次向项目中添加一个文件时重建。感谢您的帮助 – user1510024

回答

0

你可以使用execute_process()cmake -P脚本,它使用通配符递归扫描其写入一个文件包含在你的CMakeLists.txt即像源文件:

“的CMakeLists.txt”:

execute_process(COMMAND ${CMAKE_COMMAND} 
    -D "RDIR=${CMAKE_CURRENT_SOURCE_DIR}" 
    -P "scansources.cmake" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") 
include("sources.cmake") 
add_executable(myexe ${sources}) 

“scansources.cmake”(产生 “sources.cmake”):

file(GLOB_RECURSE sourcelist 
    *.c 
    *.cc 
    *.cpp 
    *.cxx) 
string(REGEX REPLACE "${RDIR}/" "" relative_sources "${sourcelist}") 
string(REPLACE ";" "\n" sources_string "${relative_sources}") 
set(sources_string "set(sources\n${sources_string})") 
file(WRITE sources.cmake "${sources_string}") 

之所以这样,工程是因为execute_process()发生在配置时间。

您当然可以通过其他工具或IDE生成sources.cmake,那么您不需要scansources.cmakeexecute_process()

+0

所以基本上建立一个脚本,每次我想要编译我的程序,然后make -j4执行cmake,然后重新扫描这些文件。我知道,cmake不会自动搜索它们,如果你只是自己重新创建,对源文件进行匹配,但这实际上可以解决这个问题,谢谢 – user1510024

相关问题