понедельник, февраля 11, 2008

Maple11 + Ubuntu 8.04
При установке Maple 11 для Linux в Ubuntu 8.04 имеется следующая проблема: не запускается инсталлятор благодаря багу jvm и xorg 7.3.

Вывод ошибки примерно следующий:

java: xcb_xlib.c:82: xcb_xlib_unlock: Assertion `c->xlib.lock' failed.
Aborted (core dumped)

Как подсказывает гугль - этот баг jre вполне известен и имеется патч для его решения.
И всё бы хорошо, если бы инсталлятор Maple использовал системную jre.
Увы, но это не так. Посему приходится идти на кое-какие ухищрения...


Инсталлятор Maple(в моём случае это был один файл - sh-скрипт) в процессе установки распаковывает своё содержимое(в том числе и jre) в директорию вида /tmp/install.dir.XXXXX.
Таким образом в промежуток времени между тем, как распакован jre и начинается запуск самого инсталлятора вполне есть возможность пропатчить нужные файлы.

Итак по пунктам:
1) Создаём скрипт вида:
#!/bin/sh

echo "Patching";
LIB_TO_PATCH=libmawt.so
TMP=`ls /tmp | grep install.dir.`
PATH_TO_PATCH=`cd /tmp/$TMP && pwd`

for f in `find $PATH_TO_PATCH -name "$LIB_TO_PATCH"`
do
echo "Patching library $f"
sudo sed -i 's/XINERAMA/FAKEEXTN/g' "$f"
done

2) Далее, запускаем инсталлятор.
3) Читаем его вывод в консоль. Ждём, когда распакуется jre.
А это тогда, когда появится надпись "Extracting the installation resources from the installer archive...".
Примерно так:
[ed@ed-desktop Maple11forLinux]$ ./Maple11Linux32Installer.bin Preparing to install... Extracting the JRE from the installer archive... Unpacking the JRE... ======> вот здесь вот распаковывается jre Extracting the installation resources from the installer archive... ===> а вот тут пора уже запускать скрипт Configuring the installer for this system's environment... Launching installer... ....

4) Собственно ждём появления инсталлятора и устанавливаем Maple куда хочется.

5) Меняем немного скрипт для того, чтобы пропатчить jre уже установленного Maple.
Выглядеть теперь он будет примерно так:

#!/bin/sh

echo "Patching";
LIB_TO_PATCH=libmawt.so
PATH_TO_PATCH=/path_to_maple_installation/maple11/jre.IBM_INTEL_LINUX

for f in `find $PATH_TO_PATCH -name "$LIB_TO_PATCH"`
do
echo "Patching library $f"
sudo sed -i 's/XINERAMA/FAKEEXTN/g' "$f"
done

6) А собственно всё. Пользуемся содержимым /path_to_maple_installation/maple11/bin :)