この前Twitterでつぶやいたdebパッケージ化を試してみた
カメラカーや模型撮影カメラのプログラム、実機転送してビルドするよりラズパイ4でビルドしてdebパッケージにしてインストールのほうが色々簡単になる気がするし、試してみるか。
— まっちゃん (@mattyan_1117) March 10, 2023
ついでにビルド環境をDockerで組んで、「コンテナ動かせばdebファイルができてる」までやってみたい。
を試してみた。
最初はDebianパッケージのアレコレを調べていたんだけど、どうにもうまくできないのでCMakeのCPackを使用して作成。
CMakeLists.txtの改修
CMakeListsにはCPackの設定を追加
INSTALL(
TARGETS model_camera
RUNTIME DESTINATION /opt/model-camera
)
INSTALL(
FILES model-camera.service
DESTINATION /etc/systemd/system
)
SET(CPACK_GENERATOR "DEB")
SET(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
SET(CPACK_PACKAGE_CONTACT "mattyan.mail@gmail.com")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "mattyan")
SET(CPACK_PACKAGE_VERSION "2.4.0")
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libgstreamer1.0-0, gstreamer1.0-plugins-base, gstreamer1.0-plugins-base-apps, gstreamer1.0-plugins-bad, gstreamer1.0-plugins-good, gstreamer1.0-plugins-ugly")
INCLUDE(CPack)
INSTALLでインストール先を指定。今回は/opt以下に配置。systemdのサービスファイルは/etc/systemd/system以下に配置
SETでCPackの設定を諸々追加。CPACK_DEBIAN_PACKAGE_DEPENDSで依存パッケージをリストアップすると、aptでインストールするときに全部面倒見てくれる。今まで手であれこれ入れてたのが自動化されたのでだいぶインストールが楽になる。
これをビルドするためのDockerも作成
# debパッケージ作成用Docker
FROM debian:bullseye-slim
# パッケージインストール
RUN apt-get update && \
apt-get -y upgrade && \
apt-get -y install wget fakeroot cmake gcc build-essential libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev && \
wget https://project-downloads.drogon.net/wiringpi-latest.deb && \
dpkg -i wiringpi-latest.deb
# ソース類追加
RUN mkdir /src
COPY src /src/src
COPY img /src/img
COPY CMakeLists.txt /src
COPY model-camera.service /src
COPY build.sh /src
# ビルドスクリプト追加
WORKDIR /src
ENTRYPOINT [ "sh", "./build.sh" ]
raspberrypiosがDebian Bulluseyeベースみたいなので、DockerのベースもDebian Bullseye-slimで作成。パッケージ更新したあと必要なパッケージのインストール。wiringpiだけパッケージから入れられないので、wgetで取得してdpkgでインストール。
ビルドに必要なものを一通りCOPYしてからENTRYPOINTでビルドするようにして完成。
build.shは
#!/bin/bash
###
# ビルドしてdebファイルの作成
###
if [ -d build ]; then
rm -rf build
fi
mkdir build
cd build
cmake .. -DUSE_RENDERER_LCD=1 -DUSE_RENDERER_WEB_STREAM=1 -DUSE_EVENTLISTENER_GPIO=1 && \
make package && \
cp model_camera*.deb /packages
buildディレクトリを作って中でビルド。完成したパッケージを外にcpするスクリプト。
これを
docker build . --rm -t model-camera-build
でDockerビルドして
docker run -v $PWD/packages:/packages model-camera-build
で走らせたら、$“PWD/packagesにビルドされたパッケージが作成されるので、あとはコレをラズパイに転送してapt install ./model_camera_2.4.0_armhf.deb
でインストールすればいいはず。