Shinji Enoki's blog

LibreOfficeの話題を中心にする予定です

LibreOffice onlineをDebianでビルドしてみました

LibreOffice online(LOOL)をDebian jessieでビルドしてみましたので、メモを残しておきます。

ソースコードのREADMEと小笠原さんのオープンソースカンファレンス2016 Gunma群馬での発表資料を参考にビルドしました。

www.slideshare.net

LOOLの構成

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のビルド

$ 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文字しか入力できませんでした) f:id:shinji_enoki:20160826063548j:plain

おまけ: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でアップデートさせる方法で対応しました。