logo_kerberos.gif

Difference between revisions of "Solaris Build Environment"

From K5Wiki
Jump to: navigation, search
Line 34: Line 34:
   
 
cd /usr/local/src/gcc-5.4.0
 
cd /usr/local/src/gcc-5.4.0
edit gcc/config/sol2.h; where it says "#ifndef USE_GLD" and subsequently talks about using a map file, change it to:
+
edit gcc/config/sol2.h; where it says "#ifndef USE_GLD" and subsequently talks about using a mapfile, change it to:
 
#if !defined(USE_GLD) && defined(ENABLE_SHARED_LIBGCC)
 
#if !defined(USE_GLD) && defined(ENABLE_SHARED_LIBGCC)
./configure --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --disable-shared
+
./configure --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --disable-shared --enable-languages=c,c++
 
gmake && gmake install
 
gmake && gmake install
   
Line 95: Line 95:
 
* gcc does not use the configured LDFLAGS when linking some of its programs; therefore, configuring with LDFLAGS=-L/usr/local/lib is not sufficient to find its dependencies there, and configuring with LDFLAGS=-R/usr/local/lib does not allow built programs to find the shared library. To work around this problem, we configure the dependencies with --disable-shared and configure gcc with --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local.
 
* gcc does not use the configured LDFLAGS when linking some of its programs; therefore, configuring with LDFLAGS=-L/usr/local/lib is not sufficient to find its dependencies there, and configuring with LDFLAGS=-R/usr/local/lib does not allow built programs to find the shared library. To work around this problem, we configure the dependencies with --disable-shared and configure gcc with --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local.
   
* If gcc is configured with --disable-shared, the build fails with "ld: fatal: file libgcc-unwind.map: stat failed: No such file or directory". (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65725). Building with a shared libgcc is problematic because then programs built with gcc can't be run with the standard dynamic linker path. To work around this, we apply a small change to fix the bug.
 
  +
* If gcc is configured without --disable-shared, programs built with /usr/local/bin/gcc will not run wth the default runtime linker path. We could perhaps modify the runtime linker path to include /usr/local/lib, but we prefer solutions that require fewer global system configuration changes.
  +
 
* If gcc is configured with --disable-shared, the build fails with "ld: fatal: file libgcc-unwind.map: stat failed: No such file or directory". (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65725). To work around this problem, we apply a small change to fix the bug, taken from the aforementioned bug report.
  +
  +
* If gcc is configured with --disable-shared, the build fails with "libtool: compile: not configured to build any kind of library" while building Java classpath materials. To work around this problem, we configure gcc with support for just C and C++.

Revision as of 11:27, 13 November 2016

This page contains notes on the setup of a Solaris buildbot worker for MIT krb5.

Our current Solaris build hardware is a Sun Fire V240 running Solaris 10 U10.

Solaris 10 includes a variety of free software tools in /usr/sfw, but not the full set of dependencies needed to checkout, build, and test the krb5 tree. We have chosen to use the NetBSD pkgsrc collection to build these dependencies.

Building a newer gcc

1. Set up a shell with a path containing the needed system utilities:

   /bin/bash
   export PATH=/usr/sbin:/usr/bin:/usr/sfw/bin:/usr/ccs/bin

2. Create /usr/local/src:

   mkdir /usr/local/src
   cd /usr/local/src

3. From https://ftp.gnu.org/, fetch the latest versions of gmp, mpfr, and mpc, and fetch gcc 5.4.0. Untar them in /usr/local/src.

4. Build gmp, mpfr, and mcc as follows.

   cd /usr/local/src/gmp-version
   ./configure --disable-shared ABI=32
   gmake && gmake install
   cd /usr/local/src/mpfr-version
   ./configure --disable-shared LDFLAGS=-L/usr/local/lib
   gmake && gmake install
   cd /usr/local/src/mpc-version
   ./configure --disable-shared LDFLAGS=-L/usr/local/lib
   gmake && gmake install

5. Build gcc as follows. This build takes many hours.

   cd /usr/local/src/gcc-5.4.0
   edit gcc/config/sol2.h; where it says "#ifndef USE_GLD" and subsequently talks about using a mapfile, change it to:
       #if !defined(USE_GLD) && defined(ENABLE_SHARED_LIBGCC)
   ./configure --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --disable-shared --enable-languages=c,c++
   gmake && gmake install

Setting up pkgsrc

If it becomes necessary to restart this process, "rm -rf /usr/pkgsrc /usr/pkg /var/db/pkg" will clean the slate.

1. Set up the shell and fetch the pkgsrc tar file:

   /bin/bash
   export PATH=/usr/pkg/sbin:/usr/pkg/bin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/sfw/bin:/usr/ccs/bin
   cd /tmp
   wget https://ftp.netbsd.org/pub/pkgsrc/stable/pkgsrc.tar.gz
   cd /usr
   gtar xzf /tmp/pkgsrc.tar.gz

2. Bootstrap pkgsrc:

   cd /usr/pkgsrc/bootstrap
   CFLAGS='-O2 -Wno-implicit-function-declaration' CC=/usr/local/bin/gcc ./bootstrap
   pkg_admin -K /var/db/pkg fetch-pkg-vulnerabilities
   (cd /usr/pkgsrc/shells/bash && bmake install)
   edit /usr/pkg/etc/mk.conf, change TOOLS_PLATFORM.sh to /usr/pkg/bin/bash
   exit out of the shell, run /usr/pkg/bin/bash, and set the path as in step 1
   (cd /usr/pkgsrc/devel/scmcvs && bmake install)
   (cd /usr/pkgsrc && cvs update)

3. Build packages useful for krb5 development:

   (cd /usr/pkgsrc/devel/git && bmake install)

Creating user accounts

By default, /home on Solaris is controlled by the automounter. To avoid needing to change the automounter configuration, we create user accounts with home directories in /export/home:

   useradd -d /export/home/ghudson -m ghudson

Creating an account allows the Kerberos principal of the same name in the ATHENA.MIT.EDU realm to log in on that account.

Problem log

A number of problems were encountered when trying simpler or mistaken variants of the above procedure. For the sake of easier debugging, here is a record of them:

  • It initially looked like cvs wasn't present in pkgsrc. The directory is named devel/scmcvs, because devel/cvs would conflict with the CVS metadata directory on case-insensitive filesystems.
  • When attempting to build pkgsrc with /usr/sfw/bin/gcc, a circular dependency between pkgtools/digest and lang/gcc2 was encountered. This resulted from running bmake without /usr/sfw/bin in $PATH. After correcting the path, it was necessary to run "bmake clean" in pkgtools/digest to clear the issue.
  • When attempting to build pgksrc with /usr/sfw/bin/gcc, devel/p5-gettext and other packages would fail when they included <stdbool.h>, because that Solaris header is incompatible with the default standards environment of gcc 3.4.3. This can be worked around by bootstrapping pkgsrc with "gcc -std=gnu99 -Wno-implicit declaration" and setting CC to that value in /usr/pkg/etc/mk.conf after bootstrap. (Without "-Wno-implicit-declaration", the bootstrap process fails when building bsdinstall.) Building with gcc 5.4.x works around the <stdbool.h> problem, as it defaults to the gnu11 standards environment, but it also requires -Wno-implicit-function-declaration for bsdinstall to build correctly during bootstrap.
  • After removing /usr/pkgsrc and /usr/pkg, bootstrapping pkgsrc again wouldn't install anything in /usr/pkg except /usr/pkg/etc/mk.conf. To start over, it is necessary to also remove /var/db/pkg.
  • When attempting to build pkgsrc with "/usr/sfw/bin/gcc -std=gnu99 -Wno-implicit-declaration", /bin/bash segmentation faults were encountered in several packages (starting with p5-Error) when executing long shell lines. To work around this issue, the above procedure builds the pkgsrc bash and uses it for the build after the bootstrap.
  • When attempting to build pkgsrc with "/usr/sfw/bin/gcc -std=gnu99 -Wno-implicit-declaration", pkg_create for some packages failed with stat failures, where the offending pathnames contained gcc error messages such as "gcc: unrecognized option `-print-multiarch': No such file or directory". To work around this problem, we build a newer version of gcc in /usr/local/bin before building pkgsrc.
  • When building gcc's dependencies, mpc complains that libgmp uses an incompatible ABI. This is because gmp overrides the default 32-bit ABI and chooses the 64-bit ABI for performance reasons. Configuring gmp with "ABI=32" works around the issue.
  • gcc does not use the configured LDFLAGS when linking some of its programs; therefore, configuring with LDFLAGS=-L/usr/local/lib is not sufficient to find its dependencies there, and configuring with LDFLAGS=-R/usr/local/lib does not allow built programs to find the shared library. To work around this problem, we configure the dependencies with --disable-shared and configure gcc with --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local.
  • If gcc is configured without --disable-shared, programs built with /usr/local/bin/gcc will not run wth the default runtime linker path. We could perhaps modify the runtime linker path to include /usr/local/lib, but we prefer solutions that require fewer global system configuration changes.
  • If gcc is configured with --disable-shared, the build fails with "ld: fatal: file libgcc-unwind.map: stat failed: No such file or directory". (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65725). To work around this problem, we apply a small change to fix the bug, taken from the aforementioned bug report.
  • If gcc is configured with --disable-shared, the build fails with "libtool: compile: not configured to build any kind of library" while building Java classpath materials. To work around this problem, we configure gcc with support for just C and C++.