プログラミング初心者でも安心!CMakeにおける CMAKE_LANG_COMPILER_ARCHITECTURE_ID の基礎知識


CMAKE_LANG_COMPILER_ARCHITECTURE_ID は、CMakeにおける内部変数であり、コンパイラのターゲットアーキテクチャに基づいてコンパイラのバリエーションを識別するために使用されます。これは、一部のコンパイラにおいて、正しい使用方法を決定するために必要となります。

バージョン

この変数は CMake 3.10 で導入されました。

データ型

string

用途

主に以下の目的で使用されます。

  • デバッグ情報の生成
    コンパイラのターゲットアーキテクチャに特化したデバッグ情報を生成するために使用されます。
  • 依存関係の処理
    コンパイラのターゲットアーキテクチャに基づいて、正しい依存関係を処理するために使用されます。
  • コンパイラオプションの生成
    コンパイラのターゲットアーキテクチャに特化したオプションを生成するために使用されます。

以下の例は、CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数を使用して、異なるターゲットアーキテクチャ用のコンパイラオプションを設定する方法を示しています。

# C++ コンパイラの場合
if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID MATCHES "x86")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
endif()

if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID MATCHES "x64")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
endif()

# C コンパイラの場合
if(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "x86")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
endif()

if(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "x64")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
endif()

注意点

CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数は内部変数であり、将来変更される可能性があります。そのため、この変数に直接依存するようなコードは避けることを推奨します。

  • この変数は、すべてのコンパイラでサポートされているわけではありません。
  • この変数は、主にクロスコンパイルで使用されます。
  • CMake には、他にも多くの変数が用意されています。これらの変数については、CMake ドキュメントを参照してください。


# C++ コンパイラの場合
if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID MATCHES "x86")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
endif()

if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID MATCHES "x64")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
endif()

# C コンパイラの場合
if(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "x86")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
endif()

if(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "x64")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
endif()

説明

  • ターゲットアーキテクチャが "x64" の場合、コンパイラオプションに -m64 を追加します。これは、64 ビットコードを生成するようにコンパイラに指示します。
  • ターゲットアーキテクチャが "x86" の場合、コンパイラオプションに -m32 を追加します。これは、32 ビットコードを生成するようにコンパイラに指示します。
  • このコードでは、CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数を使用して、現在のターゲットアーキテクチャを取得しています。

例2: 依存関係の処理

以下の例は、CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数を使用して、ターゲットアーキテクチャに特化した依存関係を処理する方法を示しています。

target_link_libraries(myprogram ${LIBS})

if(CMAKE_LANG_COMPILER_ARCHITECTURE_ID MATCHES "x86")
  target_link_libraries(myprogram 32bit_lib)
endif()

if(CMAKE_LANG_COMPILER_ARCHITECTURE_ID MATCHES "x64")
  target_link_libraries(myprogram 64bit_lib)
endif()

説明

  • ターゲットアーキテクチャが "x64" の場合、64bit_lib ライブラリをプログラムにリンクします。
  • ターゲットアーキテクチャが "x86" の場合、32bit_lib ライブラリをプログラムにリンクします。
  • CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数を使用して、ターゲットアーキテクチャを取得しています。
  • このコードでは、target_link_libraries コマンドを使用して、プログラムに必要なライブラリをリンクしています。

例3: デバッグ情報の生成

set(CMAKE_DEBUG_POSTFIX ".dbg")

if(CMAKE_LANG_COMPILER_ARCHITECTURE_ID MATCHES "x86")
  set(CMAKE_DEBUG_POSTFIX ".32dbg")
endif()

if(CMAKE_LANG_COMPILER_ARCHITECTURE_ID MATCHES "x64")
  set(CMAKE_DEBUG_POSTFIX ".64dbg")
endif()

set(CMAKE_PDB_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pdb)
  • CMAKE_PDB_OUTPUT_DIRECTORY 変数を使用して、PDB ファイルの出力ディレクトリを設定しています。
  • ターゲットアーキテクチャが "x64" の場合、デバッグ情報のファイル拡張子を ".64dbg" に設定します。
  • ターゲットアーキテクチャが "x86" の場合、デバッグ情報のファイル拡張子を ".32dbg" に設定します。
  • CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数を使用して、ターゲットアーキテクチャを取得しています。
  • このコードでは、CMAKE_DEBUG_POSTFIX 変数を使用して、デバッグ情報のファイル拡張子を設定しています。
  • CMake に関する
  • この変数は、さまざまな目的に使用できます。
  • これらの例は、CMAKE_LANG_COMPILER_ARCHITECTURE_ID 変数を使用するほんの一例です。


システム情報を利用する

システム情報を使用して、ターゲットアーキテクチャを取得する方法があります。以下は、その例です。

# C++ コンパイラの場合
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
  set(CMAKE_CXX_ARCHITECTURE "x86")
endif()

if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
  set(CMAKE_CXX_ARCHITECTURE "x64")
endif()

# C コンパイラの場合
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
  set(CMAKE_C_ARCHITECTURE "x86")
endif()

if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
  set(CMAKE_C_ARCHITECTURE "x64")
endif()

説明

  • 同じように、CMAKE_C_ARCHITECTURE 変数を使用して、C コンパイラのターゲットアーキテクチャを設定します。
  • CPUアーキテクチャが "x86_64" の場合、CMAKE_CXX_ARCHITECTURE 変数に "x64" を設定します。これは、C++ コンパイラのターゲットアーキテクチャが x64 であることを示します。
  • CPUアーキテクチャが "x86" の場合、CMAKE_CXX_ARCHITECTURE 変数に "x86" を設定します。これは、C++ コンパイラのターゲットアーキテクチャが x86 であることを示します。
  • このコードでは、CMAKE_SYSTEM_PROCESSOR 変数を使用して、システムのCPUアーキテクチャを取得しています。

コンパイラ固有の変数を使用する

一部のコンパイラは、ターゲットアーキテクチャを取得するための独自変数を提供しています。以下は、その例です。

GCCの場合

# C++ コンパイラの場合
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  set(CMAKE_CXX_ARCHITECTURE "${CMAKE_CXX_COMPILER_TARGET}")
endif()

# C コンパイラの場合
if(CMAKE_C_COMPILER_ID MATCHES "GNU")
  set(CMAKE_C_ARCHITECTURE "${CMAKE_C_COMPILER_TARGET}")
endif()

説明

  • コンパイラの ID が "GNU" の場合、CMAKE_CXX_COMPILER_TARGET 変数と CMAKE_C_COMPILER_TARGET 変数を使用して、ターゲットアーキテクチャを取得します。
  • このコードでは、CMAKE_CXX_COMPILER_ID 変数と CMAKE_C_COMPILER_ID 変数を使用して、コンパイラの ID を取得しています。

Visual Studioの場合

# C++ コンパイラの場合
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  set(CMAKE_CXX_ARCHITECTURE "${CMAKE_CXX_COMPILER_PLATFORM}")
endif()

# C コンパイラの場合
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
  set(CMAKE_C_ARCHITECTURE "${CMAKE_C_COMPILER_PLATFORM}")
endif()

説明

  • コンパイラの ID が "MSVC" の場合、CMAKE_CXX_COMPILER_PLATFORM 変数と CMAKE_C_COMPILER_PLATFORM 変数を使用して、ターゲットアーキテクチャを取得します。
  • このコードでは、CMAKE_CXX_COMPILER_ID 変数と CMAKE_C_COMPILER_ID 変数を使用して、コンパイラの ID を取得しています。

クロスコンパイルツールを使用する

クロスコンパイルツールを使用して、ターゲットアーキテクチャを取得する方法があります。以下は、その例です。

# C++ コンパイラの場合
if(CMAKE_CROSSCOMPILING)
  set(CMAKE_CXX_ARCHITECTURE "<span class="math-inline">\{CMAKE\_CROSSCOMPILING\_TARGET\}"\)
endif\(\)
\# C コンパイラの場合
if\(CMAKE\_CROSSCOMPILING\)
set\(CMAKE\_C\_ARCHITECTURE "</span>{