私は C++ プロジェクトでディレクトリを組織的な要素として使用しています。これは、Java のパッケージや PHP のディレクトリを使用する方法と同じです。ディレクトリは自己完結的な要素ではなく、プロジェクト全体を整理し、ソースに圧倒されないようにするための手段です。これに対処するには、CMakeLists.txt ファイルをどのように作成すればよいでしょうか。ディレクトリをライブラリにすることは、ここでは適切ではないようです。ディレクトリはすべて相互に依存しており、そのように使用することを意図していないためです。
関連する問題として、私がこれまでに見た CMake の複数のサブディレクトリの例のほとんど (そのような例はそれほど多くありません) では、 の設定の問題が無視されているか、軽視されています。include_directories
これは私が問題を抱えている点です。ソース ファイルを調べて、どのファイルがどのディレクトリのどのファイルに依存しているかを判断する以外に、 の下のすべてのディレクトリを/src/
潜在的なインクルード ディレクトリとして設定し、実際に依存しているディレクトリを CMake に判断させる方法はありますか?
構造の例を次に示します。
--src
--top1
--mid1
--bot1
--src1.cpp
--hdr1.h
--bot2
--src2.cpp
--hdr2.h
--mid2
--bot3
--src3.cpp
--src4.cpp
--hdr3.h
--top2
--mid3
--src5.cpp
--hdr4.h
などなど。CMakeLists.txt
このような構造を処理するには、ファイルをどのように構成すればよいでしょうか?
ベストアンサー1
プロジェクトのディレクトリ構造はファイルを整理するためのものなので、ディレクトリCMakeLists.txt
内のすべてのソース ファイルを自動的に検索しsrc
、ヘッダー ファイルを含むすべてのディレクトリをインクルード ディレクトリとして追加する を使用する方法もあります。次の CMake ファイルが出発点として使用できます。
cmake_minimum_required(VERSION 3.12)
project (Foo)
file (GLOB_RECURSE Foo_SOURCES CONFIGURE_DEPENDS "src/*.cpp")
file (GLOB_RECURSE Foo_HEADERS CONFIGURE_DEPENDS "src/*.h")
set (Foo_INCLUDE_DIRS "")
foreach (_headerFile ${Foo_HEADERS})
get_filename_component(_dir ${_headerFile} PATH)
list (APPEND Foo_INCLUDE_DIRS ${_dir})
endforeach()
list (REMOVE_DUPLICATES Foo_INCLUDE_DIRS)
add_executable(FooExe ${Foo_SOURCES})
target_include_directories(FooExe PRIVATE ${Foo_INCLUDE_DIRS})
2 つのfile(GLOB_RECURSE ...
コマンドは、ソース ファイルとヘッダー ファイルのセットを決定します。foreach
ループは、すべてのヘッダー ファイルのリストからインクルード ディレクトリのセットを計算します。CONFIGURE_DEPENDS
フラグは、ビルド時に glob コマンドを再実行するように CMake に指示します。
ソース ファイル セットを計算する際の欠点の 1 つは、新しいファイルがソース ツリーに追加されたときに CMake が自動的に検出しないことです。その場合は、ビルド ファイルを手動で再作成する必要があります。