我正在考虑将跨平台项目从Visual C ++,XCode和makefile中的单独生成管理系统切换到CMake。
我需要的一项基本功能是将目录中的所有文件自动添加到目标。尽管使用make可以轻松做到这一点,但使用Visual C ++和XCode却不容易做到(如果我做错了,请纠正我)。是否可以直接在CMake中进行?怎么样?
我正在考虑将跨平台项目从Visual C ++,XCode和makefile中的单独生成管理系统切换到CMake。
我需要的一项基本功能是将目录中的所有文件自动添加到目标。尽管使用make可以轻松做到这一点,但使用Visual C ++和XCode却不容易做到(如果我做错了,请纠正我)。是否可以直接在CMake中进行?怎么样?
Answers:
有可能的。例如file(GLOB
:
cmake_minimum_required(VERSION 2.8)
file(GLOB helloworld_SRC
"*.h"
"*.cpp"
)
add_executable(helloworld ${helloworld_SRC})
请注意,这需要手动重新运行cmake
是否添加或删除了源文件,因为生成的构建系统不知道何时要求CMake重新生成,而在每次构建时都这样做会增加构建时间。
克莱斯特(Kleist)的答案确实有效,但有一个重要警告:
当您Makefile
手动编写手册时,您可能会SRCS
使用函数选择全部.cpp
和.h
文件来生成变量。如果以后添加了源文件,则重新运行make
将包括该文件。
但是,CMake(使用类似命令file(GLOB ...)
)将显式生成文件列表,并将其放置在自动生成的文件中Makefile
。如果您有新的源文件,则需要Makefile
通过重新运行来重新生成cmake
。
编辑:不需要删除Makefile。
那么,为什么不使用Powershell为您创建源文件列表。看一下这个脚本
param (
[Parameter(Mandatory=$True)]
[string]$root
)
if (-not (Test-Path -Path $root)) {
throw "Error directory does not exist"
}
#get the full path of the root
$rootDir = get-item -Path $root
$fp=$rootDir.FullName;
$files = Get-ChildItem -Path $root -Recurse -File |
Where-Object { ".cpp",".cxx",".cc",".h" -contains $_.Extension} |
Foreach {$_.FullName.replace("${fp}\","").replace("\","/")}
$CMakeExpr = "set(SOURCES "
foreach($file in $files){
$CMakeExpr+= """$file"" " ;
}
$CMakeExpr+=")"
return $CMakeExpr;
假设您有一个具有这种结构的文件夹
C:\Workspace\A
--a.cpp
C:\Workspace\B
--b.cpp
现在将此文件另存为“ generateSourceList.ps1”,然后以
~>./generateSourceList.ps1 -root "C:\Workspace" > out.txt
out.txt文件将包含
set(SOURCE "A/a.cpp" "B/b.cpp")