Fedora 31 に scilab をインストール

Scilab からバイナリ(scilab-6.0.2.bin.linux-x86_64.tar.gz)をダウンロード、展開して、“bin/scilab” を起動すると、次のような selinux 回りの警告がでる。動作はするが、なかなかうざい。

/usr/bin/chcon: '/usr/local/scilab-6.0.2/bin/scilab-bin' のコンテキストを `unconfined_u:object_r:execmem_exec_t:s0' に変更できません: 許可されていない操作です
Error: Cannot chcon 'scilab-bin'
/usr/bin/chcon: '/usr/local/scilab-6.0.2/bin/scilab-cli-bin' のコンテキストを `unconfined_u:object_r:execmem_exec_t:s0' に変更できません: 許可されていない操作です
Error: Cannot chcon 'scilab-cli-bin'

Fedora 31 には scilab のパッケージが一応あるので、

sudo dnf install scilab

でインストールしようとすると、

エラー: 
 問題: conflicting requests
  - nothing provides jeuclid needed by scilab-6.0.2-2.fc31.x86_64
  - nothing provides jrosetta needed by scilab-6.0.2-2.fc31.x86_64
(try to add '--skip-broken' to skip uninstallable packages)

が表示され、jeuclid と jrosetta が Fedora 31 のレポジトリにないために、インストールに失敗する。rpmfind.net で jeuclid と jrosetta を検索し、パッケージをダウンロードしてインストールする。足りないパッケージがあると表示されるので、その都度、入れていく。

sudo rpm -ivh jeuclid-3.1.3-23.fc26.noarch.rpm
sudo rpm -ivh jrosetta-1.0.4-14.fc26.noarch.rpm

しかるのちに scilab をインストール。

sudo dnf install scilab

コンソールからscilabを起動すると、次のエラーメッセージがでる。

警告: Javaパッケージ '/usr/share/java/lucene/lucene-core.jar' が見つかりません。
警告: Javaパッケージ '/usr/share/java/lucene/lucene-core.jar' が見つかりません。
警告: Javaパッケージ '/usr/share/java/lucene/lucene-queryparser.jar' が見つかりません。
警告: Javaパッケージ '/usr/share/java/saxon/saxon.jar' が見つかりません。
警告: Javaパッケージ '/usr/share/java/ecj.jar' が見つかりません。
Javaライブラリのロードでいくつかの問題が発生しました。
これは、一貫性がない挙動をするかもしれません。
どうぞ SCI/etc/classpath.xml を確認してください。

足りないパッケージをさらに追加する。

dnf whatprovides /usr/share/java/lucene/lucene-core.jar

で必要なパッケージ名が “lucene-7.7.0-2.fc31.noarch” と分かる。

sudo dnf install lucene lucene-queryparser saxon

ecj.jar は'/usr/share/java/ecj/ecj.jar' にあるので、'/usr/share/scilab/etc/classpath.xml'の該当個所を書き換える。

--- classpath.xml.orig	2020-02-01 01:37:50.491042675 +0900
+++ classpath.xml	2020-02-01 01:38:15.476129522 +0900
@@ -147,7 +147,7 @@ The option is "disableUnderMode" and can
     <load on="copyAsHTMLinScinotes"/>
 </path>
 
-<path value="/usr/share/java/ecj.jar" load="onUse">
+<path value="/usr/share/java/ecj/ecj.jar" load="onUse">
     <load on="external_objects_java"/>
 </path>
 

これで scilab がGUIも含めて動作し、日本語表示もOK。

追記:java-1.8.0-openjdk{,-headless}-1.8.0.242.b08-0.fc31.x86_64 では “Main Scilabクラスにアクセスできませんでした。” とのメッセージが出て、scilab を起動できない。過去のバージョンは

dnf --showduplicates list java-1.8.0-openjdk

でわかる。次のコマンドでダウングレードする。

sudo dnf downgrade java-1.8.0-openjdk{,-headless}-1.8.0.222.b10-1.fc31

これらのパッケージをアップデートの対象から外すには、次のファイルに記述する。

/etc/dnf/dnf.conf
[main]
excludepkgs=java-1.8.0-openjdk*

この設定の下で、強制的にアップデートする場合は、次のコマンド

sudo dnf update --disableexcludes=all

なお、“ldd /usr/bin/scilab-bin” を実行すると、“lib{java,jvm,verify}.so” が not found となっている。これらは次のパスにある。いずれも、“java-1.8.0-openjdk-headless-1.8.0.222.b10-1.fc31” のファイルである。

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.fc31.x86_64/jre/lib/amd64/libjava.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.fc31.x86_64/jre/lib/amd64/server/libjvm.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.fc31.x86_64/jre/lib/amd64/libverify.so

“1.8.0.222.b10-1” → “1.8.0.242.b08-0” の変更では、“jre/bin/{clhsdb,hsdb}” が消えている。

JDK-8226870 removed clhsdb and hdsdb from the JRE bin directory, so we should do likewise.
Add alternatives support for these two new SDK binaries.

JDK-8226870 を検索して見てみたが、あまり関係はなさそう。