我正在考虑将跨平台项目从Visual C ++,XCode和makefile中的单独构建管理系统切换到CMake。
我需要的一个基本功能是自动将目录中的所有文件添加到目标。虽然这很容易用make做,但使用Visual C ++和XCode并不容易做到(如果我错了,请纠正我)。是否可以直接在CMake中进行?怎么样?
答案 0 :(得分:189)
有可能。例如。与file(GLOB
:
cmake_minimum_required(VERSION 2.8)
file(GLOB helloworld_SRC
"*.h"
"*.cpp"
)
add_executable(helloworld ${helloworld_SRC})
请注意,如果添加或删除源文件,则需要手动重新运行cmake
,因为生成的构建系统不知道何时要求CMake重新生成,并且它在每次构建时都会增加构建时间。
答案 1 :(得分:29)
克莱斯特的答案肯定有效,但有一个重要的警告:
手动编写Makefile
时,您可以使用函数生成SRCS
变量,以选择所有.cpp
和.h
文件。如果稍后添加了源文件,则重新运行make
将包含它。
但是,CMake(使用file(GLOB ...)
之类的命令)将显式生成文件列表并将其放在自动生成的Makefile
中。如果您有新的源文件,则需要通过重新运行Makefile
重新生成cmake
。
编辑:无需删除Makefile。
答案 2 :(得分:7)
扩展名:
自CMake 3.12以来,附加选项 CONFIGURE_DEPENDS 由命令file(GLOB)
和file(GLOB_RECURSE)
supported赋予。使用此选项,在目录中添加/删除源文件后,不需要 手动重新运行CMake-CMake将在下次构建时自动重新运行。项目。
但是,选项 CONFIGURE_DEPENDS 表示每次请求构建时都会重新检查相应的目录,因此 build 过程将花费更多的时间 >比没有 CONFIGURE_DEPENDS 的情况要好。
即使具有 CONFIGURE_DEPENDS 选项可用,CMake文档仍然不建议使用file(GLOB)
或file(GLOB_RECURSE)
来收集源。
答案 3 :(得分:0)
通过 cmake 在 Clion 中使用 Visual Studio 项目层次结构:
cmake_minimum_required(VERSION 3.17)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
file(GLOB APP_SOURCES */*.cpp)
foreach (testsourcefile ${APP_SOURCES})
get_filename_component(testname ${testsourcefile} NAME_WLE)
get_filename_component(dirname ${testsourcefile} DIRECTORY)
file(GLOB dir_src CONFIGURE_DEPENDS
"${dirname}/*.h"
"${dirname}/*.cpp"
)
message("${testname}.cpp | ${dir_src}")
add_executable("${testname}.cpp" ${dir_src})
endforeach (testsourcefile ${APP_SOURCES})
答案 4 :(得分:-2)
所以,为什么不使用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")