はじめに
meta-oeなどには様々なライブラリのパッケージが提供されている。
その中には依存関係のあるパッケージのビルド時にだけ使用する、*.a
しか提供しないパッケージも存在する。
SDKを使用してアプリケーションを開発する際にそのようなパッケージの提供するライブラリを使用したいケースでは、 少しコツが必要なのでまとめておく。
今回はそのようなパッケージの例としてabseil-cpp
を使用する。
サンプルアプリ
abseilを使用するサンプルアプリケーションを作成していく。
ソースコード
main.cpp
として下記の内容を作成する。
内容はここから拝借している。
#include <iostream> #include <string> #include <vector> #include "absl/strings/str_join.h" int main() { std::vector<std::string> v = {"foo", "bar", "baz"}; std::string s = absl::StrJoin(v, "-"); std::cout << "Joined string:" << s << "\n"; }
CMakeLists.txt
CMakeLists.txt
も下記の内容で作成する。
こちらもここから拝借。
cmake_minimum_required(VERSION 3.5) project(my_project) # Abseil requires C++11 set(CMAKE_CXX_STANDARD 11) # Import Abseil's CMake targets find_package(absl REQUIRED) add_executable(hello_world hello_world.cc) # Declare dependency on the absl::strings library target_link_libraries(hello_world absl::strings)
SDKでビルド
local.conf
で下記を設定した状態で作成したSDKでこれをビルドする。
IMAGE_INSTALL_append = " abseil-cpp"
アプリのビルドは下記の手順。
$ source /opt/poky/3.1.3/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi $ mkdir build $ cd build $ cmake ..
abseilのパッケージ(absl)が見つからないというエラーになる。
Call Stack (most recent call first): /opt/poky/3.1.3/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/lib/cmake/absl/abslConfig.cmake:41 (include) CMakeLists.txt:8 (find_package) -- Configuring incomplete, errors occurred!
SDKのsysrootにabseilのライブラリが正しく含まれていないため発生する。
レシピを作成
適当なレイヤを作ってrecipes-exampleの下にabsl_0.1.bb
を作成する。
DESCRIPTION = "abseil sample application" SECTION = "examples" LICENSE = "Apache-2.0" HOMEPAGE = "https://abseil.io/docs/cpp/tools/cmake-installs" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" SRC_URI = "file://main.cpp \ file://CMakeLists.txt \ " inherit cmake DEPENDS += "abseil-cpp" S = "${WORKDIR}" FILES_${PN} = "${bindir}/*"
main.cpp
とCMakeLists.txt
はレシピと同じディレクトリのfiles
ディレクトリに格納する。
このレシピからはabseil-cpp
のパッケージに依存関係を設定している。
bitbakeでabslをビルド
作成したabsl_0.1.bb
が格納されているレイヤをbitbake対象に追加した状態で次のコマンドを実行する。
$ bitbake absl
問題なくビルドが通る。
それではこのレシピをlocal.conf
でIMAGE_INSTALL_append
した状態でSDKを作成すれば解決できるだろうか。
実際にやってみると分かるが、この方法ではSDKにabseilのライブラリが含まれることは無い。
abseil-cppのパッケージはスタティックなライブラリのみを提供しているため、
ビルドに必要なライブラリはすべてabseil-cpp-staticdev
に含まれている。ビルド時の依存関係の指定はレシピ名を設定すると
そのレシピが提供するサブパッケージがすべて解決されるが、SDK作成時には明示的に指定しないとstaticdev
パッケージは含まれないためである。
SDK作成時に特定のレシピのstaticdevを追加
SDKを作成する際に特定のレシピが提供するstaticdevパッケージを追加するにはlocal.conf
に下記を追加する。
TOOLCHAIN_TARGET_TASK_append = " abseil-cpp-staticdev"
SDK作成時にすべてのレシピのstaticdevを追加
SDKを作成する際に すべての レシピが提供するstaticdevパッケージを追加するにはlocal.conf
に下記を追加する。
SDKIMAGE_FEATURES_append = " staticdev-pkgs"
まとめ
bitbakeでイメージを生成する際にはあまり意識する必要がないstaticdevパッケージだが、 イメージのユーザーにSDKを提供する際には注意が必要となる。