CMake: CMAKE_CROSSPLATFORM モジュールでクロスコンパイルをスマートに制御
CMAKE_CROSSCOMPILING
は、CMake がクロスコンパイルを実行しているかどうかを示すブール値の変数です。クロスコンパイルとは、異なるアーキテクチャやオペレーティングシステム用のソフトウェアをコンパイルするプロセスです。
設定方法
CMAKE_CROSSCOMPILING
変数は、以下の方法で設定できます。
- CMakeLists.txt ファイルで
set(CMAKE_SYSTEM_NAME <ターゲットプラットフォーム>)
コマンドを使用します。 - ツールチェーンファイルで
CMAKE_SYSTEM_NAME
を設定します。 - CMake コマンドラインオプション
-DCMAKE_SYSTEM_NAME=<ターゲットプラットフォーム>
を使用します。
使用方法
CMAKE_CROSSCOMPILING
変数は、CMakeLists.txt ファイル内で、クロスコンパイル固有の処理を行うために使用できます。例えば、以下のような処理に使用できます。
- ヘッダーファイルの検索パスを調整する
- ターゲットプラットフォームに固有のライブラリをリンクする
- クロスコンパイラ用のフラグを設定する
例
cmake_minimum_required(VERSION 3.10)
project(myproject)
if(CMAKE_CROSSCOMPILING)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
endif()
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram mylib)
上記の例では、CMAKE_CROSSCOMPILING
変数が TRUE
の場合、32 ビットアーキテクチャ用のフラグ -m32
が CMAKE_CXX_FLAGS
変数に追加されます。
- クロスコンパイルする場合、CMakeLists.txt ファイル内で
CMAKE_SYSTEM_NAME
変数を設定する必要があります。 CMAKE_CROSSCOMPILING
変数は、必ずしも正確ではありません。例えば、Apple デバイスのビルドでは、CMAKE_CROSSCOMPILING
変数は常にFALSE
に設定されます。
cmake_minimum_required(VERSION 3.10)
project(myproject)
# ターゲットプラットフォームを設定
set(CMAKE_SYSTEM_NAME Linux-i386)
# クロスコンパイルしているかどうかを確認
if(CMAKE_CROSSCOMPILING)
# 32 ビットアーキテクチャ用のフラグを設定
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
endif()
add_executable(myprogram myprogram.cpp)
# ライブラリをリンク
target_link_libraries(myprogram mylib)
このコードは、以下のようになります。
cmake_minimum_required
コマンドを使用して、CMake の最低バージョンを 3.10 に設定します。project
コマンドを使用して、プロジェクトの名前をmyproject
に設定します。set(CMAKE_SYSTEM_NAME Linux-i386)
コマンドを使用して、ターゲットプラットフォームを 32 ビット Linux に設定します。if(CMAKE_CROSSCOMPILING)
ステートメントを使用して、CMAKE_CROSSCOMPILING
変数がTRUE
の場合のみ、以下の処理を実行します。set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
コマンドを使用して、32 ビットアーキテクチャ用のフラグ-m32
をCMAKE_CXX_FLAGS
変数に追加します。add_executable
コマンドを使用して、実行可能ファイルmyprogram
をmyprogram.cpp
ファイルから作成します。target_link_libraries
コマンドを使用して、myprogram
にmylib
ライブラリをリンクします。
このコードを実行すると、32 ビットアーキテクチャ用の myprogram
バイナリが作成されます。
- CMake 変数
CMAKE_CROSSCOMPILING
は、CMakeLists.txt ファイル内で、クロスコンパイル固有の処理を行うために使用できます。 - クロスコンパイルするには、適切なクロスコンパイラとツールチェーンがインストールされている必要があります。
- このコードは、あくまでも例であり、実際のプロジェクトでは状況に応じて変更する必要があります。
以下に、CMAKE_CROSSCOMPILING
変数の代替方法をいくつか紹介します。
CMAKE_SYSTEM_NAME 変数を使用する
CMAKE_SYSTEM_NAME
変数は、ターゲットプラットフォームの名前を格納します。この変数を使用して、クロスコンパイルかどうかを判断できます。
if(CMAKE_SYSTEM_NAME MATCHES "Linux-i386")
# 32 ビットアーキテクチャ用のフラグを設定
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
endif()
上記の例では、CMAKE_SYSTEM_NAME
変数が Linux-i386
の場合、32 ビットアーキテクチャ用のフラグ -m32
が CMAKE_CXX_FLAGS
変数に追加されます。
CMAKE_TOOLCHAIN_FILE 変数を使用する
CMAKE_TOOLCHAIN_FILE
変数は、CMake が使用するツールチェーンファイルのパスを格納します。この変数を使用して、クロスコンパイルかどうかを判断できます。
if(CMAKE_TOOLCHAIN_FILE)
# クロスコンパイルしている
message(STATUS "クロスコンパイルを実行しています")
endif()
上記の例では、CMAKE_TOOLCHAIN_FILE
変数が設定されている場合、クロスコンパイルを実行していることがメッセージとして出力されます。
CMAKE_CROSSPLATFORM モジュールを使用する
CMake には、クロスプラットフォーム開発を支援する CMAKE_CROSSPLATFORM
モジュールが用意されています。このモジュールを使用して、クロスコンパイルかどうかを判断できます。
cmake_minimum_required(VERSION 3.10)
project(myproject)
include(CMake_CROSSPLATFORM)
if(CROSSPLATFORM_TOOLCHAIN)
# クロスコンパイルしている
message(STATUS "クロスコンパイルを実行しています")
endif()
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram mylib)
上記の例では、CMAKE_CROSSPLATFORM
モジュールがインクルードされ、CROSSPLATFORM_TOOLCHAIN
変数が設定されている場合、クロスコンパイルを実行していることがメッセージとして出力されます。
環境変数を使用する
CC
, CXX
, CFLAGS
, CXXFLAGS
などの環境変数を使用して、クロスコンパイルかどうかを判断できます。
if(NOT DEFINED CMAKE_SYSTEM_NAME)
set(CMAKE_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME})
endif()
if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_PROCESSOR})
endif()
if(CMAKE_SYSTEM_NAME NEQ CMAKE_SYSTEM_PROCESSOR)
# クロスコンパイルしている
message(STATUS "クロスコンパイルを実行しています")
endif()
上記の例では、CMAKE_SYSTEM_NAME
変数と CMAKE_SYSTEM_PROCESSOR
変数が設定されていない場合、それらを CMAKE_HOST_SYSTEM_NAME
変数と CMAKE_HOST_PROCESSOR
変数から設定します。その後、CMAKE_SYSTEM_NAME
変数と CMAKE_SYSTEM_PROCESSOR
変数が異なる場合、クロスコンパイルを実行していることがメッセージとして出力されます。
- CMake 変数
CMAKE_CROSSCOMPILING
は、CMakeLists.txt ファイル内で、クロスコンパイル固有の処理を行うために使用できます。 - クロスコンパイルするには、適切なクロスコンパイラとツールチェーンがインストールされている必要があります。
- 上記の方法は、あくまでも例であり、実際のプロジェクトでは状況に応じて変更する必要があります。