LibreOffice onlineをDebianでビルドしてみました
LibreOffice online(LOOL)をDebian jessieでビルドしてみましたので、メモを残しておきます。
ソースコードのREADMEと小笠原さんのオープンソースカンファレンス2016 Gunma群馬での発表資料を参考にビルドしました。
LOOLの構成
- サーバー:loolwsd (C++)
- クライアント:loleaflet (javascript)
- バックエンドにLibreOffice
LibreOfficeのビルド
TDF Wikiの「 Linuxと*BSDシステムにおけるLibreOfficeビルドのヒントとコツ」を参考にLibreOfficeをビルドします。
ビルドに必要なパッケージをインストール
$ sudo aptitude update $ sudo aptitude safe-upgrade $ sudo aptitude build-dep libreoffice
以前にLibreOfficeはこの環境でビルドしたことがありましたので、このステップは不要でした。他にも個別でパッケージをインストールする必要があったかもしれません。
LibreOfficeのソースコードを取得
今回はお試しでビルドするので、履歴情報を取得しない--depth=1オプションを付けています。
$ git clone --depth=1 git://anongit.freedesktop.org/libreoffice/core libreoffice
ビルドは4-5時間ほどがかかったように思います。最初に関連のソースコードのダウンロードが走りますが、それだけで30分ほどかかりました。普段使いのノートPCでビルドさせており、他の作業をしたいときにはCtrl+Cで中断させて(もう1度makeで続き)いました。
$ cd libreOffice $ /autogen.sh --with-lang="ja" $ make
ビルドしたLibreOfficeを起動するには、ソースコードのある"libreOffice"ディレクトリでinstdir/program/soffice &
と実行させます。
pocoのビルド&インストール
小笠原さんのスライドに従って、ライブラリのpocoをインストールします。
$ curl -O http://pocoproject.org/releases/poco-1.7.3/poco-1.7.3-all.tar.gz $ tar zxvf poco-1.7.3-all.tar.gz $ cd poco-1.7.3-all $ ./configure --prefix=/opt/poco $ make $ sudo make install
LOOLのインストール
サーバーloolwsdのビルド
- ソースコードの取得
- LibreOfficeのgitリポジトリか、Githubのミラーからソースコードを取得します。
$ cd ~/LibreOffice_code/ $ git clone https://github.com/LibreOffice/online.git
- ビルドまで
- 手元環境では、libtoolizeコマンドがなかったのでインストールします。
$ sudo aptitude install libtool
$ cd loolwsd $ libtoolize $ aclocal $ automake --add-missing $ autoreconf $ autoheader $ ./configure --enable-silent-rules --with-lokit-path=(LibreOfficeのソースコードツリーのフルパス)/include --with-lo-path=(LibreOfficeのソースコードツリーのフルパス)instdir --with-poco-includes=/opt/poco/include --with-poco-libs=/opt/poco/lib --enable-debug $ make
なお、パッケージが足りないエラーが出たのでlibcap-devをインストールして再度./configureしています。
configure: error: libcap not available? $ sudo aptitude install libcap-dev
クライアント側インストール
- nodejs系のパッケージインストール
$ sudo aptitude install nodejs node-jake node-uglify 以下の新規パッケージがインストールされます: coffeescript{a} libc-ares2{a} libv8-3.14.5{a} node-amdefine{a} node-async{a} node-glob{a} node-inherits{a} node-jake node-lru-cache{a} node-minimatch{a} node-once{a} node-optimist{a} node-sigmund{a} node-source-map{a} node-uglify node-utilities{a} node-wordwrap{a} nodejs 更新: 0 個、新規インストール: 18 個、削除: 0 個、保留: 0 個。
- Debianパッケージでnpmをインストールし、npm自身でアップデートさせます
$ sudo aptitude install npm $ npm -v 1.4.21 $ sudo npm install -g npm $ sudo ln -s /usr/bin/nodejs /usr/bin/node $ npm --v 3.10.6
- makeでJSファイルを生成します。
$ cd ~/LibreOffice_code/online/loleaflet/ $ make
証明書のコピー
$ sudo mkdir /etc/loolwsd $ cd ~/LibreOffice_code/online/loolwsd/etc/ $ sudo cp *pem /etc/loolwsd/
LOOLサーバーの実行
$ sudo mkdir -p /usr/local/var/cache/loolwsd $ sudo chown `ユーザ名` /usr/local/var/cache/loolwsd $ cd ~/LibreOffice_code/online/loolwsd $ make run
ブラウザでアクセスする
test.odsを作成して、/opt/tmp/以下に置いた場合、以下にアクセスします。
https://localhost:9980/loleaflet/dist/loleaflet.html?file_path=file:///opt/tmp/test.ods&host=wss://localhost:9980
テスト用ということでオレオレ証明書ですので、Firefoxの場合、「安全な接続ではありません」と証明書の警告がでます。「エラー内容」->「例外を追加」->「セキュリティ例外を承認」で許可します。
スプレッドシートが見えたら成功です。(相変わらず日本語は1文字しか入力できませんでした)
おまけ:JSファイルの作成でしばらく躓きました
$ cd ~/LibreOffice_code/online/loleaflet/ $ jake build jake aborted. Error: Cannot find module 'browserify' at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) (See full trace by running task with --trace)
- そこでDebianパッケージでnode-browserify-liteを入れてみますが、うまく行きません。
$ aptitude search browserify p node-browserify-lite - bundle client-side JavaScript using Node.js-style module syntax $ sudo aptitude install node-browserify-lite 以下の新規パッケージがインストールされます: node-browserify-lite node-pend{a} 更新: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。 ... $ jake build jake aborted. Error: Cannot find module 'browserify' at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) (See full trace by running task with --trace)
- Debianパッケージのnpmを入れてみて、npmでbrowserifyを入れてみます
$ sudo aptitude install npm 以下の新規パッケージがインストールされます: gyp{a} libc-ares-dev{a} libjs-node-uuid{a} libv8-3.14-dev{a} node-abbrev{a} node-ansi{a} node-ansi-color-table{a} node-archy{a} node-block-stream{a} node-combined-stream{a} node-cookie-jar{a} node-delayed-stream{a} node-forever-agent{a} node-form-data{a} node-fstream{a} node-fstream-ignore{a} node-github-url-from-git{a} node-graceful-fs{a} node-gyp{a} node-ini{a} node-json-stringify-safe{a} node-lockfile{a} node-mime{a} node-mkdirp{a} node-mute-stream{a} node-node-uuid{a} node-nopt{a} node-normalize-package-data{a} node-npmlog{a} node-osenv{a} node-qs{a} node-read{a} node-read-package-json{a} node-request{a} node-retry{a} node-rimraf{a} node-semver{a} node-sha{a} node-slide{a} node-tar{a} node-tunnel-agent{a} node-underscore{a} node-which{a} nodejs-dev{a} npm 更新: 0 個、新規インストール: 45 個、削除: 0 個、保留: 0 個。 $ npm install browserify npm ERR! notarget No compatible version found: browserify@'./node_shrinkwrap/browserify-13.1.0.tgz'
諦めて、この状態で、サーバーを起動してみますが、Firefoxでアクセスすると画面が真っ白でした。 以下のようなエラーが出ており、bundle.jsが生成できていません。
wsd-07737-03 00:00:09.591516 [ client_req_hdl ] FileServerRequestHandler: File not found: /home/eno/LibreOffice_code/online//loleaflet/dist/bundle.js
そこで「(。ゝω・)ノ*:゚・☆ npmを更新したら動かなくなった」を参考にして、上記の手順のように、npmをnpmでアップデートさせる方法で対応しました。