クロスプラットフォームプロジェクトをVisual C ++、XCode、makefileの個別のビルド管理システムからCMakeに切り替えることを検討しています。
私が必要とする重要な機能の1つは、ディレクトリ内のすべてのファイルをターゲットに自動的に追加することです。これはmakeで簡単に実行できますが、Visual C ++やXCodeでは簡単に実行できません(間違っている場合は修正してください)。CMakeで直接行うことはできますか?どうやって?
クロスプラットフォームプロジェクトをVisual C ++、XCode、makefileの個別のビルド管理システムからCMakeに切り替えることを検討しています。
私が必要とする重要な機能の1つは、ディレクトリ内のすべてのファイルをターゲットに自動的に追加することです。これはmakeで簡単に実行できますが、Visual C ++やXCodeでは簡単に実行できません(間違っている場合は修正してください)。CMakeで直接行うことはできますか?どうやって?
回答:
可能です。例file(GLOB
:
cmake_minimum_required(VERSION 2.8)
file(GLOB helloworld_SRC
"*.h"
"*.cpp"
)
add_executable(helloworld ${helloworld_SRC})
生成されたビルドシステムはCMakeに再生成を要求するタイミングがわからないため、ソースファイルが追加または削除された場合は手動で再実行する必要cmake
があり、ビルドごとに実行するとビルド時間が長くなるため注意してください。
クライストの答えは確かに機能しますが、重要な警告があります。
あなたが書く場合はMakefile
手動を、あなたが生成する場合がありますSRCS
すべてを選択する機能を使用して変数を.cpp
して.h
ファイルを。ソースファイルが後で追加された場合、再実行make
するとそのファイルが含まれます。
ただし、CMake(などのコマンドを使用file(GLOB ...)
)は明示的にファイルリストを生成し、自動生成されたに配置しMakefile
ます。新しいソースファイルがある場合は、Makefile
を再実行してを再生成する必要がありますcmake
。
編集:Makefileを削除する必要はありません。
拡張のための@Kleist答え:
CMake 3.12以降、追加オプションCONFIGURE_DEPENDSがコマンドとでサポートされています。このオプションを使用すると、手動で行う必要はありませんfile(GLOB)
file(GLOB_RECURSE)
使用すると、ディレクトリ内のソースファイルの追加/削除後にCMake再実行する。CMakeは、次のプロジェクトのビルド時に自動的に再実行されます。
ただし、オプションCONFIGURE_DEPENDSは、ビルドが要求されるたびに対応するディレクトリが再チェックされることを意味するため、ビルドプロセスはCONFIGURE_DEPENDSがない場合よりも多くの時間を消費します。。
CONFIGURE_DEPENDSオプションを使用できる場合でも、CMakeのドキュメントでは、ソースの収集file(GLOB)
またはfile(GLOB_RECURSE)
への使用を推奨していません。
file(GLOB)
やfile(GLOB_RECURSE)
収集はまだ推奨されていません。ソースを収集したり、手動ですべてのソースファイルをリストしたりするために何か他のものを使用していますか?
では、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")