CMakeを使用して、フォルダー内のすべてのファイルをターゲットに自動的に追加しますか?


163

クロスプラットフォームプロジェクトをVisual C ++、XCode、makefileの個別のビルド管理システムからCMakeに切り替えることを検討しています。

私が必要とする重要な機能の1つは、ディレクトリ内のすべてのファイルをターゲットに自動的に追加することです。これはmakeで簡単に実行できますが、Visual C ++やXCodeでは簡単に実行できません(間違っている場合は修正してください)。CMakeで直接行うことはできますか?どうやって?


ところで Visual Studioでは、少なくともC#プロジェクトでは、プロジェクトエクスプローラーに、show all filesという名前のツールバーボタンがあります。プロジェクトに論理的に含まれるファイルが含まれていない場合、プロジェクトのすべてのサブディレクトリが表示され、グレー表示されます。これらのディレクトリは、すべてのソースファイルを再帰的に含むコンテキストメニューから含めることができます:)
yeoman

回答:


228

可能です。例file(GLOB

cmake_minimum_required(VERSION 2.8)

file(GLOB helloworld_SRC
    "*.h"
    "*.cpp"
)

add_executable(helloworld ${helloworld_SRC})

生成されたビルドシステムはCMakeに再生成を要求するタイミングがわからないため、ソースファイルが追加または削除された場合は手動で再実行する必要cmakeがあり、ビルドごとに実行するとビルド時間が長くなるため注意してください。


11
手動でcmakeを再実行する代わりに、makeを実行する前にCMakeLists.txtファイルを変更することもできます。
Seamus Connor


8
>「GLOBを使用してソースツリーからソースファイルのリストを収集することはお勧めしません。ソースが追加または削除されたときにCMakeLists.txtファイルが変更されない場合、生成されたビルドシステムは、CMakeに再生成を要求するタイミングを認識できません。」これは、Hand1CloudによってリンクされたCMAKE3.7ドキュメントで推奨されなくなりました
トリプル

4
では、GLOBに代わるものは何ですか?
Shayne

13
:V3.1は、ここで提案されているので、より良い方法target_sources() crascit.com/2016/01/31/...
シーン

34

クライストの答えは確かに機能しますが、重要な警告があります。

あなたが書く場合はMakefile手動を、あなたが生成する場合がありますSRCSすべてを選択する機能を使用して変数を.cppして.hファイルを。ソースファイルが後で追加された場合、再実行makeするとそのファイルが含まれます。

ただし、CMake(などのコマンドを使用file(GLOB ...))は明示的にファイルリストを生成し、自動生成されたに配置しMakefileます。新しいソースファイルがある場合は、Makefileを再実行してを再生成する必要がありますcmake

編集:Makefileを削除する必要はありません。


4
cmakeを単に再実行することはできません。古いMakefileを削除/変更する必要がありますか?
2013年

25
これは回答ではなく、@ Kleistの回答に関するコメントです。
Neowizard

3
Stackoverflowの用語ではない@Neowizard。
カラデニス2016

1
このコメントはいいですが、「標準」ですよね?質問者はすでにcmakeを使用しているので、makeを「賢く」するように提案してもあまり役に立ちません。
frankliuao 2017年

では、新しいソースファイルを追加してから、cmakeを再実行せずにビルドする方法はありますか?
アルティン

6

拡張のための@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)への使用を推奨していません


「CMakeのドキュメントでは、ソースの使用file(GLOB)file(GLOB_RECURSE)収集はまだ推奨されていません。ソースを収集したり、手動ですべてのソースファイルをリストしたりするために何か他のものを使用していますか?
トーマス

1
@Thomas:すべてのソースファイルを手動でリストすることをお勧めします。その回答は、推奨事項の優れた説明を提供します。
Tsyvarev

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

質問にはクロスプラットフォームのタグが付けられています-powershellはクロスプラットフォームではありません。
ライハート

@reichhartのPowerShellは、あまりにもLinux上で動作し、およびMac
誰も

知っている。しかし、powershellのタグはなく、「CMake」はすでにクロスプラットフォームです。「Powershell」は追加の依存関係となり、Windows以外のOSではほとんど使用されません。Linuxでは、powershellを使用している人よりもさらに多くのC#開発者を見つけることができます。そして最も重要な事実は、「CMakeで直接実行することは可能ですか?方法」という質問です。
21
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.