CMakeでCPUアーキテクチャに合わせた最適なビルドを実現!「CMAKE_HOST_SYSTEM_PROCESSOR」徹底解説
CMAKE_HOST_SYSTEM_PROCESSOR
は、CMakeにおける重要な変数の一つであり、ビルドを実行しているマシンのCPUアーキテクチャを表します。クロスコンパイルを行う場合、この変数はターゲットシステムとは異なる値を持つことに注意する必要があります。
用途
この変数は、主に以下の目的で使用されます。
- アーキテクチャ固有のオプションの設定: ビルドプロセスにおけるアーキテクチャ固有のオプションを設定するために使用されます。
- アーキテクチャ固有のライブラリとヘッダーファイルのロード: ビルド対象アーキテクチャに固有のライブラリとヘッダーファイルをロードするために使用されます。
- 適切なコンパイラとリンカーの選択: ビルドマシンのCPUアーキテクチャに合ったコンパイラとリンカーを選択するために使用されます。
取得方法
CMAKE_HOST_SYSTEM_PROCESSOR
変数の値は、以下の方法で取得できます。
- コマンドライン:
-DCMAKE_HOST_SYSTEM_PROCESSOR=arch
のようなコマンドラインオプションを使用して、この変数の値を指定することができます。 - CMakeLists.txt ファイル内:
${CMAKE_HOST_SYSTEM_PROCESSOR}
変数を使用することで、CMakeLists.txt ファイル内でこの変数の値を参照することができます。
具体的な値
CMAKE_HOST_SYSTEM_PROCESSOR
変数の値は、オペレーティングシステムによって異なります。以下に、一般的なオペレーティングシステムにおける例を示します。
- Linux:
x86_64
、aarch64
など - macOS:
arm64
、x86_64
など - Windows:
AMD64
、x86
など
クロスコンパイルでの注意点
クロスコンパイルを行う場合、CMAKE_HOST_SYSTEM_PROCESSOR
変数はビルドマシンのCPUアーキテクチャを表すことに注意する必要があります。ターゲットシステムのCPUアーキテクチャは、CMAKE_SYSTEM_PROCESSOR
変数を使用して設定する必要があります。
例
以下の例は、CMAKE_HOST_SYSTEM_PROCESSOR
変数を使用して、ビルドマシンのCPUアーキテクチャに合ったコンパイラを選択する方法を示しています。
IF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64")
SET(CMAKE_CXX_COMPILER g++-64)
ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64")
SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++-64)
ENDIF()
IF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64")
SET(CMAKE_CXX_COMPILER g++-64)
ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64")
SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++-64)
ENDIF()
説明
この例では、CMAKE_HOST_SYSTEM_PROCESSOR
変数を使用して、ビルドマシンのCPUアーキテクチャを判定します。
- ビルドマシンのCPUアーキテクチャが
arm64
の場合、aarch64-linux-gnu-g++-64
コンパイラが選択されます。 - ビルドマシンのCPUアーキテクチャが
x86_64
の場合、g++-64
コンパイラが選択されます。
例2:アーキテクチャ固有のライブラリをロードする
IF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64")
TARGET_LINK_LIBRARIES(my_target x86_64_lib)
ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64")
TARGET_LINK_LIBRARIES(my_target arm64_lib)
ENDIF()
説明
この例では、CMAKE_HOST_SYSTEM_PROCESSOR
変数を使用して、ビルドマシンのCPUアーキテクチャに合ったライブラリをロードします。
- ビルドマシンのCPUアーキテクチャが
arm64
の場合、arm64_lib
ライブラリがロードされます。 - ビルドマシンのCPUアーキテクチャが
x86_64
の場合、x86_64_lib
ライブラリがロードされます。
例3:アーキテクチャ固有のオプションを設定する
IF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64")
SET(CMAKE_C_FLAGS "-march=native")
ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64")
SET(CMAKE_C_FLAGS "-march=armv8-a")
ENDIF()
説明
この例では、CMAKE_HOST_SYSTEM_PROCESSOR
変数を使用して、ビルドマシンのCPUアーキテクチャに合ったコンパイラオプションを設定します。
- ビルドマシンのCPUアーキテクチャが
arm64
の場合、-march=armv8-a
オプションが設定されます。これは、ARMv8-A アーキテクチャ用の命令セットを使用するようにコンパイラに指示します。 - ビルドマシンのCPUアーキテクチャが
x86_64
の場合、-march=native
オプションが設定されます。これは、ネイティブアーキテクチャ用の命令セットを使用するようにコンパイラに指示します。
システム固有の変数を使用する
オペレーティングシステムによっては、CMAKE_HOST_SYSTEM_PROCESSOR
変数よりも詳細な情報を提供するシステム固有の変数が存在します。
例
- Linux
uname -m
コマンド - macOS
ARCH_ABI_32
、ARCH_ABI_64
など - Windows
PROCESSOR_ARCHITECTURE
、AMD64
など
これらの変数は、CMAKE_HOST_SYSTEM_PROCESSOR
変数よりも詳細な情報を提供するため、より具体的な条件分岐を行うことができます。
クロスコンパイラツールチェーンを使用する
クロスコンパイルを行う場合、CMAKE_TOOLCHAIN_FILE
オプションを使用して、クロスコンパイラツールチェーンを指定することができます。ツールチェーンファイルには、ターゲットシステムの CPU アーキテクチャに関する情報が含まれているため、CMAKE_HOST_SYSTEM_PROCESSOR
変数は必要ありません。
CMAKE_SYSTEM_PROCESSOR 変数を使用する
CMAKE_SYSTEM_PROCESSOR
変数は、ターゲットシステムの CPU アーキテクチャを表します。この変数は、クロスコンパイルを行う場合などに使用することができます。
手動で設定する
CMAKE_HOST_SYSTEM_PROCESSOR
変数は、-DCMAKE_HOST_SYSTEM_PROCESSOR=arch
コマンドラインオプションを使用して手動で設定することができます。
各方法の比較
方法 | メリット | デメリット |
---|---|---|
システム固有の変数 | より詳細な情報 | オペレーティングシステムによって異なる |
クロスコンパイラツールチェーン | 詳細な制御 | ツールチェーンファイルの作成が必要 |
CMAKE_SYSTEM_PROCESSOR 変数 | クロスコンパイルに適している | ビルドマシンとターゲットシステムのアーキテクチャが異なる場合に注意が必要 |
手動設定 | 簡単 | 詳細な知識が必要 |
最適な方法の選択
最適な方法は、個々の状況によって異なります。以下の点を考慮して選択してください。
- 詳細な制御が必要かどうか
- クロスコンパイルを行うかどうか
- ビルド対象のアーキテクチャ
- 使用しているオペレーティングシステム