2度あることは3度あるかもしれないので

LibreOffice でつくったImpressファイル(プレゼンファイル)を編集しようと開いてみると、なぜか数式のフォントがおかしくなってしまっている。数式は基本 Times New Roman なのだけど、SanSerif系の文字になっている。数式入力モードでフォントの選択をすればとりあえずは修復できるのだけど、すべての数式について同じ事をするのは考えたくない作業。さらにギリシャ文字は、いくら設定してもまったく駄目。SanSerif系の文字から変化なし。

いろいろ調べて、設定ファイルの中身をいじってみたりしたのだけど、どうしようもない。

よくよく思い起こしてみると、同じような症状はかつても経験した事があって、その時の処方箋は「アンインストール&インストール」。

結局今回も、一度LibreOfficeをアンインストールし、再インストール。そしたら、ちゃんと数式が表示されるようになりました。設定がどこかの段階で壊れてしまったのだろうか?クリーンインストールで治るのはいいのだけど、いやな感じ。

Qt のビルド

Qtをビルドしないといけなくなった。その前に他の理由から OpenSSL 1.1.0 をインストールしていた。

Qt は OpenSSL 1.0.1 までしか正式対応しておらず、ここで一つの壁にぶち当たる。特になにも指定せず、configure & make をすると、OpenSSL に関する所でコンパイルエラー。OpenSSL のバージョンアップに伴う変更で、後方互換がとれていないのが原因。しかたがないので、1.0.1 を 個別にインストールして使う事にするのだけど、どうやって指定すればよいのかよくわからない。

Secure Sockets Layer (SSL) Classes | Qt Network 5.8 に指定の仕方が書いてある。試しに、

$ OPENSSL_DIR=[OpenSSLインストール先] OPENSSL_LIB="-L[インストール先]/lib -lssl -lcrypto" ./configure --ssl-runtime 

で試してみる。が、コンパイルでエラー。

 qtbase/src/netowork でこけるので、 qtbase/src/network/Makefile 中の INCDIR に -I${openssl インストーディレクトリ}/include を指定すれば、一応OK。このMakefileは qmake で生成されるようなので、 qmake をもうすこし調べれば良いと思うのだけど・・・

 上記編集さえしてしまえば、一応ビルドは問題なく進んでいるようす。

Qt 5.8.0 with gcc 6.3.0 での問題

具体的にはQt5でもgccでもなくて、多分OSの事情による問題が起きたと思われる。きっと今時のKernelなら問題なくコンパイルも通ったはず。

問題1

qtserialbus/src/plugins/canbus/socketcan/socketcanbackend.cpp

コンパイルに失敗。sa_family_t に関しては linux/netlink.h を include する事で回避。でも AF_CAN、PC_CANが未定義と怒られる。linux/socket.h で定義されているので、正しくインクルードすれば良いようなきがするのだが、上手くいかない。なので、直接該当ファイル中で定義。これでよいのか?

問題2

qtgamepad/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp

コンパイルに失敗。BTN_TRIGGER_HAPPY{1,2,3,4} が未定義との事。普通は linux/input.h やら linux/input-event-codes.h やらで定義されている様子。件のシステムにはちょっと古めのKernelがインストールされていて、該当の定義がない。そもそもゲームパッドを使うような事はないので、こちらもソースに直接定義を追加して回避。

Qt 4.8.6 with gcc 6.3.0 での問題

Qt 5.8.0 では問題ないようなので、4系のみの問題?c++11への対応が不十分な所があり、ところどころでコンパイルエラーが発生する。-std=gnu++98 を指定して回避できる所は回避する。

ポインターを返すべき所で false を返す箇所がある。きっと NULL で良いのだと推測し、NULLポインタを返すように回避。これでよいのか?

 

 

独自にインストールした gcc と libtool を利用した場合のトラブル

ちょっと古いOSにいくつかツール&ライブラリを構築する必要が出てきた。だいたいこういうケースは色々な問題が生じるのだけど、今回は管理者権限がない+αの理由で、すべてユーザ権限のもとビルドしないといけない。

gcc からはじまって、 X11 までビルド。dev パッケージをいれてもらえればそこまでする必要はないはずなのに、いろいろなパッケージが足りない事から、こういう状況に。

いくつか問題はあったのだけど、だいたい目的を果たせそうになってきた所で、

  • Xserces
  • Mesa

のビルドで問題発生。どちらも autotools + libtool でビルド環境が整備されるのだけど、デフォルトの gcc ではない別バージョンの gcc を利用すると、 libtool でリンク時に 32bit バージョンと 64bit バージョンの libstdc++.so をリンクしようとする。結構古い問題で、10年前くらいからいろいろポストされているようなのだけど、きまった解決策がないような感じ。

いろいろいじってみた結果、

  • 64 bit のものをつくりたいのであれば
  • 32 bit 版の libstdc++.la を編集し、ライブラリディレクトリを 64bit の方にしておく

ことで解決できそうになった。 libtool の出力には二つ libstdc++.so が並ぶのかもしれないけど、多分大丈夫。 

 

ROOT 実行時のエラー

Fedora 25でビルドした ROOT 6.08.06 頃から、実行時にエラーがでるようになった。

エラー内容は

ERROR in cling::CIFactory::createCI(): cannot extract standard library include paths!
Invoking:
LC_ALL=C ccache -O2 -DNDEBUG -xc++ -E -v /dev/null 2>&1 >/dev/null | awk '/^#include </,/^End of search/{if (!/^#include </ && !/^End of search/){ print }}' | GREP_OPTIONS= grep -E "(c|g)\+\+"
Results was:
With exit code 256

というようなもの。ROOTのエラーといえばエラーなんだろうけれど、 ccache の man を見てみると、 ccache の後ろにコンパイラを指定する必要がある。コンパイラ指定の後にコンパイラオプション。多分ビルド時に

  1. コンパイラが ccache になっている
  2. ccache を使うのだけど、コンパイラを指定する変数が未定義

のどちらかなのだろうと推測。確かに ccache の後にコンパイラを指定して Invoking 下のコマンドを直接入れてみると、目的の結果が得られている様子。

ccmake で ビルド時の変数を確認してみると、CやCXXコンパイラに /usr/lib64/ccache/cc 等が指定されている。これが問題?

同じバージョンのROOTをBuildした他の環境では上記エラーがでておらず、そちらはそもそも ccache が入っていない。

コンパイラを直接指定しながら、もういちどROOTをビルドしてみる。エラーが出なくなった。

※ ROOTのビルドオプションに ccache を有効にするものがあった。有効にしてからビルドしたらどうなるのだろうか?

 

ROOT, Pythia6, cmake

ROOTのビルド時にPythia6 を有効にしたい。cmake でビルドしたいのだけど、ROOTにはいっている Pythia6.cmake で find_packageしたい。

cmake -Dpythia6=ON 

で良いはずなのだが、適切に PYTHIA6 変数を設定しても Pythia6.cmake中の get_filename_component でエラー。

PYTHIA6_LIBRARYを直接していすれば良いのだけど。

 

cmake -DPYTHIA6_LIBRARY=... -Dpythia6=ON

 

ROOTのコンパイル

ROOT

ROOT a Data analysis Framework | ROOT a Data analysis Framework

をビルドしようと、cmake-gui を使ってみた。GUIでソース、ビルド用ディレクトリを指定して、さらにカスタム変数の調整もできてしまう、便利なもの。自前のプロジェクトを cmake 対応した時に、試してみて便利とおもいユーザーにすすめていた。

tar ball をダウンロードして、展開。cmake-gui でビルド用ディレクトリも作り、configure & generate。あとはビルドということで、

$ cmake  --build ${BUILD_DIR}

とするが・・・・エラー。コンパイルの途中でエラー。compiledata.h がないよ、ってエラー。

検索してもそういうエラーは報告されていないので、????

原因: CMakeLists.txt の設定か、普通に cmake ${SOURCE_DIR} をすると、 include/comliledata.h を作る様子。cmake-gui を使う時にはビルド用ディレクトリから cmake を使っていないたか、エラーになってしまう。

対策:変数の設定をかんたんに行いたいのであれば ccmake のほうが良いでしょう。

 

 

ROOTを組み込んだプロジェクトをcmakeで管理する

ROOTライブラリを使うと色々便利なので多用している。最近は直接Makefileを書いたりautotoolsを使ったりするよりも、cmakeを使うのが良いらしい。ROOT自体も6.08からcmakeでのビルドがメインになった。

ならば、ROOTを使うプロジェクトもcmakeで管理すれば良いのでは?と、cmake対応をすすめてみた。autotoolsのかわり?的な気分ではじめてみたが、確かに良い感じ。ccmakeのお世話になる程ではないけれど、Makefileとの分離が程良くできている。autotoolsはMakefileのテンプレートを用意し環境に応じてMakefileを作るが、cmakeはNiniaを吐き出す事も出来る。いくつかのIDE用プロジェクトファイルも作ってくれるし、まさにビルド支援ツール。

色々な環境に対応したMODULEを使えば、マルチプラットフォーム対応への壁も低くなりそう。

標準的なLinuxであれば、今までMakefileにかけた圧倒的にビルド環境構築にかかる時間が短かくなる。build-in-sourceが非推奨なのも、バージョン管理システムとの親和性が良い。特に意識せずに別ディレクトリでのビルドが可能。

ROOT用の設定はFindROOT.cmakeを使えば一発。使い方は

https://root.cern.ch/how/integrate-root-my-project-cmake

こちらにまとまっています。知らずに中身を見ても使える程度の内容なので、cmake初学者には良い教材かも。

忘れないうちに、メモ。