(This file public domain.  Originally written by Mojca Miklavec, 2015-16.)

Compiling TeX binaries on Solaris

Solaris 9 has been out of official support for a while and making
software compile on that platform is challenging, so it hardly makes any
sense to try to support it.

Solaris 10 reaches end of support in January 2021:
    http://en.wikipedia.org/wiki/Solaris_(operating_system)#Version_history
and TeX Live binaries try to stay compatible with that OS version.

Every once in a while a new Update is shipped:
    U1  2006-01
    U2  2006-06
    U3  2006-11
    U4  2007-08
    U5  2008-05
    U6  2008-10
    U7  2009-05
    U8  2009-10
    U9  2010-09
    U10 2011-08
    U11 2013-01
and the problem is that binaries compiled on an updated system might not
run on an older one.

You can check the libc version with
> pvs -no /usr/lib/libc.so

> pvs -d /lib/libc.so.1 | grep SUNW
        SUNW_1.23;
        SUNW_1.22.7;
        SUNW_1.22.6;
        /.../
        SUNW_1.1;
        SUNW_0.9;
        SUNW_0.8;
        SUNW_0.7;

Building for 64-bit
===================

All binaries have been compiled with gcc-5.5.
The only thing that is needed to build for 64-bit is to define
    export CC="/path/to/gcc-5.5 -m64"
    export CXX="/path/to/g++-5.5 -m64"

Building wget
=============

Building wget on the latest version of Solaris 10 will make the binary
useless on older Updates of Solaris 10 as it would depend on SUNW_1.22.7.

One option to build wget in a "compatible way" would be to build it on
Solaris 9 with "cc".  The other hack is the usage of map files.

To make it work on older systems the following hack was used (thanks to
the OpenCSW community):
    https://buildfarm.opencsw.org/source/xref/opencsw/csw/mgar/pkg/wget/trunk/files/map.wget

> cat mapfile
libc.so - SUNW_1.22 SUNWprivate_1.1 $ADDVERS=SUNW_1.22;

export LD_OPTIONS="-M $PWD/mapfile"

And the following configuration was used to get rid of dependencies (which
are not installed on Solaris by default):

> ./configure --enable-ipv6 --disable-iri --disable-nls \
              --disable-ntlm --disable-pcre --without-libiconv-prefix \
              --without-libintl-prefix --without-libuuid --without-libpsl \
              --without-ssl --without-zlib

The binary was built with gcc 5.2.
The definition '#define _XOPEN_SOURCE 500' has been removed from 'src/sysdep.h'
to avoid compile error due to the fact that GCC 5 switched to -std=99. 

On i386 and x86_64 one has to manually add "-lsocket -lnsl" to the last linker command.
This should be reported upstream.

> pvs Master/tlpkg/installer/wget/wget.sparc-solaris
    libsocket.so.1 (SUNW_1.4);
    libnsl.so.1 (SUNW_1.7);
    librt.so.1 (SUNW_1.2);
    libc.so.1 (SUNW_1.22, SUNWprivate_1.1);

> ./Master/tlpkg/installer/wget/wget.sparc-solaris --version
    GNU Wget 1.17.1 built on solaris2.10.
    +digest -gpgme -https +ipv6 -iri +large-file -metalink -nls -ntlm 
    +opie -psl -ssl 

(That list of configure options is current as of the above version of
wget; not all those dependencies are present in earlier versions.)

Building xz
===========

The xz binaries would likewise depend on SUNW_1.22.6 by default, so we
used the same hack with a map file to make it work on slightly older
systems.

> cat mapfile
libc.so - SUNW_1.22 SUNWprivate_1.1 $ADDVERS=SUNW_1.22;

> export LD_OPTIONS="-M $PWD/mapfile"
> ./configure --disable-nls --disable-shared

> pvs Master/tlpkg/installer/xz/xz.sparc-solaris
    librt.so.1 (SUNW_1.2);
    libpthread.so.1 (SUNW_1.2);
    libc.so.1 (SUNW_1.22);
> pvs Master/tlpkg/installer/xz/xzdec.sparc-solaris
    libc.so.1 (SUNW_1.22);

If users need binaries to run on even older systems, we can target what
is desired by changing the map file.

Building asymptote
==================

Asymptote has been built with the following flags:

export CC=/opt/csw/bin/gcc-5.5
export CXX=/opt/csw/bin/g++-5.5
./configure --prefix=/tmp/asyinst --enable-texlive-build \
    --disable-fftw --disable-offscreen --disable-sigsegv \
    --disable-gl --disable-gsl --disable-readline

Even though GL, GSL and readline should generally not be disabled,
the resulting binaries would not be portable enough otherwise.

Because a newer gcc compiler was used we had to link statically against stdlib.
The following patch/hack took care of this:

--- Makefile.in.orig
+++ Makefile.in
@@ -12,7 +12,7 @@
 GCPPLIB = @GCPPLIB@
 GCLIBS = $(GCPPLIB) $(GCLIB)
 LFLAGS = @LDFLAGS@
-LIBS = $(LFLAGS) @PTHREAD_LIBS@ @GLEW@ @LIBS@ $(GCLIBS)
+LIBS = $(LFLAGS) $(GCLIBS) -nodefaultlibs -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic @PTHREAD_LIBS@ @GLEW@ @LIBS@ -lgcc_eh -lgcc -lc -lm
 DOSLIBS = $(subst -lncurses, -ltermcap, $(LIBS)) -lgdi32 -lwinmm -s -static
 
 PERL = perl
------

The resulting binary depends on:

> pvs asy
    libnsl.so.1 (SUNW_0.7);
    librt.so.1 (SUNW_1.2);
    libm.so.2 (SUNW_1.2);
    libc.so.1 (SUNW_1.22, SUNWprivate_1.1);
> ldd asy
    libnsl.so.1 =>   /lib/libnsl.so.1
    librt.so.1 =>    /lib/librt.so.1
    libz.so.1 =>     /usr/lib/libz.so.1
    libm.so.2 =>     /lib/libm.so.2
    libc.so.1 =>     /lib/libc.so.1
    libmp.so.2 =>    /lib/libmp.so.2
    libmd.so.1 =>    /lib/libmd.so.1
    libscf.so.1 =>   /lib/libscf.so.1
    libaio.so.1 =>   /lib/libaio.so.1
    libdoor.so.1 =>  /lib/libdoor.so.1
    libuutil.so.1 => /lib/libuutil.so.1
    libgen.so.1 =>   /lib/libgen.so.1

Building texlive
================

Additional settings were needed to compile TeX Live with gcc 5.5:
  * ./Build --without-iconv

The '--without-iconv' makes sure to avoid linking against libiconv
which is not available on SunOS by default.

luajittex seems to be broken on Solaris 10 x86_64 (even if it works
with Solaris 11) and doesn't support Sparc, so it was only compiled
for i386.

