今年もよろしくお願い致します。CMakeについてもそろそろネタがなくなってきました。私自身が良く使っている機能について一通り解説が終わったという状況です。そこで、今回でCMake講座を終了とし、今までの「まとめ」的なサンプルと、もう少し残っている解説した方が良い項目について解説します。1.お題CMakeの機能を使って、次のようなプロジェクトを作ります。boostをダウンロードし、解凍する。そのboostをビルドする。(今回は静的リンク用)上記処理をCMakeLists.tstから呼び出して、Makefile生成時に自動実行する。そのCMakeLists.txtは、上記boostのFormatを用いるプロジェクトとする。ビルド完了時にターゲットを自動実行する。複雑なプロジェクトなので、今まで解説してきたことをそれなりに使います。講座最後のまとめとして良いかなと思います。2.boostを準備するCMakeスクリプト上記のboostのダウンロード~ビルドまでの処理(boostを準備する処理)はCMakeスクリプトで処理します。「流れ作業」なので分離すると分かりやすく使いやすいと思います。CMakeスクリプトへのパラメータの渡し方CMakeLists.txtから呼び出すのでboostをダウンロードする先等をCMakeLists.txtから指定したいです。-Pコマンドで呼び出します。その時は説明していませんが、パラメータも渡せます。オプションでCMake変数を定義します。-Dオプションを使ってマクロを定義するのと良く似ています。-Dオプションは-Pオプションより前で指定して下さい。後ろで指定すると無視されるようです。コマンド・ラインで使う時はつい後ろに書きたくなるので、始めて使った時かなり悩みました。フォルダ生成boostの準備はビルド・フォルダにておこなうので、まず最初にダウンロード先のフォルダを生成します。これは前回解説したfileコマンドのMAKE_DIRECTORYを使います。ファイルのダウンロードダウンロード元のURLとダウンロード先ファイルのパスを指定してダウンロードします。SHOW_PROGRESS)SHOW_PROGRESSを指定するとダウンロードの進行状況が表示されます。ダウンロードに数分かかることがあるのでハングアップと勘違いしないよう指定することをお勧めします。tarコマンド(圧縮/解凍ツール)が内蔵されています。コマンドで呼び出すことができます。CMakeスクリプトから呼び出すのでexecute_process()コマンドで呼び出します。CMakeのフル・パスへ展開されます。(例えばWindowsの場合cmake.exeのフル・パス)WORKING_DIRECTORYはコマンドを起動する時の作業フォルダを指定します。tarコマンドでは作業フォルダへ解凍します。コマンドを生成し、b2コマンドで様々なパラメータを指定して必要なboostをビルドします。詳しくはタイトルのリンク先をご覧下さい。"boostのソース・フォル")ここでは静的リンク用(fPIC無し)で、リリース・ビルドのみ指定しています。variantでdebugを指定するとデバッグ・ビルド用にビルドします。msvcでは「variant=release,debug」という指定が可能ですが、gccではどちらか一方のみ指定できます。(ビルド・システムの考え方の相違が原因と思います。Makefile生成時に呼び出してboostの準備を整え、そのboostを用いるサンプルをビルドして実行するCMakeLists.txtです。用いるサンプル・ソースを微修正したものを用います。boostの準備boostは、ビルド・フォルダに専用フォルダ(boost)を用意して、そこへダウンロード→解凍→ビルド→インストールして使います。${CMAKE_CURRENT_SOURCE_DIR}/boost_build.cmake)execute_process()はビルド時ではなくMakefile生成時に実行されることをお忘れなきよう。boostのインクルード・パス等をCMake変数へ設定するそのためのCMakeのコマンドfind_packageを使います。=${Boost_LIBRARIES}")実は、boost::formatはヘッダ・オンリーなのでライブラリを指定していないため、Boost_LIBRARIESは空です。ターゲットのビルド指定boost::formatのサンプル・ソースをビルドするための指定です。最後にターゲットの実行コマンド(とgenerator-expressions)これは今回始めて解説します。ターゲットをビルドした後、実行したいこともあります。ボタンを押すようなイメージですね。CMakeに含まれるテスト・ツールCTestを呼び出すなどいくつかの方法が考えられますが、ここではビルド後イベント(POST_BUILD)を用います。CTestの問題点CTestをexecute_processで呼び出す場合、日本語が文字化けするという問題がありました。治っている可能性もありますが、そもそも「CTestをexecute_processから呼び出す」という使い方を想定していない雰囲気でしたので修正されていない可能性もあります。「cmake-generator-expressionsを使用できます」との記述があることに気がついた方もいらっしゃると思います。いうと、Makefile生成モードで定義された値(主に各種パス)へ展開できる式です。スクリプト・モードでは使えません。用いますが、前者では使えず、後者では使える式です。これについてQiitaで解説されている方がいらっしゃいますので参考になると思います。ここでは、$<TARGET_FILE:ターゲット名>を使います。これは指定したターゲット(add_executableやadd_library等で指定したもの)で最終生成ファイル(exeやdll等)へのフル・パスへ展開されます。add_custom_command()のPOST_BUILDのCOMMANDへ指定することで、ターゲットのビルド完了後に自動的に呼び出されます。$<TARGET_FILE:sample>)4.サンプル・ソースと実行結果サンプル・ソースは冒頭にも書いたようにboostのFormatを用いたちょっとした便利ツールです。7.4.0」にて動作確認しています。5.まとめのまとめ概ね1ヶ月に1回更新し、約1年間CMakeの使い方について解説してきましたが、とうとうネタも付きてしまいましたので、CMake編はこれで終了とさせて頂きます。長い間お付き合いありがとうございました!!さて、今後のC++講座についてはまだ決めていませんので、次回開催がいつになるか未定ですが、解説できるネタが十分にたまったらQtについて解説したいとつらつら考えているところです。C++は非常に強力なマルチプラットフォームな言語ですが、GUIについてはからきしです。そのC++の超巨大な弱点に光を当てる最も完成度の高いプロジェクトがQtと思います。Qtを使えるC++プログラマーへの需要が徐々に高まりつつあるように思いますし、少し後になると思いますが、再開したいと考えています。コメントをキャンセルメールアドレスが公開されることはありません。テクノロジーの登録商標です。technology.。