140607 lib o-mini_con-ryoon
TRANSCRIPT
1
pkgsrcを使った*BSDでのLibreOffice 4.2のビルド
Ryo ONODERA<[email protected]><[email protected]>
LibreOffice mini Conference 2014 Tokyo/Japan
2014-06-07
2
Who am I?
● 名前: Ryo ONODERA● いわゆるIT産業とは無関係な仕事をしています
● 2010年からpkgsrc developer● NetBSDのCVS treeにもcommitできるので、瑣末なものはcommitしている時もあります
● 最近は、Xinuos (旧SCO)のOSにpkgsrcを移植しようとしています● SCO OpenServer 5.0.7/3.2、SCO OpenServer 6.0/5、UnixWare 7.1.4+● GCCのサポートがなかったり、最近のバージョンでは削除されていたりするので、GCC
をどうにかしないといけないのではないかと思っています。i386だけなので、linker/compiler/includeの癖が分かればそんなに難しくないはず?
●
● NetBSD的には、このMacBook Air 11-inch mid 2012でプレゼンテーションができるようになりました。DRMKMS kernel
3
pkgsrcとは (1/2)
●
● http://www.pkgsrc.org/ Portable package build system● The NetBSD Foundation傘下のプロジェクト● パッケージ管理システムと言って良いと思う
– パッケージ管理システムの定義は難しいようなので…● ソフトウェアのインストールの仕方を共有するのが目的のプロジェクトだと思っています● 古くて良くないCVSで管理
– cvs -d :pserver:[email protected]:/cvs/cvsroot login (passwd = anoncvs)
– cvs -d :pserver:[email protected]:/cvs/cvsroot co pkgsrc● 対応22プラットフォーム (ただしサポートのレベルは様々)
– AIX、 BSDOS、 Cygwin、 Darwin/Mac OS X、 DragonFly、 FreeBSD、 FreeMiNT、 GNU/kFreeBSD、 HP-UX 、 Haiku、 IRIX、 Interix/SFU/SUA、 Linux、 Minix3、 MirBSD、 NetBSD、 OSF1、 OpenBSD、 QNX、 SCO OpenServer 5、 Solaris/illumos、 UnixWare
4
pkgsrcとは (2/2)
● /usr/pkg以下にインストールpkgのsrcなのでpkgsrc (らしい)● FreeBSD Portsの移植から始まった● ソースコードからビルドする
– cd pkgsrc/misc/libreoffice4 (tree内でパッケージを選んで)– make install (実行コマンドは共通)
● バイナリーパッケージもある● 私の中では、buildlink3という仕組みが素晴しいと思っているが、説明は割愛し
ます● pkgsrcと似た仕組みは他にもあるので、名前だけ紹介。深くは知りません…● FreeBSD Ports、 OpenBSD Ports、 DragonFly DPorts、 Gentoo Portage、
Fink、 MacPorts、 Homebrew、 Arch Build System など● http://wiki.netbsd.org/users/ryoon/sourcecode_based_installation_packag
e_management_systems/ にリンク集があります
5
*BSDとは (1/2)
● the University of California, Berkeley由来● BSD = Berkeley Software Distribution● AT&T UNIXへのアドオンから改造版へ。TCP/IPの生まれ故郷● アイデンティティーは、BSDライセンスなのではないかと
思っている(今は、4条項のオリジナルBSDライセンスはお勧めされていない)
● AT&T UNIXと裁判になって、再出発● メジャーどころでは、DragonFly、 FreeBSD、 NetBSD、
OpenBSD、 PC-BSDなどがある● 他にもあるが、試せてません
6
*BSDとは (2/2)
● LinuxともSysVR4とも違う、BSD独自の流儀がある● もちろん、GNUの流儀とも違う● POSIX互換は目指しているらしい● SysVR4やLinuxの良い所も取り込まれているはず● すみませんが、詳しくは説明できません…
7
pkgsrcの仕組み (1/4)
● pkgsrc/category/package というディレクトリーの形で、パッケージを分類し収録している
– 43のカテゴリーに分類されている– archivers audio benchmarks iology bootstrap cad chat comms
converters cross databases devel distfiles editors emulators filesystems finance fonts games geography graphics ham inputmethod lang mail math mbone meta-pkgs misc multimedia net news parallel pkgtools print security shells sysutils textproc time wm www x11
● bmakeというNetBSDで使われているmakeの方言でMakefileの形で書く
● 配布物の取得からインストールまで● ライセンスによってブロックすることも可能
8
pkgsrcの仕組み (2/4)
● 典型的には、以下のようなファイル/ディレクトリーがある
● DESCR … パッケージの解説文章● Makefile … 本体● PLIST … インストールされるファイルの一覧● buildlink3.mk … ライブラリー等だった場合に依存関係を記述するのに使う
● distinfo … 配布物のチェックサムなど● patches/ … ビルドに必要なパッチファイルを格納する
ディレクトリー
9
pkgsrcの仕組み (3/4)
● # $NetBSD: Makefile,v 1.6 2014/06/01 04:01:06 ryoon Exp $●
● DISTNAME= libe-book-0.0.3● PKGREVISION= 1● CATEGORIES= converters● MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=libebook/}● EXTRACT_SUFX= .tar.bz2●
● MAINTAINER= [email protected]● HOMEPAGE= http://sourceforge.net/projects/libebook/● COMMENT= Library for importing non-HTML reflowable e-book formats● LICENSE= mpl-2.0 OR gnu-lgpl-v2.1●
● TOOL_DEPENDS+= gperf-[0-9]*:../../devel/gperf●
● GNU_CONFIGURE= yes● USE_LIBTOOL= yes● USE_TOOLS+= gmake pkg-config● USE_LANGUAGES= c c++●
● CONFIGURE_ARGS+= --disable-tests● CONFIGURE_ARGS+= --without-docs● \● .include "../../converters/libwpd/buildlink3.mk"● .include "../../devel/boost-libs/buildlink3.mk"● .include "../../devel/zlib/buildlink3.mk"● .include "../../textproc/icu/buildlink3.mk"● .include "../../textproc/libxml2/buildlink3.mk"● .include "../../mk/bsd.pkg.mk"
● CVS keyword展開● 配布物のファイル名とパッケージ
名● カテゴリー● 配布物の取得元● メンテナー● 依存するライブラリー以外のパッ
ケージの情報● ビルドの仕組みに関する情報
(GNU Autotools/Libtool/CMake/プログラミング言語など)
● 依存するライブラリーの情報
10
pkgsrcの仕組み (4/4)
● 使い始めるに当たっては…● NetBSDでは、bmakeがmake(1)として標準搭載されてい
るので、特に準備は必要ない
– $ cd /usr/pkgsrc/misc/libreoffice4 && make install● NetBSD以外のOSでは、pkgsrcのbootstrap作業が必要に
なる
– # cd /usr/pkgsrc/bootstrap && ./bootstrap --varbase /usr/pkg/var とか
– $ cd /usr/pkgsrc/misc/libreoffice4 && /usr/pkg/bin/bmake install
11
ターゲット (1/2)
● ここからが本題です● 現在、LibreOfficeは、pkgsrc/misc/libreoffice4 として収録
されており、そのバージョンは4.2.4.2であり、これをビルドすることを目的とする
– pkgsrc/misc/libreofficeというのもあって、バージョン3系列のようですが、ビルドしたことはありません
● ビルドする環境としては、以下とする。メジャーなBSDだと思います
– DragonFly/amd64 3.6.0 (先日3.8.0が出てしまいました)– FreeBSD/amd64 10.0– OpenBSD/amd64 5.5
12
ターゲット (2/2)
● LibreOfficeをビルドするのに関連するであろう、各OSの仕様は以下のようである
● DragonFly/amd64 3.6.0
– C/C++コンパイラー: GCC 4.7.3– アーキテクチャー: x86_64
● FreeBSD/amd64 10.0
– C/C++コンパイラー: llvm/clang 3.3– アーキテクチャー: x86_64
● OpenBSD/amd64 5.5
– C/C++コンパイラー: GCC 4.2.1– アーキテクチャー: x86_64
13
LibreOfficeと*BSDサポート (1/3)
● まず以下のようにして、LibreOfficeがターゲットOSのサポートをしているのか確認した
– どこかにサポートしているOSやアーキテクチャーの種類について書かれているのかもしれないが、見付けられていない
● ソースツリーで、以下のように実行して、各OS用のサポートファイルが存在することを確認した
– $ find . | grep -i dragonfly● ./solenv/gbuild/platform/DRAGONFLY_X86_64_GCC.mk● ./solenv/gbuild/platform/DRAGONFLY_INTEL_GCC.mk
– $ find . | grep -i freebsd● ./solenv/gbuild/platform/FREEBSD_INTEL_GCC.mk● ./solenv/gbuild/platform/FREEBSD_X86_64_GCC.mk● ./desktop/test/deployment/update/platform/freebsd_x86_64.oxt● ./desktop/test/deployment/update/platform/freebsd_x86.oxt● (パッチは省略)
– $ find . | grep -i openbsd● ./distro-configs/LibreOfficeOpenBSD.conf● ./solenv/gbuild/platform/OPENBSD_INTEL_GCC.mk● ./solenv/gbuild/platform/OPENBSD_X86_64_GCC.mk
14
LibreOfficeと*BSDサポート (2/3)
● ちなみに、NetBSDの場合は以下のようである
– $ find . | grep -i netbsd● ./solenv/gbuild/platform/NETBSD_X86_64_GCC.
mk● ./solenv/gbuild/platform/NETBSD_INTEL_GCC.m
k● grep -ri netbsd . とかするのも面白い
15
LibreOfficeと*BSDサポート (3/3)
● 以上より、いずれのターゲットOSの場合にも、サポートファイルは存在し、以下のような条件を前提にしていると考えられる
– C/C++コンパイラー: GCC– アーキテクチャー: x86またはx86_64
● Linuxの場合には、S/390x、 SPARC、 MIPS、 ARM、 Power、 HP-PA、 m68kなどもサポートされているようだ
– $ find . | grep -i linux してみてください
16
DragonFly/amd64の場合
● solenv/gbuild/platform/DRAGONFLY_X86_64_GCC.mk が他のOSと違う部分が書かれているファイルであると考えられる
– gb_COMPILERDEFAULTOPTFLAGS := -O2– include $(GBUILDDIR)/platform/unxgcc.mk– gb_CppunitTest_CPPTESTPRECOMMAND :=
LD_LIBRARY_PATH=$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs:/usr/pkg/lib
● pkgsrcが標準のパッケージ管理システムだった頃の設定であるようだ
● 基本的には、Unix-like OSでGCCを使う場合そのままのようだ
17
FreeBSD/amd64の場合
● solenv/gbuild/platform/FREEBSD_X86_64_GCC.mk が他のOSと違う部分が書かれているファイルであると考えられる
– gb_COMPILERDEFAULTOPTFLAGS := -O2– include $(GBUILDDIR)/platform/unxgcc.mk
● llvm/clang用のファイルは存在していない● 同じく、Unix-like OSでGCCを使う場合そのままのようだ
18
OpenBSD/amd64の場合
● solenv/gbuild/platform/OPENBSD_X86_64_GCC.mk が他のOSと違う部分が書かれているファイルであると考えられる
– gb_COMPILERDEFAULTOPTFLAGS := -O2– gb_STDLIBS := $(PTHREAD_LIBS)– include $(GBUILDDIR)/platform/unxgcc.mk
● libpthreadをわざわざ使うように指定しているようだが、なぜかは不明
● それ以外はUnix-like OSでGCCを使う場合そのままのようだ
19
Unix-like OSでGCCを使う場合
● いずれのターゲットOSでも参照されていた、Unix-like OSでGCCを使う場合 (unxgcc.mk) について、簡単に確認した
● 名前に反して、llvm/clangについても書かれている
– ifeq ($(COM_GCC_IS_CLANG),) など● GNU makeの関数ばかりで、良く分からない…● しかし、llvm/clangをC/C++コンパイラーにしている
FreeBSD/amd64 10.0の場合でも、対応できそうな気がして来た
20
pkgsrcでのmisc/libreoffice4
● LibreOfficeは、そのビルドの仕組みの中に、必要とするライブラリー等をネットワーク上から取り寄せて、独自のパッチを当ててビルドする仕組みがある
● しかし、これはソースコードから各ユーザーがコンパイルするパッケージ管理システムとは相性が悪い挙動である
– pkgsrc/Ports等では、配布物をあらかじめダウンロードしておける必要がある→オフラインでもビルドできる必要がある
– 再配布可能な配布物については、ミラーをしている● メンテナンスするのにも、パッチへのパッチが必要になって面倒である● なるべく、--with-system-*を活用し、必要なライブラリーはpkgsrcの枠
組みの中でインストールしたものを使うようにする● しかし、まだ道半ばで、--disable-fetch-external と--with-external-
tar=/path/to/tarball を使って対処している
21
依存するパッケージ
● hsqldb18-[0-9]*:../../databases/hsqldb18● openjdk7-[0-9]*:../../lang/openjdk7● openjdk7>=1.7.0.72.20090924:../../lang/openjdk7● libabw>=0.0.1:../../converters/libabw● libwpd>=0.9.5:../../converters/libwpd● libcdr>=0.0.6:../../converters/libcdr● libwpg>=0.1.3nb1:../../converters/libwpg● lcms2>=2.2:../../graphics/lcms2● libe-book>=0.0.2:../../converters/libe-book● libetonyek>=0.0.3:../../converters/libetonyek● libfreehand>=0.0.0:../../converters/libfreehand● libmspub>=0.0.6:../../converters/libmspub● libvisio>=0.0.15:../../converters/libvisio● libwps>=0.2.0:../../converters/libwps● libmwaw>=0.2.0:../../converters/libmwaw● orcus>=0.5.1:../../converters/orcus● db4>=4.8.30:../../databases/db4● shared-mime-info>=1.0nb1:../../databases/shared-mime-info● unixodbc>=2.0.11nb3:../../databases/unixodbc● postgresql91-client>=9.1.11nb1:../../databases/postgresql91-client● boost-libs-1.55.*:../../devel/boost-libs● boost-libs>=1.55.0:../../devel/boost-libs● cppunit>=1.10.2nb5:../../devel/cppunit● liblangtag>=0.4.0:../../devel/liblangtag● nss>=3.14.0:../../devel/nss● harfbuzz>=0.9.17nb2:../../fonts/harfbuzz
● jpeg>=9:../../graphics/jpeg● cairo>=1.12.16nb2:../../graphics/cairo● png>=1.6.0nb1:../../graphics/png● gdk-pixbuf2-xlib>=2.26.5nb1:../../graphics/gdk-pixbuf2-xlib● graphite2>=1.2:../../graphics/graphite2● librsvg>=2.40.1nb1:../../graphics/librsvg● libxml2>=2.8.0nb2:../../textproc/libxml2● python33>=3.3:../../lang/python33● lp_solve>=5.5.2.0:../../math/lp_solve● gstreamer0.10>=0.10.36nb3:../../multimedia/gstreamer0.10● gst-plugins0.10-base>=0.10.36nb3:../../multimedia/gst-plugins0.10-base● gstreamer1>=1.0.0:../../multimedia/gstreamer1● gst-plugins1-base>=1.0.0:../../multimedia/gst-plugins1-base● libcmis>=0.4.1:../../net/libcmis● cups>=1.5.4nb9:../../print/cups● poppler-cpp>=0.26.0:../../print/poppler-cpp● dbus>=0.91:../../sysutils/dbus● dbus-glib>=0.100nb1:../../sysutils/dbus-glib● desktop-file-utils>=0.10nb1:../../sysutils/desktop-file-utils● hunspell>=1.3.2:../../textproc/hunspell● hyphen>=2.8.6:../../textproc/hyphen● icu>=53.1:../../textproc/icu● libclucene>=2.2.0:../../textproc/libclucene● libodfgen>=0.0.3:../../textproc/libodfgen● libxslt>=1.1.28nb2:../../textproc/libxslt● redland>=1.0.16nb4:../../textproc/redland● curl>=7.35.0nb1:../../www/curl● libexttextcat>=3.2:../../textproc/libexttextcat● mythes>=1.2.2:../../textproc/mythes● neon>=0.30.0nb2:../../www/neon● gtk2+>=2.24.22nb3:../../x11/gtk2
22
icu53対応
● --with-system-icuを設定しているので、git HEADからicu53対応のコードをバックポートした
● patch-i18npool_source_collator_collator__unicode.cxx● patch-i18npool_source_collator_data_zh__TW__charset.txt
など● として、外部のicu 53.xのAPI変更に追従した● http://cgit.freedesktop.org/libreoffice/core/commit/?
id=2d843bb104a3091a2ff2c7b4d5655f5fb1393a47● http://cgit.freedesktop.org/libreoffice/core/commit/i18n
pool/source/collator/collator_unicode.cxx?id=a3c627fe38236e82bc6008075d862b3cbfbd9ce3
23
DragonFlyでの実際 (1/2)
● DragonFlyでは、3.6.0より前までは、独自のDPortsではなくpkgsrcを採用して来ていた
● また、GCCが4.7.3である● 以上のことより、依存するパッケージについては、あまり問題がないのではないかと予想された
●
● しかし、OpenJDK7 (pkgsrc/lang/openjdk7)について、RPATHあるいはLD_LIBRARY_PATHがおかしいのか、ビルドできなかった→ Javaサポートは無効にせざるを得なくなった
24
DragonFlyでの実際 (2/2)
● 実際にビルドしてみた結果、依存するパッケージとLibreOfficeのいずれも、大きなエラーがなくビルドは完了した
– x11/libdrmについては、libkmsがbuildされるので、PLISTが変わるので対応した
● 動作についても、特に問題ないようだ●
● あっけなく完了
25
FreeBSDでの実際 (1/3)
● C/C++コンパイラーがllvm/clangなので、GCCとの違いが全て確認され対応されているかどうか心配された
● 依存するパッケージについても、同様に心配された● pkgsrcからOpenJDK7を導入できない(bootstrap kitがない)→オフ●
● 依存するパッケージについて、変更した内容は、以下の通り
– libmwawほかのファイル形式の変換ライブラリーで、C preprocessorとして、clang -Eを呼び出しているのでclang++のみを用意しているとconfigureスクリプトが失敗してしまう→ Cコンパイラーも使うものとしておく (pkgsrcのclangサポートが良くない可能性がある)
– cups (Common UNIX Printing System)がdevel/libusb1を要求しているが、FreeBSDには移植されていない→ FreeBSDは、baseにlibusb互換のライブラリーであるlibusbを持っているので、それを使えるようなbuiltin.mkを用意した
– libmwaw-0.2.0は、clang 3.3でビルドできない。0.2.1にアップデートすることでビルドできるようになった。0.3系列も公開されているが、LibreOffice 4.2.4.2では使えない (configureスクリプトを直してもAPIが変わったようでエラーになる)
26
FreeBSDでの実際 (2/3)
● LibreOffice本体をビルドするに当たって、様々なエラーに遭遇した● clang++が分からないと思って、FreeBSD Portsのパッチを見てみたが、FreeBSD PortsでのLibreOffice
は、4.1.6.2なのでそのままでは当てられない● FreeBSD Portsのパッチを参考に、以下のようにパッチを作成し直した
– patch-bridges_source_cpp__uno_gcc3__linux__intel_except.cxx– patch-bridges_source_cpp__uno_gcc3__linux__intel_share.hxx– patch-bridges_source_cpp__uno_gcc3__linux__intel_uno2cpp.cxx– patch-bridges_source_cpp__uno_gcc3__linux__x86-64_share.hxx– patch-bridges_source_cpp__uno_gcc3__linux__x86-64_uno2cpp.cxx– patch-connectivity_source_parse_sqlbison.y– patch-svtools_source_control_ctrlbox.cxx
● ただし、FreeBSDで条件分岐すべきか、clang/libc++で条件分岐すべきかを明確にできていない● clangがC/C++コンパイラーになっていないFreeBSD 9.2で試してみる必要がある●
● NetBSD 6.99 (current)は、clangでビルドし、clangを標準のC/C++コンパイラーにすることもできるので、それに対応するためと思われるパッチが既に含まれていたが、少なくともclang 3.3には不適当な内容であった
27
FreeBSDでの実際 (3/3)
● ただし、FreeBSDで条件分岐すべきか、clang/libc++で条件分岐すべきかを明確にできていない
● clangがC/C++コンパイラーになっていないFreeBSD 9.2で試してみる必要がある
●
● NetBSD 6.99 (current)は、clangでビルドし、clangを標準のC/C++コンパイラーにすることもできるので、それに対応するためと思われるパッチが既に含まれていたが、少なくともclang 3.3には不適当な内容であった
28
OpenBSDでの実際 (1/3)
● C/C++コンパイラーが、GCC 4.2.1なので、これをそのまま使うことはできない。そもそもboostもビルドできない
● そこで、Mozilla Firefoxをビルドするために、あらかじめ用意していたGCC 4.6.4を使用してみることにした
● 依存するライブラリーは、GCC 4.6.4で十分であった● しかし、LibreOffice 4.2.4.2は、pdfimport部分で、以下等
エラーが大量に発生してビルドできない
– include/c++/bits/cpp_type_traits.h:73:3: error: template with C linkage
● どう考えても、C++コンパイラーがおかしいという結論に…。Mozilla Firefoxがビルドできるくらいなので、ちゃんとしているはずなんだけれどもな…と思いつつ、GCC 4.8.2でbuildするように方針転換をした
● OpenJDK7もbootstrap kitがないのでビルドできない→オフ
29
OpenBSDでの実際 (2/3)
● GCC 4.8.2については、OpenBSD Portsから必要なパッチを借りて来て、動くようにした (意味の分かっていない部分もある)
– /usr/pkg/etc/mk.confに、GCC_REQD+=4.8と書いておく
● すると、devel/libffiがビルドできない。これはPython 2.7 (lang/python27)に必要で、Python 2.7はGTK+ 2をビルドするのに必要
– https://github.com/atgreen/libffi/commit/76d19d004e36e99d261ee78261e2f52cea5e4ab1#diff-e2d5a00791bce9a01f99bc6fd613a39d の内容をpatch-aaに追加。unwindサポートの扱いが悪かったらしい
30
OpenBSDでの実際 (3/3)
● Gstreamer 0.10/1もビルドできない。Gstreamerに附属のGNU libtoolやpkgsrcのGNU libtoolではビルドできない。OpenBSD附属のlibtool (Perlで書かれている)を使うとうまく行く (何が違うのかは良く調査しないといけない)
● OpenBSD附属のlibtoolを使うようにmultimedia/gst-plugin0.10-baseやgst-plugin1-baseを修正。良い方法ではないが仕方ないとしておく
● また、configureスクリプトで、以下が欠けていたので、修正 (同じビルドできない問題でオフにされていたのかも)
– build_gstreamer=yes– build_gstreamer_0_10=yes
● それ以外は、touch(1)のオプションの違いがある位で、順調に推移●
● GCC 4.8を使う範囲について、明確化していく必要がある
31
pkgsrc/misc/libreoffice4
● 時間があった場合に、実際のpkgsrc/misc/libreoffice4の中身を概観します
32
まとめと今後の課題
● DragonFly/amd64 3.6.0、 FreeBSD/amd64 10.0、 OpenBSD/amd64 5.5で、pkgsrcの仕組みを使ってビルドし、正常に起動し、簡単な操作はできることを確認した
● そのために必要なOpenBSDにおけるGCC 4.8の使用範囲に関する設定以外の全ての変更をpkgsrcのCVSツリーにコミットした→よって誰でも再現可能
●
● Javaオプションに関しては今回は有効化できなかったので、bootstrap kitの作成を学んで有効化する
● FreeBSD/amd64 10.0、OpenBSD/amd64 5.5でビルドするのに必要な変更については、git HEADをビルドしてみて、bug reportする予定 (pkgsrc-wipにはgitからソースコードをfetchしてbuildする仕組みがあるが、それは使わない予定)
● LibreOfficeのビルドの仕組みは、GNU makeで複雑に書かれているので、きちんと読み直して、理解していく必要がある
●
33
おわり
● Upstream
– OpenJDK7 bsd-portで、rhino.jarを読み込むと、そのOpenJDK7ではLibreOfficeのJavaScriptによるscriptingの部分がコンパイルできなくなるのが当面の課題? 私はJavaScriptでマクロを書きたかったので…
– LD_LIBRARY_PATHを使わないようにならないかな…とか– *BSDのx86/x86_64以外のサポート
● pkgsrc
– ヘルプのバイナリーを持って来ているのに使ってない気がする
– Apache OpenOfficeにもトライしたい