CMakeポリシー CMP0089 で IBM Clang ベース XL コンパイラを制御:詳細解説とサンプルコード


CMakeポリシー CMP0089 は、IBM Clang ベースの XL コンパイラで使用されるコンパイラ ID を制御します。これは、CMake 3.15 で導入され、Clang ベースの XL コンパイラが __ibmxl__ マクロを定義していることを認識しました。これらのコンパイラは、異なるコマンドラインと機能セットを持つ新しいフロントエンドであるため、以前のバージョンの CMake では単に XL として認識されていた xlc とは区別する必要があります。

動作

このポリシーには 2 つの動作があります。

  • NEW: 新しい動作では、Clang ベースの XL コンパイラには XLClang というコンパイラ ID が使用されます。これは、これらのコンパイラの機能をより正確に反映します。
  • OLD: 従来の動作では、Clang ベースの XL コンパイラでも XL というコンパイラ ID が使用されます。これは、CMake 3.15 以前のバージョンの動作と互換性があります。

設定方法

このポリシーは、cmake_policy() コマンドを使用して設定できます。

cmake_policy(SET CMP0089 NEW)

このコマンドは、project() または enable_language() コマンドが呼び出される前に実行する必要があります。

警告

CMake 3.20.0-rc3 以前のバージョンの場合、このポリシーが設定されていないと警告が表示されません。これは、CMake 3.20.0-rc3 以降ではデフォルトで OLD の動作になるためです。警告を有効にするには、CMAKE_POLICY_WARNING_CMP0089 変数を使用できます。

set(CMAKE_POLICY_WARNING_CMP0089 TRUE)

影響を受けるプロジェクト

このポリシーは、IBM Clang ベースの XL コンパイラを使用するプロジェクトに影響を与えます。これらのプロジェクトでは、CMake 3.15 以降を使用している場合、このポリシーを明示的に設定する必要があります。

利点

このポリシーを設定することで、以下の利点が得られます。

  • 将来的に新しいコンパイラ バージョンが導入された場合の互換性を向上させることができます。
  • Clang ベースの XL コンパイラの機能をより正確に反映できます。


cmake_minimum_required(VERSION 3.15)

project(MyProject)

cmake_policy(SET CMP0089 NEW)

set(SOURCE_FILES main.cpp)
set(CMAKE_C_COMPILER "clangxx")

add_executable(MyProject ${SOURCE_FILES})

このコードは、以下の操作を実行します。

  1. CMake の最小バージョンを 3.15 に設定します。
  2. MyProject という名前のプロジェクトを作成します。
  3. CMP0089 ポリシーを NEW に設定します。
  4. main.cpp ファイルをソース ファイルとして設定します。
  5. clangxx を C コンパイラとして設定します。
  6. MyProject という名前の実行可能ファイルを作成します。

このコードを実行するには、以下のコマンドを実行します。

mkdir MyProject
cd MyProject
cmake ..
make

このコマンドを実行すると、MyProject という名前の実行可能ファイルが作成されます。この実行可能ファイルをを実行するには、以下のコマンドを実行します。

./MyProject

このコードは、IBM Clang ベースの XL コンパイラを使用するプロジェクトをビルドするための基本的な例です。実際のプロジェクトでは、必要に応じてこのコードを拡張する必要があります。

以下のコードは、CMAKE_POLICY_WARNING_CMP0089 変数を使用して警告を有効にする方法を示す例です。

cmake_minimum_required(VERSION 3.15)

project(MyProject)

set(CMAKE_POLICY_WARNING_CMP0089 TRUE)

set(SOURCE_FILES main.cpp)
set(CMAKE_C_COMPILER "clangxx")

add_executable(MyProject ${SOURCE_FILES})
mkdir MyProject
cd MyProject
cmake ..
make


代替方法 1: 環境変数を使用する

以下の環境変数を設定することで、Clang ベースの XL コンパイラを識別できます。

CMAKE_C_COMPILER=clangxx
CMAKE_CXX_COMPILER=clangxx

これらの環境変数は、cmake_minimum_required() コマンドが呼び出される前に設定する必要があります。

代替方法 2: CMAKE_TOOLCHAIN_FILE を使用する

以下の toolchain ファイルを使用して、Clang ベースの XL コンパイラを指定できます。

cmake_minimum_required(VERSION 3.15)

project(MyProject)

set(CMAKE_TOOLCHAIN_FILE toolchain.cmake)

set(SOURCE_FILES main.cpp)

add_executable(MyProject ${SOURCE_FILES})

toolchain.cmake ファイルには、以下の内容を含める必要があります。

set(CMAKE_C_COMPILER clangxx)
set(CMAKE_CXX_COMPILER clangxx)

代替方法 3: CMake ターゲット プロパティを使用する

以下の CMake ターゲット プロパティを使用して、Clang ベースの XL コンパイラを指定できます。

cmake_minimum_required(VERSION 3.15)

project(MyProject)

set(SOURCE_FILES main.cpp)

target_link_libraries(MyProject ${CMAKE_C_COMPILER})

add_executable(MyProject ${SOURCE_FILES})

利点と欠点

それぞれの代替方法には、利点と欠点があります。

  • CMake ターゲット プロパティを使用する

    • 利点: ターゲット固有の設定を保存できる
    • 欠点: 設定が複雑
  • CMAKE_TOOLCHAIN_FILE を使用する

    • 利点: プロジェクト固有の設定を保存できる
    • 欠点: 設定が複雑
    • 利点: 設定が簡単
    • 欠点: 他のプロジェクトと競合する可能性がある

CMakeポリシー CMP0089 の代替方法はいくつかあります。どの方法を使用するかは、プロジェクトのニーズと要件によって異なります。