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_64aarch64 など
  • macOS: arm64x86_64 など
  • Windows: AMD64x86 など

クロスコンパイルでの注意点

クロスコンパイルを行う場合、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_32ARCH_ABI_64 など
  • Windows
    PROCESSOR_ARCHITECTUREAMD64 など

これらの変数は、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 変数クロスコンパイルに適しているビルドマシンとターゲットシステムのアーキテクチャが異なる場合に注意が必要
手動設定簡単詳細な知識が必要

最適な方法の選択

最適な方法は、個々の状況によって異なります。以下の点を考慮して選択してください。

  • 詳細な制御が必要かどうか
  • クロスコンパイルを行うかどうか
  • ビルド対象のアーキテクチャ
  • 使用しているオペレーティングシステム