3
# Compiles and installs a Linux/x86_64 -> Linux/ARM crosstool based on LLVM and
4
# LLVM-GCC-4.2 using SVN snapshots in provided tarballs.
9
echo -n "Welcome to LLVM Linux/X86_64 -> Linux/ARM crosstool "
10
echo "builder/installer; some steps will require sudo privileges."
12
readonly INSTALL_ROOT="${INSTALL_ROOT:-/usr/local/crosstool}"
13
# Both $USER and root *must* have read/write access to this dir.
14
readonly SCRATCH_ROOT=$(mktemp -d "${TMPDIR:-/tmp}/llvm-project.XXXXXX")
15
readonly SRC_ROOT="${SCRATCH_ROOT}/src"
16
readonly OBJ_ROOT="${SCRATCH_ROOT}/obj"
18
readonly CROSS_HOST="x86_64-unknown-linux-gnu"
19
readonly CROSS_TARGET="arm-none-linux-gnueabi"
20
readonly CROSS_MARCH="${CROSS_MARCH:-armv6}"
22
readonly CODE_SOURCERY="${INSTALL_ROOT}/codesourcery"
23
readonly CODE_SOURCERY_PKG_PATH="${CODE_SOURCERY_PKG_PATH:-${HOME}/codesourcery}"
24
readonly CODE_SOURCERY_HTTP="http://www.codesourcery.com/sgpp/lite/arm/portal/package1787/public"
25
readonly CODE_SOURCERY_PKG="arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2"
26
readonly CODE_SOURCERY_ROOT="${CODE_SOURCERY}/arm-2007q3"
27
readonly CODE_SOURCERY_BIN="${CODE_SOURCERY_ROOT}/bin"
28
# Make sure ${CROSS_TARGET}-* binutils are in command path
29
export PATH="${CODE_SOURCERY_BIN}:${PATH}"
31
readonly CROSS_TARGET_AS="${CODE_SOURCERY_BIN}/${CROSS_TARGET}-as"
32
readonly CROSS_TARGET_LD="${CODE_SOURCERY_BIN}/${CROSS_TARGET}-ld"
34
readonly SYSROOT="${CODE_SOURCERY_ROOT}/${CROSS_TARGET}/libc"
36
readonly LLVM_PKG_PATH="${LLVM_PKG_PATH:-${HOME}/llvm-project/snapshots}"
38
# Latest SVN revisions known to be working in this configuration.
39
readonly LLVM_DEFAULT_REV="74530"
40
readonly LLVMGCC_DEFAULT_REV="74535"
42
readonly LLVM_PKG="llvm-${LLVM_SVN_REV:-${LLVM_DEFAULT_REV}}.tar.bz2"
43
readonly LLVM_SRC_DIR="${SRC_ROOT}/llvm"
44
readonly LLVM_OBJ_DIR="${OBJ_ROOT}/llvm"
45
readonly LLVM_INSTALL_DIR="${INSTALL_ROOT}/${CROSS_TARGET}/llvm"
47
readonly LLVMGCC_PKG="llvm-gcc-4.2-${LLVMGCC_SVN_REV:-${LLVMGCC_DEFAULT_REV}}.tar.bz2"
48
readonly LLVMGCC_SRC_DIR="${SRC_ROOT}/llvm-gcc-4.2"
49
readonly LLVMGCC_OBJ_DIR="${OBJ_ROOT}/llvm-gcc-4.2"
50
readonly LLVMGCC_INSTALL_DIR="${INSTALL_ROOT}/${CROSS_TARGET}/llvm-gcc-4.2"
52
readonly MAKE_OPTS="${MAKE_OPTS:--j2}"
55
# $1: directory to be created
56
# $2: optional mkdir command prefix, e.g. "sudo"
58
if [[ ! -e $1 ]]; then
60
elif [[ -e $1 && ! -d $1 ]]; then
61
echo "$1 exists but is not a directory; exiting."
71
# Prints out and runs the command, but without logging -- intended for use with
72
# lightweight commands that don't have useful output to parse, e.g. mkdir, tar,
78
echo "==> Running: $*"
86
echo "=> $message; log in $log_file"
87
echo "==> Running: $*"
88
# Pop-up a terminal with the output of the current command?
89
# e.g.: xterm -e /bin/bash -c "$* >| tee $log_file"
91
if [[ $? != 0 ]]; then
92
echo "Error occurred: see most recent log file for details."
97
installCodeSourcery() {
98
# Unpack the tarball, creating the CodeSourcery dir, if necessary.
99
if [[ ! -d ${CODE_SOURCERY_ROOT} ]]; then
100
sudoCreateDir ${CODE_SOURCERY}
102
if [[ -e ${CODE_SOURCERY_PKG_PATH}/${CODE_SOURCERY_PKG} ]]; then
103
runCommand "Unpacking CodeSourcery in ${CODE_SOURCERY}" \
104
tar jxf ${CODE_SOURCERY_PKG_PATH}/${CODE_SOURCERY_PKG}
106
echo -n "CodeSourcery tarball not found in "
107
echo "${CODE_SOURCERY_PKG_PATH}/${CODE_SOURCERY_PKG}"
108
echo -n "Fix the path or download it from "
109
echo "${CODE_SOURCERY_HTTP}/${CROSS_TARGET}/${CODE_SOURCERY_PKG}"
113
echo "CodeSourcery install dir already exists; skipping."
116
# Verify our CodeSourcery toolchain installation.
117
if [[ ! -d "${SYSROOT}" ]]; then
118
echo -n "Error: CodeSourcery does not contain libc for ${CROSS_TARGET}: "
119
echo "${SYSROOT} not found."
123
for tool in ${CROSS_TARGET_AS} ${CROSS_TARGET_LD}; do
124
if [[ ! -e $tool ]]; then
125
echo "${tool} not found; exiting."
132
if [[ -d ${LLVM_INSTALL_DIR} ]]; then
133
echo "LLVM install dir ${LLVM_INSTALL_DIR} exists; skipping."
137
sudoCreateDir ${LLVM_INSTALL_DIR}
139
# Unpack LLVM tarball; should create the directory "llvm".
141
runCommand "Unpacking LLVM" tar jxf ${LLVM_PKG_PATH}/${LLVM_PKG}
143
# Configure, build, and install LLVM.
144
createDir ${LLVM_OBJ_DIR}
146
runAndLog "Configuring LLVM" ${LLVM_OBJ_DIR}/llvm-configure.log \
147
${LLVM_SRC_DIR}/configure \
150
--prefix=${LLVM_INSTALL_DIR} \
151
--target=${CROSS_TARGET} \
152
--with-llvmgccdir=${LLVMGCC_INSTALL_DIR}
153
runAndLog "Building LLVM" ${LLVM_OBJ_DIR}/llvm-build.log \
155
runAndLog "Installing LLVM" ${LLVM_OBJ_DIR}/llvm-install.log \
156
make ${MAKE_OPTS} install
160
if [[ -d ${LLVMGCC_INSTALL_DIR} ]]; then
161
echo "LLVM-GCC install dir ${LLVMGCC_INSTALL_DIR} exists; skipping."
165
sudoCreateDir ${LLVMGCC_INSTALL_DIR}
167
# Unpack LLVM-GCC tarball; should create the directory "llvm-gcc-4.2".
169
runCommand "Unpacking LLVM-GCC" tar jxf ${LLVM_PKG_PATH}/${LLVMGCC_PKG}
171
# Configure, build, and install LLVM-GCC.
172
createDir ${LLVMGCC_OBJ_DIR}
173
cd ${LLVMGCC_OBJ_DIR}
174
runAndLog "Configuring LLVM-GCC" ${LLVMGCC_OBJ_DIR}/llvmgcc-configure.log \
175
${LLVMGCC_SRC_DIR}/configure \
176
--enable-languages=c,c++ \
177
--enable-llvm=${LLVM_INSTALL_DIR} \
178
--prefix=${LLVMGCC_INSTALL_DIR} \
179
--program-prefix=llvm- \
180
--target=${CROSS_TARGET} \
181
--with-arch=${CROSS_MARCH} \
182
--with-as=${CROSS_TARGET_AS} \
183
--with-ld=${CROSS_TARGET_LD} \
184
--with-sysroot=${SYSROOT}
185
runAndLog "Building LLVM-GCC" ${LLVMGCC_OBJ_DIR}/llvmgcc-build.log \
187
runAndLog "Installing LLVM-GCC" ${LLVMGCC_OBJ_DIR}/llvmgcc-install.log \
191
echo "Building in ${SCRATCH_ROOT}; installing in ${INSTALL_ROOT}"
193
createDir ${SRC_ROOT}
194
createDir ${OBJ_ROOT}