2020年3月17日火曜日

Android/iOS向けのC/C++ライブラリをビルドするときにCMakeで引っ掛かった話

iOS/Androidの両方でOSSのライブラリを使いたい.そして,CMakeLists.txtはなるべく共通にしたい,と思って弄っていてハマったことのメモ.

プラットフォームの区別でハマる


プラットフォームでフォルダを区別するために,フォルダ名を設定する処理を次のように書いてました.

if(APPLE)
  set(PLATFORM_NAME "iOS")
elseif(ANDROID)
  set(PLATFORM_NAME "Android")
endif()

project(library)

でも,上手くいかないので何故かと思いきや,projectの後に書かないといけなかったんですね.

project(library)

if(APPLE)
  set(PLATFORM_NAME "iOS")
elseif(ANDROID)
  set(PLATFORM_NAME "Android")
endif()

iOSのビルド設定でハマる


iOS向けのビルドをするために,CMAKE_OSX系の変数をsetする場合,projectより先に書かないといけない.ドキュメントにはちゃんと書いていました.適当に拾ってきたものを利用してちゃんと調べないとダメですね.

iOS向けのCheckIncludeFile


使う場合,CMAKE_TRY_COMPILE_TARGET_TYPEをSTATIC_LIBRARYにしておかないとダメなようです.

オブジェクトライブラリでハマる


ドキュメントでも名指しされていますが,Xcodeはオブジェクトライブラリだけを利用して,そこからstaticライブラリとsharedライブラリを作る,ということができません.

iOS/Androidの両方で使える記述にしようと思うと,ソースコードは変数にまとめるしかなさそうです.ちなみに,自分の場合はstaticライブラリだけで良かったので,add_libraryに直接書きました.

インストールでハマる


特定の名前で特定のフォルダに出力されるようにしようと思ったんです.で,installコマンドで良いか,と思ったんですが,Xcodeで上手くいかない.おそらく使い方の問題だとは思うのですが,色々と面倒になったところで,楽な方法を見つけました.

set_target_properties(
  library
  PROPERTIES
  ARCHIVE_OUTPUT_DIRECTORY_DEBUG lib/${PLATFORM_NAME}/Debug
  ARCHIVE_OUTPUT_DIRECTORY_RELEASE lib/${PLATFORM_NAME}/Release
  ARCHIVE_OUTPUT_NAME_DEBUG library_debug
  ARCHIVE_OUTPUT_NAME_RELEASE library_release
)

出力ディレクトリ(ARCHIVE_OUTPUT_DIRECTORY)と出力名(ARCHIVE_OUTPUT_NAME)をプロパティとして指定できるので,最初から出力先を指定しておけば良かったのです.

ビルドでハマる


Androidの場合,Ninjaを利用してビルドします.Ninjaはシングルコンフィギュレーション,つまりビルド設定を生成する際にDebugやReleaseを指定しておく必要があります.そのため,ビルドの際にはコンフィギュレーションを指定する必要はありません.

次のコマンドは,buildフォルダにビルド設定を生成した場合です.

cmake -G Ninja その他オプション -DCMAKE_BUILD_TYPE=Debug -B build
cmake --build build

一方,Xcodeはマルチコンフィギュレーション,つまり実際のビルド時にコンフィギュレーションを指定するタイプです.そのため,ビルドの手順がAndroidと若干異なります.

cmake -G Xcode その他のオプション -B build
cmake --build build --config Debug

0 件のコメント:

コメントを投稿