CMakeでAndroidアプリ開発をもっと便利に!CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINEの使い方
CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
は、CMake のクロスコンパイル機能において、Android ツールチェーンのバイナリユーティリティが使用するマシンアーキテクチャを指定するために使用される変数です。これは、CMAKE_LANG_XXX_TOOLCHAIN_MACHINE
ファミリーの変数の 1 つであり、それぞれの XXX
は、C、C++、Fortran などのプログラミング言語を表します。
役割
この変数は、Android 向けにクロスコンパイルする場合に特に重要となります。なぜなら、Android ツールチェーンは特定のマシンアーキテクチャ向けに構築されており、そのアーキテクチャに一致するバイナリユーティリティを使用する必要があるからです。
設定方法
CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
は、以下の方法で設定できます。
- 環境変数
CMAKE_LANG_XXX_TOOLCHAIN_MACHINE
環境変数を設定します。 - CMakeLists.txt ファイル
set(CMAKE_LANG_XXX_TOOLCHAIN_MACHINE MACHINE)
をCMakeLists.txt
ファイル内に記述します。 - コマンドラインオプション
-DCMAKE_LANG_XXX_TOOLCHAIN_MACHINE=MACHINE
をcmake
コマンドに渡します。
例
以下の例は、CMAKE_LANG_C_TOOLCHAIN_MACHINE
を arm-linux-androideabi
に設定する方法を示しています。
# コマンドラインオプション
cmake -DCMAKE_LANG_C_TOOLCHAIN_MACHINE=arm-linux-androideabi .
# CMakeLists.txt ファイル
set(CMAKE_LANG_C_TOOLCHAIN_MACHINE arm-linux-androideabi)
# 環境変数
export CMAKE_LANG_C_TOOLCHAIN_MACHINE=arm-linux-androideabi
- 複数のアーキテクチャ向けにクロスコンパイルする場合、それぞれのアーキテクチャに対して個別に
CMAKE_LANG_XXX_TOOLCHAIN_MACHINE
を設定する必要があります。 CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
の値は、gcc -dumpmachine
コマンドで取得できます。
プログラミングにおける活用
CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
は、以下のようないくつかのプログラミングシナリオで役立ちます。
- シミュレータやエミュレータの開発
シミュレータやエミュレータは、異なるアーキテクチャ上で動作するシステムを仮想的に実行します。この変数を使用して、シミュレータやエミュレータのターゲットとなるアーキテクチャに合わせたクロスコンパイルを行うことができます。 - 組み込みシステムの開発
組み込みシステムは、さまざまなハードウェアプラットフォーム上で動作するため、この変数を使用して、それぞれのプラットフォームに合わせたクロスコンパイルを行うことができます。 - Android デバイス向けアプリケーションの開発
Android デバイスはさまざまなアーキテクチャを搭載しているため、この変数を使用して、特定のデバイスに合わせたクロスコンパイルを行うことができます。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set(PROJECT_NAME hello_world)
set(CMAKE_TOOLCHAIN_FILE path/to/android-ndk/build/cmake/android.toolchain.cmake)
set(CMAKE_LANG_C_TOOLCHAIN_MACHINE arm-linux-androideabi)
project(hello_world)
add_executable(hello_world hello_world.c)
このコードは、以下のことを行います。
- CMake のバージョン 3.10 以降を必要とすることを宣言します。
- プロジェクトの名前を
hello_world
に設定します。 - CMake ツールチェーンファイルの場所を
path/to/android-ndk/build/cmake/android.toolchain.cmake
に設定します。 CMAKE_LANG_C_TOOLCHAIN_MACHINE
をarm-linux-androideabi
に設定します。- プロジェクト
hello_world
を作成します。 hello_world.c
ファイルからhello_world
という名前の実行可能ファイルを作成します。
hello_world.c
ファイルは、以下の内容で作成します。- 上記のコードは、Android NDK がインストールされていることを前提としています。
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
- このコードを実行するには、以下のコマンドを実行します。
cmake .
make
./hello_world
このコマンドを実行すると、hello_world
という名前の実行可能ファイルが生成され、実行すると "Hello, World!" というメッセージが表示されます。
以下の例は、CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
を使用して、シミュレータ上で動作する hello world
プログラムをクロスコンパイルする方法を示しています。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set(PROJECT_NAME hello_world)
set(CMAKE_TOOLCHAIN_FILE path/to/android-ndk/build/cmake/android.toolchain.cmake)
set(CMAKE_LANG_C_TOOLCHAIN_MACHINE qemu-armeabi)
project(hello_world)
add_executable(hello_world hello_world.c)
このコードは、CMAKE_LANG_C_TOOLCHAIN_MACHINE
を qemu-armeabi
に設定することで、QEMU エミュレータ上で動作する ARM アーキテクチャのバイナリを生成します。
代替方法
以下の 2 つの方法が考えられます。
CMAKE_TOOLCHAIN_FILE を使用する
CMAKE_TOOLCHAIN_FILE
は、CMake にツールチェーンに関する情報を提供するファイルです。このファイルに、ターゲットとなるマシンのアーキテクチャに関する情報を含めることで、CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
変数を設定せずにクロスコンパイルを行うことができます。
例
以下の例は、android.toolchain.cmake
という名前の CMAKE_TOOLCHAIN_FILE
を使用する方法を示しています。
# android.toolchain.cmake
set(CMAKE_SYSTEM_NAME linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# ... その他のツールチェーン情報 ...
この CMAKE_TOOLCHAIN_FILE
を使用するには、以下のコマンドを実行します。
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/android.toolchain.cmake .
CMAKE_SYSTEM_NAME と CMAKE_SYSTEM_PROCESSOR を使用する
CMAKE_SYSTEM_NAME
と CMAKE_SYSTEM_PROCESSOR
は、CMake にターゲットとなるシステムに関する情報を提供する変数です。これらの変数を設定することで、CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
変数を設定せずにクロスコンパイルを行うことができます。
例
以下の例は、CMAKE_SYSTEM_NAME
を linux
に、CMAKE_SYSTEM_PROCESSOR
を arm
に設定する方法を示しています。
cmake -DCMAKE_SYSTEM_NAME=linux -DCMAKE_SYSTEM_PROCESSOR=arm .
- 上記の代替方法は、すべての状況で
CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
変数を使用するのと同じ結果を保証するわけではありません。