web-dev-qa-db-ja.com

Cmakeビルドシステムでディレクトリ内のすべての* .cファイルを使用する方法は?

ディレクトリの下にあるすべての.cファイルを検索し、それらをすべてSRCファイルに追加してcmakeでコンパイルしたいと思います。 CMakeList.txtでこれを行うにはどうすればよいですか。

通常のメイクファイルの場合、作成できます

SPECIFIED_SRC_FILE  = $(foreach d,$(SPECIFIED_SRC_DIRS),$(wildcard $(addprefix $(d)/*,*.c)))

しかし、私はCMakeList.txtでこのようなことをする方法を得ることができませんでした。

52
user256537

これを試して:

AUX_SOURCE_DIRECTORY

ディレクトリ内のすべてのソースファイルを検索します。

AUX_SOURCE_DIRECTORY(dir VARIABLE) 

指定されたディレクトリ内のすべてのソースファイルの名前を収集し、指定された変数にリストを保存します。このコマンドは、明示的なテンプレートのインスタンス化を使用するプロジェクトで使用することを目的としています。テンプレートのインスタンス化ファイルは、「Templates」サブディレクトリに保存し、このコマンドを使用して自動的に収集して、すべてのインスタンス化を手動でリストすることを回避できます。

このコマンドを使用して、ライブラリまたは実行可能ターゲットのソースファイルのリストを書き込まないようにするのは魅力的です。これは機能しているように見えますが、CMakeが新しいソースファイルがいつ追加されたかを知るビルドシステムを生成する方法はありません。通常、生成されたビルドシステムは、CMakeLists.txtファイルが変更されて新しいソースが追加されるため、CMakeを再実行する必要があることを認識しています。このファイルを変更せずにソースをディレクトリに追加しただけでは、CMakeを手動で再実行して、新しいファイルを組み込んだビルドシステムを生成する必要があります。

47
whitequark

古き良きグロブはどうですか?

FILE(GLOB MyCSources *.c)
ADD_EXECUTABLE(MyExecutable ${MyCSources})
56
Dat Chu

はい、2つのオプションがあります。フォルダー構造がこれに似ていると仮定しましょう。

├── autopilot
            │   ├── _AutoPilot.cpp
            │   ├── _AutoPilot.h
            │   └── action
            │       ├── ActionBase.cpp
            │       ├── ActionBase.h
            │       ├── APcopter
            │       │   ├── APcopter_avoid.cpp
            │       │   ├── APcopter_avoid.h

AUX_SOURCE_DIRECTORYを使用する場合は、サブディレクトリごとにCMakeLists.txtを追加する必要があります。次に、これらすべてのサブディレクトリを含めてリンクする必要があります。これは非常に難しい作業です。したがって、GLOBを使用して、非常に簡単に作業を行うことができます。これがどのように行われるかです。

  file(GLOB autopilot_sources ./**.cpp ./**.c)
  SET( autopilot ${autopilot_sources})  

上記のソースコードを使用してライブラリを作成する場合、これはコマンドです。

  ADD_LIBRARY ( autopilot  ${autopilot})
  TARGET_LINK_LIBRARIES ( autopilot)  

上記のソースコードを使用して実行可能ファイルを作成する場合、これはコマンドです。

 ADD_EXECUTABLE(autopilot ${autopilot})
2
GPrathap

GLOB_RECURSE再帰的な例

基本的に、*もサブディレクトリに入ります:

cmake_minimum_required(VERSION 3.0)
file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.c")
add_executable(main ${SOURCES})

そして、私たちのソースは、例えば次のように見つけることができます:

src/main.c
src/d/a.c
src/d/a.h

main.c#include "d/a.h"を使用し、a.c#include "a.h"を使用します。

CMakeのトップレベルでGLOB_RECURSE(つまり"*.c"の代わりに"src/*.c")を使用することは、CMake自体によって生成される.cファイルを取得できるため、おそらく悪い考えです。 build/

実行可能な例 GitHubで

AUX_SOURCE_DIRECTORYを@whitequarkの説明どおりに使用できますが、CMakeは新しいファイルが追加されたときを判断できないため(ワイルドカードを使用した場合の全体的な点です)、期待どおりに機能しません。

0
JesperE