Friday 3 December 2010

LFS - OpenOffice.org

mkdir /sources/ooo
cd /sources/ooo
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/a/apache-ant-1.8.0-src.tar.bz2
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/perl-modules/Archive-Zip-1.20.tar.gz
wget http://downloads.sourceforge.net/junit/junit4.8.1.zip
wget http://ftp.osuosl.org/pub/openoffice/stable/3.2.1/OOo_3.2.1_src_core.tar.bz2
wget http://ftp.osuosl.org/pub/openoffice/stable/3.2.1/OOo_3.2.1_src_system.tar.bz2
wget http://www.linuxfromscratch.org/patches/blfs/svn/OOo_3.2.1-build_with_db5-1.patch
wget ftp://ftp.mozilla.org/pub/mozilla.org/seamonkey/releases/1.1.14/seamonkey-1.1.14.source.tar.bz2
wget ftp://ftp.osuosl.org/pub/openoffice/stable/3.2.1/OOo_3.2.1_src_l10n.tar.bz2
wget ftp://ftp.osuosl.org/pub/openoffice/stable/3.2.1/OOo_3.2.1_src_extensions.tar.bz2

JUnit is not, as you may be forgiven for assuming, a boy band. It is, instead, a small Java application that allows various tests to be run on other Java applications (such as the one we are about to install).

unzip /sources/ooo/junit4.8.1.zip
cd junit4.8.1
install -v -m755 -d /usr/share/{,doc/}junit-4.8.1 &&
chown -R root:root . &&
cp -v -R junit* org  /usr/share/junit-4.8.1 &&
cp -v -R *.html *doc /usr/share/doc/junit-4.8.1
export CLASSPATH=$CLASSPATH:/usr/share/junit-4.8.1/junit-4.8.1.jar:/usr/share/junit-4.8.1
cd ..
rm -rvf junit4.8.1

Apache Ant is a Java based alternative to [make] and OpenOffice.org is going to use it to compile.

tar -jxvf /sources/ooo/apache-ant-1.8.0-src.tar.bz2
cd apache-ant-1.8.0
sed -i 's|${dist.dir}/etc|/etc/ant|'        build.xml &&
sed -i 's|/etc/ant.conf|/etc/ant/ant.conf|' src/script/ant &&
cp -v /usr/share/junit-4.8.1/junit-4.8.1.jar lib/optional/junit.jar
./build.sh -Ddist.dir=/opt/ant-1.8.0 dist &&
ln -v -sf /etc/ant /opt/ant-1.8.0/etc &&
ln -v -sf ant-1.8.0 /opt/ant
cd ..
rm -rvf apache-ant-1.8.0

Next we come to one of my favourite ways BLFS has of fucking me off. If you look at the prerequisites for OpenOffice.org 3.2.1 in BLFS here you see Apache Ant, (good just installed that), GTK+2 (installed that ages ago), the Perl module XML::Parser (installed for Xorg), another one called Archive::Zip (right, need that), which (installed it to get lspci working with PowerTop), Zip and Unzip (both installed AGES ago).

Looks easy dunnit? Only one tiny Perl Module to install. Ah. Welcome to the wonders of Perl Module dependencies. Archive::Zip needs Compress::Zlib, which in turn needs ... ohforfuckssake. Just have a look at this:

cd /sources/ooo
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/perl-modules/IO-Compress-Base-2.005.tar.gz
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/perl-modules/Compress-Raw-Bzip2-2.005.tar.gz
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/perl-modules/IO-Compress-Bzip2-2.005.tar.gz
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/perl-modules/Compress-Raw-Zlib-2.005.tar.gz
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/perl-modules/IO-Compress-Zlib-2.005.tar.gz
wget http://anduin.linuxfromscratch.org/sources/BLFS/svn/perl-modules/Compress-Zlib-2.005.tar.gz

Incidentally I am using the Server Beach mirror for these files, because I have had problems in the past trying to find them. They are pretty tiny, so hopefully that's OK.

tar -xzvf /sources/ooo/IO-Compress-Base-2.005.tar.gz
cd  IO-Compress-Base-2.005
perl Makefile.PL &&
make &&
make test
make install
cd ..
rm -rvf  IO-Compress-Base-2.005

tar -xzvf /sources/ooo/Compress-Raw-Bzip2-2.005.tar.gz
cd  Compress-Raw-Bzip2-2.005
perl Makefile.PL &&
make &&
make test
make install
cd ..
rm -rvf  Compress-Raw-Bzip2-2.005

tar -xzvf /sources/ooo/IO-Compress-Bzip2-2.005.tar.gz
cd  IO-Compress-Bzip2-2.005
perl Makefile.PL &&
make &&
make test
make install
cd ..
rm -rvf  IO-Compress-Bzip2-2.005

tar -xzvf /sources/ooo/Compress-Raw-Zlib-2.005.tar.gz
cd  Compress-Raw-Zlib-2.005
sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|" -e "s|INCLUDE\s*= ./zlib-src|INCLUDE    = /usr/include|" -e "s|LIB\s*= ./zlib-src|LIB        = /usr/lib|" config.in
perl Makefile.PL &&
make &&
make test
make install
cd ..
rm -rvf  Compress-Raw-Zlib-2.005

tar -xzvf /sources/ooo/IO-Compress-Zlib-2.005.tar.gz
cd  IO-Compress-Zlib-2.005
perl Makefile.PL &&
make &&
make test
make install
cd ..
rm -rvf  IO-Compress-Zlib-2.005

tar -xzvf /sources/ooo/Compress-Zlib-2.005.tar.gz
cd  Compress-Zlib-2.005
perl Makefile.PL &&
make &&
make test
make install
cd ..
rm -rvf  Compress-Zlib-2.005

tar -xzvf /sources/ooo/Archive-Zip-1.20.tar.gz
cd  Archive-Zip-1.20
perl Makefile.PL &&
make &&
make test
make install
cd ..
rm -rf  Archive-Zip-1.20

Buggeration, we also need gperf:

wget http://ftp.gnu.org/gnu/gperf/gperf-3.0.4.tar.gz
tar -xzvf gperf-3.0.4.tar.gz
cd gperf-3.0.4
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.0.4 &&
make
make install &&
install -m644 -v doc/gperf.{dvi,ps,pdf,txt} /usr/share/doc/gperf-3.0.4 &&
pushd /usr/share/info &&
rm -v dir &&
for FILENAME in *; do
    install-info $FILENAME dir 2>/dev/null
done &&
popd
cd ..
rm -rvf gperf-3.0.4

And now for OpenOffice.org which you just cannot install from a ramdisk on a 32bit machine.

cd /sources/ooo
tar -xjvf OOo_3.2.1_src_system.tar.bz2
tar -xjvf OOo_3.2.1_src_core.tar.bz2
tar -xjvf OOo_3.2.1_src_extensions.tar.bz2
tar -xjvf OOo_3.2.1_src_l10n.tar.bz2
cd OOO320_m19
cp ../seamonkey-1.1.14.source.tar.bz2 moz/download/

Don't follow the instructions in BLFS, it gets the seamonkey filename wrong. Apparently OOo shits itself if you have certain environment variables set, so unset them and fire on a patch. In a rapidly developing theme the patch file name is also wrong on BLFS.

umask 0022 &&
unset LANG LC_ALL
patch -Np1 -i ../OOo_3.2.1-build_with_db5-1.patch
autoreconf

Now, set the configuration. I originally tried to set this with:
--with-system-libxml           \
but the system complained that:

to prevent incompatibilities between internal libxslt and libxml2, the office will be build with system-libxslt
checking which libxslt to use... external
checking for LIBXSLT... configure: error: Package requirements (libxslt) were not met:

No package 'libxslt' found

So I just did not tell OOO that I already had libxml installed to force it to use the version that it ships with in the source package.

PKG_CONFIG=/usr/bin/pkg-config ./configure \
--enable-graphite              \
--disable-lockdown             \
--disable-binfilter            \
--disable-fontooo              \
--disable-cups                 \
--enable-fontconfig            \
--disable-symbols              \
--disable-gnome-vfs            \
--disable-systray              \
--disable-odk                  \
--disable-qadevooo             \
--enable-cairo                 \
--disable-dbus                 \
--disable-gconf                \
--enable-gio                   \
--disable-pam                  \
--without-afms                 \
--without-fonts                \
--without-ppds                 \
--without-pam                  \
--with-system-stdlibs          \
--with-system-cairo            \
--with-system-expat            \
--with-system-zlib             \
--with-system-jpeg             \
--with-system-openssl          \
--with-system-python           \
--with-system-curl             \
--with-jdk-home=/opt/jdk       \
--with-java                    \
--with-ant-home=/opt/ant       \
--with-perl-home=/usr          \
--with-x                       \
--with-lang="en-GB"            \
--with-dict="en-GB"            \
--with-package-format=native   \
--with-vendor="Your name here"     \
--with-use-shell=bash

Now compile this all with:

source LinuxX86Env.Set.sh &&
./bootstrap &&
make $CORES_TO_USE

Oh, joy un-fucking-bound. I got this error message (buried in a pile of crap by the way):

/shlibsign: No such file or directory

I did a google search for that and it turned up this post (albeit for someone compiling OOo on Windows). Seems there is something wrong in the Seamonkey Makefile which means it can't define its source directory properly. I did a bit more searching and found this solution.

Now that looks like the contents of a patch file to me. The important lines for this problem are the following:

-SRCDIR = $(call core_abspath,.)
...
 +ifeq ($(OS_TARGET), Linux)
 + SRCDIR = .

Translated into english that means [-] remove the troublesome [SRCDIR] line, and [+] replace it [if] your [TARGET] [OS] [eq]uals [Linux] with [SRCDIR = .]. The patch is for a different version of the Seamonkey source though, and I am not sure how to download or apply it from where I found it even if it was for the version I have. So, best option is to just do the proposed changes by hand. You can do this in [nano] by running the following command:

nano /sources/ooo/OOO320_m19/nss/unxlngi6.pro/misc/build/mozilla/security/nss/cmd/shlibsign/Makefile

You then find [CTRL + W] the core_abspath line and turn it into [SRCDIR = .]. Save the file, and rerun the [make] command. But, of course, that didn't fucking work either. It was still complaining that it couldn't find some file. So I went to a new command prompt and ran the [find] command to get the absolute path to the file. I then re-ran the [nano] command to edit the Makefile and I just pasted in the full absolute path (minus the /[filename] bit at the end). And then it correctly built in:

real    930m58.090s
user    806m18.691s
sys     57m40.225s

930 MINUTES! And, it ran for a good 30-40 minutes before it crashed the first time due to the stupid path problem. So that's 960 minutes at least - a whole 16 HOURS to compile this! The sources folder (with all the working directories for the build) ended up taking up 8.8Gb of space. So no chance to compile on a ramdrive using a 32bit machine then.

Hope I got the settings right. Time to install it.

pushd instsetoo_native/unxlng?6.pro/OpenOffice/native/install/en-US/linux-2.6-*/buildroot/opt &&
cp -r -v openoffice.org3 /opt/openoffice-3.2.1 &&
cp -r -v openoffice.org/* /opt/openoffice-3.2.1 &&
ln -sf basis3.2 /opt/openoffice-3.2.1/basis-link &&
popd

Ok, those commands look a bit odd. The first one [pushd] basically says "Remember where we started and move to the following directory" The one at the end, popd, says, "OK, finished now - go back to where we started. The [&&} at the end of each line tells the system to run all of the commands or none of the commands. So if one fails, or there is a mistake, it doesn't run all of them. The other commands are the usual copy and link commands we have seen before. Next up is a brief linking loop:

for appl in sbase scalc sdraw simpress smath soffice spadmin swriter
do
    ln -v -sf /opt/openoffice-3.2.1/program/$appl /usr/bin
done

That basically gives the variable [$appl] the value [sbase] then runs the [l]i[n]k command in the next line, then changes the variable to [scalc] and runs the command again, and so on.

To install some shiny icons, we run:

pushd sysui/desktop/icons &&
install -v -m755 -d /usr/share/icons/{hicolor,locolor} &&
cp -r -v hicolor/* /usr/share/icons/hicolor &&
cp -r -v locolor/* /usr/share/icons/locolor &&
popd

That just makes a couple of directories and then populates them. Lastly, if you happen to be using .desktop files to organise your menu systems (which may be possible with Openbox, I am not sure) then you want to install the .desktop files for OpenOffice:

install -v -d -m755 /usr/share/applications &&
pushd /opt/openoffice-3.2.1/share/xdg/ &&
for appl in *.desktop
do
    sed -i '/Exec/d' $appl &&
    echo "Exec=/usr/bin/s`echo $appl | sed 's/.desktop//'`" >> $appl &&
    sed -i '/Icon/d' $appl &&
    echo "Icon=`echo "ooo-${appl}3.2" | sed 's/\.desktop//'`" >> $appl
done &&
sed -i 's@bin/sprinteradmin@bin/spadmin@' printeradmin.desktop &&
cp -v *.desktop /usr/share/applications &&
popd

That command is an amalgam of the ones we have just run. Firstly it creates a directory if it doesn't exist anyway. Then it uses pushd to save the current location and to move to another directory. In the directory it then runs a loop on every file in the new directory with a [.desktop] extension. The loop includes (aaaargh) sed commands. It looks like it is changing the default entries for [Exec] and [Icon] in the [.desktop] files. Must have a good reason for doing this. Oh! I see, the original .desktop files had an Exec line which tried to run [openoffice.org3 -writer %U] for instance. Sed replaces that with [/usr/bin/swriter] which is also the name of the link file we made above. It also tweaks the Icon line, but I know not why.

I do not get the final [sed] on the [printeradmin.desktop] file. It then just copies the files to the appropriate place. If you have installed the desktop-files-utils package (which I have not) then you can now run the following command to let it know to rebuild the menus:

update-desktop-database

We then need to install the dictionaries and any extensions we compiled (don't remember compiling any but hey ho):

cp -v dictionaries/unxlngi6.pro/bin/dict-*.oxt sdext/unxlngi6.pro/bin/*.oxt reportbuilder/unxlngi6.pro/bin/report-builder.oxt swext/unxlngi6.pro/bin/wiki-publisher.oxt /opt/openoffice-3.2.1/share/extension/install

When I ran this, it copied all the dictionaries, but could not find any other extensions. And we then need to install the extensions, which may need some manual input:

for ext in /opt/openoffice-3.2.1/share/extension/install/*.oxt
do
    /opt/openoffice-3.2.1/program/unopkg add --shared --verbose $ext
done

This gave me LOADS of dictionaries. I think I may have inadvertently installed ALL of them. I will have to look back at the [with-dict] option that I used - may have been wrong. Last step is to install a link so that you can view office documents from within Firefox:

ln -sv /opt/openoffice-3.2.1/program/libnpsoplugin.so /opt/firefox4b7/lib/firefox-4.0b7/plugins

Obviously, choose the proper path for your current firefox installation.

Et, voila.

No comments:

Post a Comment