1#!/bin/bash
2#
3# Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
4# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5#
6# This code is free software; you can redistribute it and/or modify it
7# under the terms of the GNU General Public License version 2 only, as
8# published by the Free Software Foundation.  Oracle designates this
9# particular file as subject to the "Classpath" exception as provided
10# by Oracle in the LICENSE file that accompanied this code.
11#
12# This code is distributed in the hope that it will be useful, but WITHOUT
13# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15# version 2 for more details (a copy is included in the LICENSE file that
16# accompanied this code).
17#
18# You should have received a copy of the GNU General Public License version
19# 2 along with this work; if not, write to the Free Software Foundation,
20# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21#
22# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23# or visit www.oracle.com if you need additional information or have any
24# questions.
25#
26
27# This script creates a devkit for building OpenJDK on Solaris by copying
28# part of a Solaris Studio installation and cretaing a sysroot by installing
29# a limited set of system packages. It is assumed that a suitable pkg
30# publisher is configured for the system where the script is executed.
31#
32# The Solaris Studio installation must contain at least these packages:
33# developer/solarisstudio-124/backend               12.4-1.0.6.0               i--
34# developer/solarisstudio-124/c++                   12.4-1.0.10.0              i--
35# developer/solarisstudio-124/cc                    12.4-1.0.4.0               i--
36# developer/solarisstudio-124/library/c++-libs      12.4-1.0.10.0              i--
37# developer/solarisstudio-124/library/math-libs     12.4-1.0.0.1               i--
38# developer/solarisstudio-124/library/studio-gccrt  12.4-1.0.0.1               i--
39# developer/solarisstudio-124/studio-common         12.4-1.0.0.1               i--
40# developer/solarisstudio-124/studio-ja             12.4-1.0.0.1               i--
41# developer/solarisstudio-124/studio-legal          12.4-1.0.0.1               i--
42# developer/solarisstudio-124/studio-zhCN           12.4-1.0.0.1               i--
43# In particular backend 12.4-1.0.6.0 contains a critical patch for the sparc
44# version.
45#
46# erik.joelsson@oracle.com
47
48USAGE="$0 <Solaris Studio installation> <Path to gnu make binary>"
49
50if [ "$1" = "" ] || [ "$2" = "" ]; then
51  echo $USAGE
52  exit 1
53fi
54
55SOLARIS_STUDIO_VERSION=12u4
56SOLARIS_VERSION=11u1
57case `uname -p` in
58  i*)
59    ARCH=x86
60    ;;
61  sparc*)
62    ARCH=sparc
63    ;;
64esac
65
66SOLARIS_STUDIO_SRC=$1
67GNU_MAKE=$2
68
69SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)"
70BUILD_DIR="${SCRIPT_DIR}/../../build/devkit"
71
72DEVKIT_NAME=SS${SOLARIS_STUDIO_VERSION}-Solaris${SOLARIS_VERSION}
73DEVKIT_ROOT=${BUILD_DIR}/${DEVKIT_NAME}
74BUNDLE_NAME=${DEVKIT_NAME}.tar.gz
75BUNDLE=${BUILD_DIR}/${BUNDLE_NAME}
76INSTALL_ROOT=${BUILD_DIR}/install-root-$SOLARIS_VERSION
77INSTALL_ROOT_TOOLS=${BUILD_DIR}/install-root-tools-$SOLARIS_VERSION
78SYSROOT=${DEVKIT_ROOT}/sysroot
79SOLARIS_STUDIO_SUBDIR=SS${SOLARIS_STUDIO_VERSION}
80SOLARIS_STUDIO_DIR=${DEVKIT_ROOT}/${SOLARIS_STUDIO_SUBDIR}
81
82# Extract the publisher from the system
83if [ -z "${PUBLISHER_URI}" ]; then
84  PUBLISHER_URI="$(pkg publisher solaris | grep URI | awk '{ print $3 }')"
85fi
86
87if [ ! -d $INSTALL_ROOT ]; then
88  echo "Creating $INSTALL_ROOT and installing packages"
89  pkg image-create $INSTALL_ROOT
90  pkg -R $INSTALL_ROOT set-publisher -P -g ${PUBLISHER_URI} solaris
91  pkg -R $INSTALL_ROOT install --accept $(cat solaris11.1-package-list.txt)
92else
93  echo "Skipping installing packages"
94fi
95
96# Since we have implicitly been running 11.2 tools for a long time, we need
97# to pick them for the tools dir in the devkit. Create a separate install-root
98# for it.
99if [ ! -d $INSTALL_ROOT_TOOLS ]; then
100  echo "Creating $INSTALL_ROOT_TOOLS and installing packages"
101  pkg image-create $INSTALL_ROOT_TOOLS
102  pkg -R $INSTALL_ROOT_TOOLS set-publisher -P -g ${PUBLISHER_URI} solaris
103  sudo pkg -R $INSTALL_ROOT_TOOLS install --accept \
104      entire@0.5.11-0.175.2.5.0.5.0 \
105      system/linker \
106      developer/base-developer-utilities \
107      developer/gnu-binutils
108else
109  echo "Skipping installing tools packages"
110fi
111
112if [ ! -d $SYSROOT ]; then
113  echo "Copying from $INSTALL_ROOT to $SYSROOT"
114  mkdir -p $SYSROOT
115  cp -rH $INSTALL_ROOT/lib $SYSROOT/
116  mkdir $SYSROOT/usr
117  cp -rH $INSTALL_ROOT/usr/lib $SYSROOT/usr/
118  cp -rH $INSTALL_ROOT/usr/include $SYSROOT/usr/
119  pkg -R $INSTALL_ROOT list > $SYSROOT/pkg-list.txt
120else
121  echo "Skipping copying to $SYSROOT"
122fi
123
124if [ ! -d $DEVKIT_ROOT/tools ]; then
125  echo "Copying from $INSTALL_ROOT_TOOLS to $DEVKIT_ROOT/tools"
126  # Some of the tools in sysroot are needed in the OpenJDK build. We need
127  # to copy them into a tools dir, including their specific libraries.
128  mkdir -p $DEVKIT_ROOT/tools/usr/bin/sparcv9 $DEVKIT_ROOT/tools/lib/sparcv9 \
129      $DEVKIT_ROOT/tools/usr/gnu/bin
130  cp $INSTALL_ROOT_TOOLS/usr/bin/{ar,nm,strip,ld,ldd} \
131       $DEVKIT_ROOT/tools/usr/bin/
132  cp $INSTALL_ROOT_TOOLS/usr/bin/sparcv9/{ar,nm,strip,ld,ldd} \
133       $DEVKIT_ROOT/tools/usr/bin/sparcv9/
134  cp $INSTALL_ROOT_TOOLS/usr/sbin/dtrace $DEVKIT_ROOT/tools/usr/bin/
135  cp $INSTALL_ROOT_TOOLS/usr/sbin/sparcv9/dtrace $DEVKIT_ROOT/tools/usr/bin/sparcv9/
136  cp -rH $INSTALL_ROOT_TOOLS/usr/gnu/bin/* $DEVKIT_ROOT/tools/usr/gnu/bin/
137  cp $INSTALL_ROOT_TOOLS/lib/{libelf.so*,libld.so*,liblddbg.so*} \
138      $DEVKIT_ROOT/tools/lib/
139  cp $INSTALL_ROOT_TOOLS/lib/sparcv9/{libelf.so*,libld.so*,liblddbg.so*} \
140      $DEVKIT_ROOT/tools/lib/sparcv9/
141  for t in $(ls $DEVKIT_ROOT/tools/usr/gnu/bin); do
142    if [ -f $DEVKIT_ROOT/tools/usr/gnu/bin/$t ]; then
143      ln -s ../gnu/bin/$t $DEVKIT_ROOT/tools/usr/bin/g$t
144    fi
145  done
146else
147  echo "Skipping copying to tools dir $DEVKIT_ROOT/tools"
148fi
149
150if [ ! -d $SOLARIS_STUDIO_DIR ]; then
151  echo "Copying Solaris Studio from $SOLARIS_STUDIO_SRC"
152  mkdir -p ${SOLARIS_STUDIO_DIR}
153  cp -rH $SOLARIS_STUDIO_SRC/. ${SOLARIS_STUDIO_DIR}/
154  # Solaris Studio 12.4 requires /lib/libmmheap.so.1 to run, but this lib is not
155  # installed by default on all Solaris systems. Sneak it in from the sysroot to
156  # make it run OOTB on more systems.
157  cp $SYSROOT/lib/libmmheap.so.1 $SOLARIS_STUDIO_DIR/lib/compilers/sys/
158else
159  echo "Skipping copying of Solaris Studio"
160fi
161
162echo "Copying gnu make to $DEVKIT_ROOT/bin"
163cp $GNU_MAKE $DEVKIT_ROOT/tools/usr/bin/
164if [ ! -e $DEVKIT_ROOT/tools/usr/bin/gmake ]; then
165  ln -s make $DEVKIT_ROOT/tools/usr/bin/gmake
166fi
167
168# Create the devkit.info file
169echo Creating devkit.info
170INFO_FILE=$DEVKIT_ROOT/devkit.info
171rm -f $INFO_FILE
172echo "# This file describes to configure how to interpret the contents of this devkit" >> $INFO_FILE
173echo "DEVKIT_NAME=\"Solaris Studio $SOLARIS_STUDIO_VERSION - Solaris $SOLARIS_VERSION - $ARCH\"" >> $INFO_FILE
174echo "DEVKIT_TOOLCHAIN_PATH=\"\$DEVKIT_ROOT/$SOLARIS_STUDIO_SUBDIR/bin:\$DEVKIT_ROOT/bin\"" >> $INFO_FILE
175echo "DEVKIT_EXTRA_PATH=\"\$DEVKIT_ROOT/tools/usr/bin\"" >> $INFO_FILE
176echo "DEVKIT_SYSROOT=\"\$DEVKIT_ROOT/sysroot\"" >> $INFO_FILE
177
178if [ ! -e $BUNDLE ]; then
179  echo "Creating $BUNDLE from $DEVKIT_ROOT"
180  cd $DEVKIT_ROOT/..
181  tar zcf $BUNDLE $DEVKIT_NAME
182else
183  echo "Skipping creation of $BUNDLE"
184fi
185