1 LibreOfficeをデバッグするまでの下準備(初心者向け)

この記事は2人の大学生がLibreOfficeWriterの一部機能を変えようと格闘した記録の1ページ目(全4ページ)です。 大規模ソフトウェアを手探るという授業の一環で行い、そのレポートを兼ねています。
目次

1. LibreOfficeについての紹介

LibreOfficeとは、オープンソースのオフィスソフトです。この中から、私たちはWriterという文書作成ソフトを選択し、一部機能の変更を行いました。使ったことのない方でも、MicrosoftOfficeのWordのようなソフトと聞けば想像がつくのではないでしょうか。開発者向けのWikiページを見てみると、

LibreOfficeのサイズや複雑さで簡単に圧倒されてしまうでしょう。ソースは多くのプログラミング言語やフォーマットで書かれています — C, C++, Java, Bash, JavaScript, Python, Perl, SQL, Test, XML  — そして約102,000ファイル (すべてのローカライゼーションを除く) で、36,000,000行(ソースコードは7,000,000行)のソースコードで成り立っています。

そのソースコードはなんと3600万行!!この大規模なソフトの中を見てみたい、またオフィスソフトには馴染みがある、という理由から私たちはLibreOfficeの改変に取り組むことにしました。後にこのボリュームによって苦しめられるのですが…

2. 実行環境

作業はすべて下に示すような環境で行いました。

3. ビルドの方法

公式のドキュメントを参考にしながらビルドを行いました。

  1. ソースコードを手に入れる
    LibreofficeソースコードGitHubで公開されているので、ここからcoreというディレクトリを自分たちのGitHubにフォークします。それをローカル環境にクローンすればソースコードを手元で編集できるようになります。
  2. 依存するファイルをダウンロードする

クローンしたらディレクトリの中に入り、ターミナル上でコマンド

$ sudo apt-get install git build-essential zip ccache junit4 libkrb5-dev nasm graphviz python3 python3-dev qtbase5-dev libkf5coreaddons-dev libkf5i18n-dev libkf5config-dev libkf5windowsystem-dev libkf5kio-dev autoconf libcups2-dev libfontconfig1-dev gperf default-jdk doxygen libxslt1-dev xsltproc libxml2-utils libxrandr-dev libx11-dev bison flex libgtk-3-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev ant ant-optional libnss3-dev libavahi-client-dev libxt-dev

を打ち込むことで必要なものはまとめてダウンロードできます。
ちなみに、手順3にて下記のようなエラーが出ることがありますが、これはこの手順2で必要なパッケージがすべてそろっていないことが原因です。

configure: error: Package requirements (fontconfig >= 2.4.1) were not met:

No package 'fontconfig' found

このようになったらsudo apt search (パッケージ名)などで足りていないと思われるパッケージを探し、-devで終わるものをインストールすることでこのエラーを解決できました。しかし私たちの場合は、この方法では追いつけないほど大量のパッケージが足りていなかったので、もう一度、上記の長いコマンドを打ち込むことでエラーを解決しました。結論、パッケージが足りていない場合はもう一度コマンドを打ってみると良いと思います。
3. ./autogen.shを実行する(これは通常のソフトウェアでMakefileを作成するために実行する./configureにあたる操作です)

$ CFLAGS="-O0 -g" ./autogen.sh --enable-dbgutil

を打ちます。ここでCFLAGS="-O0 -g"--enable-dbgutilは後でデバッガを使えるようにするために付けています。CFLAGS="-O0 -g"は無くてもデバッグすることができました。
4. makeを実行する
下記のコマンドをうちmakeします。

$ make -j 8
$ make check 

-j 8は指定された数のコマンドを並列に実行させるためのオプションです。今回の環境ではコア数が8であったため、このようにしています。ちなみに、8つ並列にしてもmakeには4時間ほどかかります(!)ここまでできれば、あと少しでデバッグを開始できます。

4. デバッガの設定

vscodeでデバッガの画面に入ると、左側にcreate a launch.jsonというような文字が出るので、そこをクリックしてlaunch.jsonを開きます。このファイルを下のように書き換えると、デバッガを使えるようになります。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/instdir/program/soffice.bin", // インストールしたPATHを書く
            "args": ["--writer"],   // Writerを起動するため
            "stopAtEntry": false,
            "cwd": "${workspaceRoot}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

5. Githubで困ったこと

実は初めてソースコードに触れたとき、私たちはLibreofficeGitHubからローカルにクローンし、そこから自分たちのGitHubへpushするという順番で開発に使う共有のGitHubディレクトリを作ろうとしていました。するとpushしようとする段階で、

missingSpaceBeforeEmail: invalid author/committer line - missing space before email

というエラーが出てしまい、pushが完了しませんでした。このエラーメッセージを調べると、同じエラーが質問されているのを見つけました。どうやら過去のコミットが悪さをしているようでしたので、悪さのしていたコミットの中身をみたところ、確かにメールアドレスと名前の間にスペースがなかったことがわかりました(そもそもなんでこれでコミットできてたん?)。よって、こちらの上から2番目の解答に従い悪さをしていた過去のコミットに編集を加え正したのですが、最後に問題のあったコミット以降の全てのコミットをまた戻すコマンドを実行したところ、

denjo@DJ00001:~/libreoffice$  git filter-branch -- --all
fatal: replace depth too high for object 086ff12951769a2fadfc0f92f57c2e4f41108b72

上記のように復元するコミット数が多すぎるため、戻すことができないと出力されてしまいました。そこで問題のコミットがいつのものであったのかを確認したところ、

Date: Wed Jan 26 11:11:11 2011 +0100

なんと2011年...そりゃ無理だ...。ということで、ここでなんともう作業日4日目だったので(発表含めて合計10日です...)、ここで諦めて上記の直接フォークを使う方法で回避しました。 ちなみに公式に書いてあるソースコードの入手方法の3つすべて試しましたが、どれもgithubにpushするときに同じエラーが出て、フォーク以外の方法ではgithubに上げることができませんでした。

それにしてもLibreOffice公式がどうやってこのコミットを通したのかがすごく気になります...。

続きはこちら