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 の後ろにコンパイラを指定する必要がある。コンパイラ指定の後にコンパイラオプション。多分ビルド時に
のどちらかなのだろうと推測。確かに 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初学者には良い教材かも。
忘れないうちに、メモ。