JOB_POOL_PRECOMPILE_HEADER プロパティ徹底解説

2024-04-02

CMake の JOB_POOL_PRECOMPILE_HEADER プロパティ

JOB_POOL_PRECOMPILE_HEADER は、Ninja マルチビルドシステムを使用する場合、プリコンパイル済みヘッダー生成の並列処理を制御する CMake プロパティです。このプロパティを設定することで、ビルド時間の短縮を期待できます。

詳細

  • 対象: Ninja マルチビルドシステムのみ
  • 機能: プリコンパイル済みヘッダー生成の並列度を指定
  • デフォルト値: CMAKE_JOB_POOL_COMPILE の値
  • 設定方法:
    • ターゲットプロパティとして: set_property(TARGET myexe PROPERTY JOB_POOL_PRECOMPILE_HEADER <pool_name>)
    • CMake 変数として: set(CMAKE_JOB_POOL_PRECOMPILE_HEADER <pool_name>)

設定例

# 2 つのジョブプールを使ってプリコンパイル済みヘッダーを生成
set_property(TARGET myexe PROPERTY JOB_POOL_PRECOMPILE_HEADER two_jobs)

# 全てのターゲットで 4 つのジョブプールを使う
set(CMAKE_JOB_POOL_PRECOMPILE_HEADER four_jobs)

注意事項

  • Ninja マルチビルドシステム以外では無視されます。
  • ジョブプールは事前に定義しておく必要があります。詳細は JOB_POOLS プロパティを参照してください。
  • 並列度を上げすぎると、システム負荷が大きくなり、逆にビルド時間が長くなる可能性があります。

JOB_POOL_PRECOMPILE_HEADER プロパティは、Ninja マルチビルドシステムでプリコンパイル済みヘッダー生成を並列化し、ビルド時間の短縮に役立ちます。設定方法や注意事項を理解し、適切な値を設定することで、効率的なビルドを実現しましょう。



CMake の JOB_POOL_PRECOMPILE_HEADER プロパティ - サンプルコード

ターゲットプロパティとして設定

add_library(mylib SHARED mylib.c mylib.h)

# mylib ターゲットのみ、2 つのジョブプールを使ってプリコンパイル済みヘッダーを生成
set_property(TARGET mylib PROPERTY JOB_POOL_PRECOMPILE_HEADER two_jobs)

add_executable(myexe main.c mylib.h)

target_link_libraries(myexe mylib)

CMake 変数として設定

set(CMAKE_JOB_POOL_SIZE 4)

add_library(mylib1 SHARED mylib1.c mylib1.h)
add_library(mylib2 SHARED mylib2.c mylib2.h)

# 全てのターゲットで、4 つのジョブプールを使ってプリコンパイル済みヘッダーを生成
set(CMAKE_JOB_POOL_PRECOMPILE_HEADER four_jobs)

add_executable(myexe1 main.c mylib1.h)
add_executable(myexe2 main.c mylib2.h)

target_link_libraries(myexe1 mylib1)
target_link_libraries(myexe2 mylib2)

ジョブプールを定義

# 2 つのジョブプールを定義
set(JOB_POOLS two_jobs four_jobs)

set_property(JOB_POOL two_jobs POOL_SIZE 2)
set_property(JOB_POOL four_jobs POOL_SIZE 4)

add_library(mylib SHARED mylib.c mylib.h)

# mylib ターゲットで、two_jobs ジョブプールを使ってプリコンパイル済みヘッダーを生成
set_property(TARGET mylib PROPERTY JOB_POOL_PRECOMPILE_HEADER two_jobs)

add_executable(myexe main.c mylib.h)

target_link_libraries(myexe mylib)

プリコンパイル済みヘッダー生成の有効化/無効化

add_library(mylib SHARED mylib.c mylib.h)

# mylib ターゲットで、プリコンパイル済みヘッダー生成を無効化
set_property(TARGET mylib PROPERTY JOB_POOL_PRECOMPILE_HEADER NO)

add_executable(myexe main.c mylib.h)

target_link_libraries(myexe mylib)

上記のサンプルコードを参考に、JOB_POOL_PRECOMPILE_HEADER プロパティを適切に設定し、ビルド時間の短縮を実現しましょう。



CMake でプリコンパイル済みヘッダー生成を並列化する他の方法

CMAKE_CXX_FLAGS または CMAKE_C_FLAGS-j オプションを追加することで、コンパイラに並列処理を指示できます。

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -j4")

add_library(mylib SHARED mylib.c mylib.h)

add_executable(myexe main.c mylib.h)

target_link_libraries(myexe mylib)

make の -j オプションを使用

make コマンドに -j オプションを追加することで、ビルド全体の並列処理を指示できます。

cmake ..
make -j4

Ninja マルチビルドシステムは、デフォルトで並列処理を行うため、JOB_POOL_PRECOMPILE_HEADER プロパティを設定する必要はありません。

cmake .. -G Ninja
ninja

比較

方法メリットデメリット
JOB_POOL_PRECOMPILE_HEADER細かい制御が可能Ninja マルチビルドシステム以外では使えない
CMAKE_CXX_FLAGS / CMAKE_C_FLAGS設定が簡単コンパイラに依存する
make-j オプション全体的な並列処理が可能詳細な制御が難しい
Ninja マルチビルドシステムデフォルトで並列処理特殊な設定が必要

どの方法が最適かは、プロジェクトの規模や環境によって異なります。それぞれの方法の特徴を理解し、適切な方法を選択しましょう。




C++標準ライブラリ、テンプレートエンジン、シェルスクリプト... string()コマンドの代替方法を徹底比較

CMakeのstring()コマンドは、文字列処理を行うための強力なツールです。C++のstd::stringのような機能に加え、CMake特有の便利な機能も備えています。主な機能文字列の連結、分割、置換、比較大文字・小文字変換部分文字列の抽出



CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。


CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。


CMakeコマンド mark_as_advanced() の詳細解説

mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。


CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。



CMakeにおける CMAKE_MATCH_COUNT 変数の詳細解説

CMAKE_MATCH_COUNTは、CMakeのVariablesにおいて、正規表現マッチングの成功回数を格納する変数です。string(REGEX)やlist(FILTER)などのコマンドで正規表現を用いた処理を行った際に、マッチングした要素の数を取得できます。


CMake の CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数を使いこなす

CMAKE_LANG_COMPILER_ARCHITECTURE_ID は、CMake の内部変数であり、コンパイラの ターゲットアーキテクチャ を識別するために使用されます。これは、主に特定のコンパイラに対して、適切な使用方法を決定するために必要となります。


CMakeでQtプロジェクトのヘッダーファイル生成を制御:AUTOMOC_PATH_PREFIX徹底解説

AUTOMOC_PATH_PREFIX は、CMake の "Properties: Targets" におけるターゲットプロパティであり、Qt プロジェクトで moc コマンドの実行時に生成される -p オプションのパスプレフィックスを設定するために使用されます。


コードブロック内でのHTMLタグ使用

概要CMAKE_OPTIMIZE_DEPENDENCIES は、CMake 3.19 以降で導入された変数で、静的ライブラリの依存関係を最適化するための機能を提供します。静的ライブラリは、実行時に直接リンクされるのではなく、ビルド時に他のライブラリやオブジェクトファイルに埋め込まれます。そのため、静的ライブラリの依存関係を最適化することで、リンク時間の短縮やビルドサイズの削減などが期待できます。


CMAKE_DISABLE_PRECOMPILE_HEADERS を使用したサンプルコード

CMAKE_DISABLE_PRECOMPILE_HEADERS は、CMake でプリコンパイルされたヘッダーファイルの生成を無効にするブール型の変数です。デフォルトでは OFF に設定されており、プロジェクト内のすべてのターゲットに対してプリコンパイルされたヘッダーファイルが生成されます。