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=MACHINEcmake コマンドに渡します。

以下の例は、CMAKE_LANG_C_TOOLCHAIN_MACHINEarm-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)

このコードは、以下のことを行います。

  1. CMake のバージョン 3.10 以降を必要とすることを宣言します。
  2. プロジェクトの名前を hello_world に設定します。
  3. CMake ツールチェーンファイルの場所を path/to/android-ndk/build/cmake/android.toolchain.cmake に設定します。
  4. CMAKE_LANG_C_TOOLCHAIN_MACHINEarm-linux-androideabi に設定します。
  5. プロジェクト hello_world を作成します。
  6. 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_MACHINEqemu-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_NAMECMAKE_SYSTEM_PROCESSOR は、CMake にターゲットとなるシステムに関する情報を提供する変数です。これらの変数を設定することで、CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE 変数を設定せずにクロスコンパイルを行うことができます。

以下の例は、CMAKE_SYSTEM_NAMElinux に、CMAKE_SYSTEM_PROCESSORarm に設定する方法を示しています。

cmake -DCMAKE_SYSTEM_NAME=linux -DCMAKE_SYSTEM_PROCESSOR=arm .
  • 上記の代替方法は、すべての状況で CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE 変数を使用するのと同じ結果を保証するわけではありません。