2021年10月24日日曜日

Ubuntu20.04でKiCadをビルド


背景

KiCadとはPCB(プリント基板)を設計可能なソフトウェアです。
ソースコードが公開されているので、仕組みの確認や機能の追加がやる気次第で可能です。

UbuntuでKiCadをビルドするにあたり結構詰まったので、関連情報と共に手順を記事として残します。

使ったもの

VirtualBox
Ubuntu20.04

PCにインストールして普段使っているUbuntuでは期待通りにビルド出来なかったので、VirtualBox上にまっさらなUbuntu環境を作って、そこでビルドしました。
関連プログラムのインストールやビルド領域のために、ストレージ15GB、メモリ2GB以上をそれぞれ割り当ててください。

Ubuntuに関連プログラムをインストール

下記コマンドを実行します。
sudo apt install git cmake build-essential freeglut3-dev libglew-dev libglm-dev libcurl4-openssl-dev libcairo-dev libboost-dev libngspice0-dev libocct-draw-dev libocct-ocaf-dev libocct-data-exchange-dev python3-dev python3-wxgtk4.0 libgtk-3-dev swig3.0 libwxgtk3.0-gtk3-dev libboost-system-dev libboost-test-dev libboost-filesystem-dev

上記ライブラリを入れてもcmakeでエラーが発生する場合は関連プログラムが変わった可能性があるので、cmakeのエラーログを読みつつ、それを解決してくれそうなライブラリを探してインストールしてみてください。

ソースコードをクローン(ダウンロード)してビルドしてインストール

ホームディレクトリにgitprojectsというディレクトリを作り、その中にkicadのソースコードをkicadというディレクトリ内にクローンします。
mkdir ~/gitprojects
cd ~/gitprojects
git clone https://gitlab.com/kicad/code/kicad.git

この記事で試したのは2021/10/24の下記コミットのソースコードです。
cd ~/gitprojects/kicad
git log
commit 328d3d0d77e7859a0a9a5cf66791df03448f6ee3 (HEAD -> master, origin/master)
Author: Jon Evans <jon@craftyjon.com>
Date: Sat Oct 23 22:46:31 2021 -0400

PNS: Fix rule resolution when starting from PTH

Have to use the routing start layer, not the first
layer of the PTH, to get the appropriate sizes

クローンしたディレクトリに入り、ビルドの生成物を格納するbuild/releaseディレクトリを作ります。
cd ~/gitprojects/kicad
mkdir -p build/release

build/releaseディレクトリ内でcmakeを実行してビルドの準備を行います。
cd ~/gitprojects/kicad/build/release
cmake -DCMAKE_BUILD_TYPE=Release ../../

cmakeが成功したらbuild/releaseディレクトリ内でmakeを実行してビルドします。
cd ~/gitprojects/kicad/build/release
make

makeが成功したらインストールコマンドを実行してkicadをOSにインストールします。
cd ~/gitprojects/kicad/build/release
sudo make install

インストールコマンドだけではOSがファイルの一部を認識できていないので、ldfonfigコマンドを実行します。
下記コマンド実行後は何もログが出ませんが、OSが扱う.soファイルの一覧が更新されるので、pcbnewを.soの読込エラー無く実行できるようになります。
sudo ldconfig

インストールできたら、コマンドやランチャーからkicadを実行可能になります。
kicad


詰まったこと

ストレージ10GBでは不十分

関連プログラムをインストールするうと、10GBでは足りなくなります。
ストレージ領域を可変にしているなら下記の対応で拡張はできますが、手間なので最初から15GBでVirtualBoxの仮想環境を作るのをお勧めします。

  1. ファイル->仮想メディアマネージャーを開く
  2. 該当する仮想環境を選び、ストレージ容量を増やす
  3. 仮想環境起動後にdiskを起動してパーティションの割当を拡張する

メモリ1GBでは不十分

VirtualBoxでのメモリ割り当てを1GBにしていると、ビルドの23%前後で下記のようなログと共にビルドが止まります。
[ 23%] Building CXX object common/CMakeFiles/gal.dir/gal/opengl/gl_resources.cpp.o
c++: fatal error: 強制終了 signal terminated program cc1plus
compilation terminated.
make[2]: *** [common/CMakeFiles/gal.dir/build.make:284: common/CMakeFiles/gal.dir/gal/opengl/gl_resources.cpp.o] エラー 1
make[1]: *** [CMakeFiles/Makefile2:2889: common/CMakeFiles/gal.dir/all] エラー 2
make: *** [Makefile:163: all] エラー 2

上記のログからは読み取れませんが、これはビルドに必要なメモリ領域が足りずに落ちています。
メモリ割り当てを2GBにすればビルドが進むので、割当を増やしてください。

sudo make installだけではOSが認識してくれないファイルがあるので、ldconfigの実行が必要

pcbnewを実行しようとすると、下記のようなエラーが発生して処理が進まない場合があります。

libkicad_3dsg.so.2.0.0: 共有オブジェクトファイルを開けません。そのようなファイルやディレクトリはありません。

Failed to load kiface library '/usr/local/bin/_pcbnew.kiface'.

これは上記エラーで指摘されているlibkicad_3dsg.so.2.0.0が配置されているもののOSで読み込めていないのが原因です。
ldconfigコマンドを実行すると読込ファイル一覧が更新されて期待通り動くようになります。
sudo ldconfig

参考: fail to load _pcbnew.kiface

未解決: build/releaseでcmakeしているのに、リポジトリのルートに生成物が配置される

PCにインストールして普段使っているUbuntu20.04でcmakeを行うと、build/releaseは空のままで、生成物が../../に配置されてしまいました。



../../でmakeは可能なのですが、原因は謎のままです。

未解決: python2と3がOS上で共存している場合は、python3のパスの実行ファイルのパスを渡してもpython2を見に行ってしまう

python2と3がOSにインストールされていると、cmake実行時に下記のようにpython2を見に行って処理が停止します。
Could NOT find PythonInterp: Found unsuitable version "2.7.18", but required is at least "3.6"

これはPYTHON_EXECUTABLEとして下記のようにpython3の実行パスを渡すとcmakeの問題は解決します。
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") \
../../

しかしながら、ビルドを進めるとpython2を見ているのが原因らしきエラーでビルドが止まります。
[ 26%] Built target scripting
make[2]: *** 'scripting/_kipython.kiface' に必要なターゲット '/usr/lib/x86_64-linux-gnu/libpython2.7.so' を make するルールがありません. 中止.
make[1]: *** [CMakeFiles/Makefile2:2791: scripting/CMakeFiles/scripting_kiface.dir/all] エラー 2
make: *** [Makefile:163: all] エラー 2
[ 32%] Building CXX object common/CMakeFiles/pcbcommon.dir/__/pcbnew/pcb_base_frame.cpp.o
/home/asuki/gitprojects/kicad/common/fp_lib_table.cpp: In member function ‘virtual void FP_LIB_TABLE::Parse(LIB_TABLE_LEXER*)’:
/home/asuki/gitprojects/kicad/common/fp_lib_table.cpp:168:18: error: ‘T_disabled’ was not declared in this scope
168 | case T_disabled:
| ^~~~~~~~~~
make[2]: *** [common/CMakeFiles/pcbcommon.dir/build.make:124: common/CMakeFiles/pcbcommon.dir/fp_lib_table.cpp.o] エラー 1
make[2]: *** 未完了のジョブを待っています....
make[1]: *** [CMakeFiles/Makefile2:2989: common/CMakeFiles/pcbcommon.dir/all] エラー 2
make: *** [Makefile:163: all] エラー 2

普段使っているUbuntuではなくVirtualBox上のUbuntuならこの問題は発生しなかったので、とりあえずそちらを使うことにしました。

参考: gatehubの該当説明箇所

まとめ

PCのストレージにインストールした普段使っているUbuntuではなぜかビルドできませんでしたが、ストレージ15GB以上メモリ2GB以上のVirtualBoxにUbuntuをインストールして、関連ライブラリをインストールしつつビルドの手順に従えば、ビルドしたKiCadをインストールして動かせました。

ビルドしたものを動かせるようになったので、自分が欲しい機能の組み込みの試行錯誤が可能な状態になりました。

参考

Build | Developer Documentation | KiCad

0 件のコメント :