使用CMake自动将文件夹中的所有文件添加到目标?

时间:2010-07-08 06:30:18

标签: c++ cross-platform cmake

我正在考虑将跨平台项目从Visual C ++,XCode和makefile中的单独构建管理系统切换到CMake。

我需要的一个基本功能是自动将目录中的所有文件添加到目标。虽然这很容易用make做,但使用Visual C ++和XCode并不容易做到(如果我错了,请纠正我)。是否可以直接在CMake中进行?怎么样?

5 个答案:

答案 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)

@Kleist answer

扩展名

自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")