実践C++応用講座CMake編こんにちは。CMakeは各種ファイル操作にも対応しています。ファイルのリード/ライト、ファイルのコピーや移動、フォルダの作成などは当然として、CMakeにとって便利な(サブフォルダ配下も含む)ファイルやフォルダのリスト作成、更にびっくり機能のファイルのダウンロード/アップロードなどなどです。このファイル・リストの作成はビルド・システム構築に便利ですが、最近びっくり拡張されていました。今回はそのCONFIGURE_DEPENDSについて解説します。1.ファイル・リストを返すGLOB/GLOB_RECURSEGLOB/GLOB_RECURSEはファイルやフォルダのパスをリストとして返します。必要なファイルだけをコピーする時などに便利です。add_executableやadd_libraryなどに渡すソース・ファイルのリストを生成するのにも使われることがあります。後者は特にソースを追加した際に、再生成を忘れて「あちゃっ」となることも少くないのですが、CONFIGURE_DEPENDSで対処できそうです。CMakeのリストを使いますので、それを表示する簡易ツールを用意しました。message("")endfunction()また、テスト用のフォルダを次のように設けています。baz.log1-1.file(GLOB)file(GLOB)コマンドのパラメータについて説明します。フォルダ名(ディレクトリ名)をリストに含めるかどうかを指定します。省略するとフォルダ名もリストに含まれます。出力されるパスを指定したフォルダからの相対パスとします。省略すると絶対パスになります。ファイル・リストが変化するとMakefileを再生成します。3.12から追加された新機能。具体的にはサンプルを見るのが早いと思います。LIST_DIRECTORIESとRELATIVEを指定しています。${CMAKE_SOURCE_DIR}については前回の解説を参照下さい。CONFIGURE_DEPENDSは複雑ですので後述します。foo/foo.txt1-2.file(GLOB_RECURSE)GLOBとほぼ同じ機能ですが、フォルダの下を再帰的にリストアップします。パラメータはGLOBと同じです。GLOB同様、具体的にはサンプルを見るのが早いと思いますのでサクッとサンプルです。foo/foo.txt1-3.CONFIGURE_DEPENDSについて私も今回初めて使ったのですが、このオプションは「かゆいところ」に手を届かせるかなり特殊なオプションです。..など)した時だけ働いてファイル・リストを生成し、makefileへ出力します。...)コマンドが働き、ファイル・リストが変化していたら自動的にビルド・システム生成コマンドを実行してから、そのまま自動的にビルドします。公式のドキュメントに注意事項として次のように記載されています。(Google翻訳して整形)しかし、Windowsで後述の使い方をした時は期待通りに動作しました。注:GLOBを使用してソースツリーからソースファイルのリストを収集することはお勧めしません。ソースの追加または削除時にCMakeLists.txtファイルが変更されない場合、生成されたビルドシステムは、CMakeに再生成をいつ依頼するかを知ることができません。CONFIGURE_DEPENDSフラグは、すべてのジェネレーターで確実に機能しない場合があります。将来サポートされない新しいジェネレーターが追加された場合、それを使用するプロジェクトはスタックします。CONFIGURE_DEPENDSが確実に機能する場合でも、再構築のたびにチェックを実行するコストがかかります。余談ですが、Google翻訳がすごくなっている!最近のGoogle翻訳の精度がすごいですね。慣用的な表現まで翻訳してくれるので驚いています。時として単語の持つ別の意味で翻訳されることもあるので要注意ですが、翻訳が本当に楽になりました。それではお試し用のサンプルです。ソース・ファイルを3つとCMakeLists.txtを次のように追加しています。...)で抽出されずadd_executable()へ与えられません。bar.cでmain()関数を定義しているので、これをビルドするとmain()関数無しエラーになります。