Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: tools/llvm/utman-test.sh

Issue 7004033: This CL splits out the testing subpart of utman.sh into a separate script (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/llvm/utman.sh ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/bin/bash 1 #!/bin/bash
2 # Copyright (c) 2011 The Native Client Authors. All rights reserved. 2 # Copyright (c) 2011 The Native Client Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 # 5 #
6 #@ Untrusted Toolchain Manager 6 #@ Untrusted Toolchain Test Helper
7 #@------------------------------------------------------------------- 7 #@-------------------------------------------------------------------
8 #@ This script builds the ARM and PNaCl untrusted toolchains.
9 #@ It MUST be run from the native_client/ directory. 8 #@ It MUST be run from the native_client/ directory.
10 # 9 #@
11 ###################################################################### 10 #@ The env variables: UTMAN_CONCURRENCY, UTMAN_BUILDBOT, UTMAN_DEBUG
12 # Directory Layout Description 11 #@ control behavior of this script
13 ###################################################################### 12 #@
14 # All directories are relative to BASE which is 13
15 # On Linux X86-64: native_client/toolchain/pnacl_linux_x86_64/
16 # On Linux X86-32: native_client/toolchain/pnacl_linux_i686/
17 # On Mac X86-32 : native_client/toolchain/pnacl_darwin_i386/
18 #
19 # /x86-32sfi-lib [experimental] x86 sandboxed libraries and object files
20 # /x86-32sfi-tools [experimental] x86-32 crosstool binaries for building
21 # and linking x86-32 nexes
22 #
23 ###################################################################### 14 ######################################################################
24 # Config 15 # Config
25 ###################################################################### 16 ######################################################################
26 17
27 set -o nounset 18 set -o nounset
28 set -o errexit 19 set -o errexit
29 20
30 # The script is located in "native_client/tools/llvm". 21 # The script is located in "native_client/tools/llvm".
31 # Set pwd to native_client/ 22 # Set pwd to native_client/
32 cd "$(dirname "$0")"/../.. 23 cd "$(dirname "$0")"/../..
33 if [[ $(basename "$(pwd)") != "native_client" ]] ; then 24 if [[ $(basename "$(pwd)") != "native_client" ]] ; then
34 echo "ERROR: cannot find native_client/ directory" 25 echo "ERROR: cannot find native_client/ directory"
35 exit -1 26 exit -1
36 fi 27 fi
37 readonly NACL_ROOT="$(pwd)" 28 readonly NACL_ROOT="$(pwd)"
38 29
39 source tools/llvm/common-tools.sh 30 source tools/llvm/common-tools.sh
40 31 SetScriptPath "${NACL_ROOT}/tools/llvm/utman-test.sh"
41 SetScriptPath "${NACL_ROOT}/tools/llvm/utman.sh"
42 SetLogDirectory "${NACL_ROOT}/toolchain/hg-log"
43
44 # NOTE: gcc and llvm have to be synchronized
45 # we have chosen toolchains which both are based on gcc-4.2.1
46
47 # For different levels of make parallelism change this in your env 32 # For different levels of make parallelism change this in your env
48 readonly UTMAN_CONCURRENCY=${UTMAN_CONCURRENCY:-8} 33 readonly UTMAN_CONCURRENCY=${UTMAN_CONCURRENCY:-8}
49 UTMAN_BUILD_ARM=true
50 34
51 if ${BUILD_PLATFORM_MAC} ; then
52 # We don't yet support building ARM tools for mac.
53 UTMAN_BUILD_ARM=false
54 fi
55
56 # TODO(pdox): Decide what the target should really permanently be
57 readonly CROSS_TARGET_ARM=arm-none-linux-gnueabi
58 readonly CROSS_TARGET_X86_32=i686-none-linux-gnu
59 readonly CROSS_TARGET_X86_64=x86_64-none-linux-gnu
60 readonly BINUTILS_TARGET=arm-pc-nacl
61 readonly REAL_CROSS_TARGET=pnacl
62
63 readonly TC_ROOT="${NACL_ROOT}/toolchain"
64 readonly INSTALL_ROOT="${TC_ROOT}/pnacl_${BUILD_PLATFORM}_${BUILD_ARCH}"
65 readonly INSTALL_BIN="${INSTALL_ROOT}/bin"
66 readonly ARM_ARCH=armv7-a
67 readonly ARM_FPU=vfp
68 readonly INSTALL_DIR="${INSTALL_ROOT}/${CROSS_TARGET_ARM}"
69 readonly LDSCRIPTS_DIR="${INSTALL_ROOT}/ldscripts"
70 readonly GCC_VER="4.2.1"
71
72 # NOTE: NEWLIB_INSTALL_DIR also server as a SYSROOT
73 readonly NEWLIB_INSTALL_DIR="${INSTALL_ROOT}/arm-newlib"
74
75 readonly NNACL_ROOT="${TC_ROOT}/${SCONS_BUILD_PLATFORM}_x86_newlib"
76
77 readonly BFD_PLUGIN_DIR="${INSTALL_DIR}/lib/bfd-plugins"
78
79 readonly MAKE_OPTS="-j${UTMAN_CONCURRENCY} VERBOSE=1"
80
81 # For speculative build status output. ( see status function )
82 # Leave this blank, it will be filled during processing.
83 SPECULATIVE_REBUILD_SET=""
84
85 # The directory in which we we keep src dirs (from hg repos)
86 # and objdirs. These should be ABSOLUTE paths.
87
88 readonly TC_SRC="${NACL_ROOT}/hg"
89 readonly TC_BUILD="${TC_ROOT}/hg-build"
90
91 # The location of sources (absolute)
92 readonly TC_SRC_LLVM="${TC_SRC}/llvm"
93 readonly TC_SRC_LLVM_GCC="${TC_SRC}/llvm-gcc"
94 readonly TC_SRC_BINUTILS="${TC_SRC}/binutils"
95 readonly TC_SRC_NEWLIB="${TC_SRC}/newlib"
96 readonly TC_SRC_LIBSTDCPP="${TC_SRC_LLVM_GCC}/llvm-gcc-4.2/libstdc++-v3"
97
98 # Unfortunately, binutils/configure generates this untracked file
99 # in the binutils source directory
100 readonly BINUTILS_MESS="${TC_SRC_BINUTILS}/binutils-2.20/opcodes/i386-tbl.h"
101
102 readonly SERVICE_RUNTIME_SRC="${NACL_ROOT}/src/trusted/service_runtime"
103 readonly EXPORT_HEADER_SCRIPT="${SERVICE_RUNTIME_SRC}/export_header.py"
104 readonly NACL_SYS_HEADERS="${SERVICE_RUNTIME_SRC}/include"
105 readonly NACL_SYS_TS="${TC_SRC}/nacl.sys.timestamp"
106 readonly NEWLIB_INCLUDE_DIR="${TC_SRC_NEWLIB}/newlib-trunk/newlib/libc/include"
107
108 # The location of each project
109 # These should be absolute paths.
110 readonly TC_BUILD_LLVM="${TC_BUILD}/llvm"
111 readonly TC_BUILD_LLVM_GCC1="${TC_BUILD}/llvm-gcc-stage1"
112 readonly TC_BUILD_BINUTILS_ARM="${TC_BUILD}/binutils-arm"
113 readonly TC_BUILD_BINUTILS_LIBERTY="${TC_BUILD}/binutils-liberty"
114 readonly TC_BUILD_NEWLIB_ARM="${TC_BUILD}/newlib-arm"
115 readonly TC_BUILD_NEWLIB_BITCODE="${TC_BUILD}/newlib-bitcode"
116
117 # This apparently has to be at this location or gcc install breaks.
118 readonly TC_BUILD_LIBSTDCPP="${TC_BUILD_LLVM_GCC1}/${CROSS_TARGET_ARM}/libstdc++ -v3"
119
120 readonly TC_BUILD_LIBSTDCPP_BITCODE="${TC_BUILD_LLVM_GCC1}/libstdcpp-bitcode"
121
122 # These are fake directories, for storing the timestamp only
123 readonly TC_BUILD_EXTRASDK_BITCODE="${TC_BUILD}/extrasdk"
124
125 readonly TIMESTAMP_FILENAME="make-timestamp"
126
127 # PNaCl toolchain locations (absolute!)
128 readonly PNACL_TOOLCHAIN_ROOT="${INSTALL_ROOT}"
129 readonly PNACL_ARM_ROOT="${PNACL_TOOLCHAIN_ROOT}/libs-arm"
130 readonly PNACL_X8632_ROOT="${PNACL_TOOLCHAIN_ROOT}/libs-x8632"
131 readonly PNACL_X8664_ROOT="${PNACL_TOOLCHAIN_ROOT}/libs-x8664"
132 readonly PNACL_BITCODE_ROOT="${PNACL_TOOLCHAIN_ROOT}/libs-bitcode"
133
134 # PNaCl client-translators (sandboxed) binary locations
135 readonly PNACL_SB_ROOT="${INSTALL_ROOT}/tools-sb"
136 readonly PNACL_SB_X8632="${PNACL_SB_ROOT}/x8632"
137 readonly PNACL_SB_X8664="${PNACL_SB_ROOT}/x8664"
138 readonly PNACL_SB_UNIVERSAL="${PNACL_SB_ROOT}/universal"
139
140 # Location of PNaCl gcc/g++/as
141 readonly PNACL_GCC="${INSTALL_BIN}/pnacl-gcc"
142 readonly PNACL_GPP="${INSTALL_BIN}/pnacl-g++"
143 readonly PNACL_AR="${INSTALL_BIN}/pnacl-ar"
144 readonly PNACL_RANLIB="${INSTALL_BIN}/pnacl-ranlib"
145 readonly PNACL_AS="${INSTALL_BIN}/pnacl-as"
146 readonly PNACL_LD="${INSTALL_BIN}/pnacl-ld"
147 readonly PNACL_NM="${INSTALL_BIN}/pnacl-nm"
148 readonly PNACL_TRANSLATE="${INSTALL_BIN}/pnacl-translate"
149 readonly PNACL_READELF="${INSTALL_BIN}/readelf"
150 readonly PNACL_SIZE="${INSTALL_BIN}/size"
151
152 readonly PNACL_AS_ARM="${INSTALL_BIN}/pnacl-arm-as"
153 readonly PNACL_AS_X8632="${INSTALL_BIN}/pnacl-i686-as"
154 readonly PNACL_AS_X8664="${INSTALL_BIN}/pnacl-x86_64-as"
155
156 # For a production (release) build, we want the sandboxed
157 # translator to only contain the code needed to handle
158 # its own architecture. For example, the translator shipped with
159 # an X86-32 browser would only be able to translate to X86-32 code.
160 # This is so that the translator binary is as small as possible.
161 #
162 # If SBTC_PRODUCTION is true, then the translators are built
163 # separately, one for each architecture, so that each translator
164 # can only target its own architecture.
165 #
166 # If SBTC_PRODUCTION is false, then we instead use PNaCl to
167 # build a `fat` translator which can target all supported
168 # architectures. This translator is built as a .pexe
169 # which can then be translated to each individual architecture.
170 SBTC_PRODUCTION=${SBTC_PRODUCTION:-false}
171
172 # Which toolchain to use for each arch.
173 SBTC_BUILD_WITH_PNACL="arm x8632 x8664"
174
175 # Current milestones in each repo
176 # hg-update-all uses these
177 readonly LLVM_REV=12da952867e2
178 readonly LLVM_GCC_REV=cfdaa7f26019
179 readonly NEWLIB_REV=9bef47f82918
180 readonly BINUTILS_REV=09eb0704d27f
181
182 # Repositories
183 readonly REPO_LLVM_GCC="llvm-gcc.nacl-llvm-branches"
184 readonly REPO_LLVM="nacl-llvm-branches"
185 readonly REPO_NEWLIB="newlib.nacl-llvm-branches"
186 readonly REPO_BINUTILS="binutils.nacl-llvm-branches"
187
188
189 # These are simple compiler wrappers to force 32bit builds
190 # They are unused now. Instead we make sure that the toolchains that we
191 # distribute are created on the oldest system we care to support. Currently
192 # that is a 32 bit hardy. The advantage of this is that we can build
193 # the toolchaing shared, reducing its size and allowing the use of
194 # plugins. You can still use them by setting the environment variables
195 # when running this script:
196 # CC=$(GetAbsolutePath tools/llvm/mygcc32) \
197 # CXX=$(GetAbsolutePath tools/llvm/myg++32) \
198 # tools/llvm/utman.sh untrusted_sdk <file>
199 # NOTE: this has not been tried in a while and may no longer work
200 CC=${CC:-}
201 # TODO(espindola): This should be ${CXX:-}, but llvm-gcc's configure has a
202 # bug that brakes the build if we do that.
203 CXX=${CXX:-g++}
204
205 readonly CROSS_TARGET_AR=${INSTALL_DIR}/bin/${BINUTILS_TARGET}-ar
206 readonly CROSS_TARGET_RANLIB=${INSTALL_DIR}/bin/${BINUTILS_TARGET}-ranlib
207 readonly ILLEGAL_TOOL=${INSTALL_DIR}/pnacl-illegal
208
209 # NOTE: we do not expect the assembler or linker to be used for libs
210 # hence the use of ILLEGAL_TOOL.
211 STD_ENV_FOR_LIBSTDCPP=(
212 CC="${PNACL_GCC}"
213 CXX="${PNACL_GPP}"
214 RAW_CXX_FOR_TARGET="${PNACL_GPP}"
215 LD="${ILLEGAL_TOOL}"
216 CFLAGS="--pnacl-arm-bias"
217 CPPFLAGS="--pnacl-arm-bias"
218 CXXFLAGS="--pnacl-arm-bias"
219 CFLAGS_FOR_TARGET="--pnacl-arm-bias"
220 CPPFLAGS_FOR_TARGET="--pnacl-arm-bias"
221 CC_FOR_TARGET="${PNACL_GCC}"
222 GCC_FOR_TARGET="${PNACL_GCC}"
223 CXX_FOR_TARGET="${PNACL_GPP}"
224 AR="${PNACL_AR}"
225 AR_FOR_TARGET="${PNACL_AR}"
226 NM_FOR_TARGET="${PNACL_NM}"
227 RANLIB="${PNACL_RANLIB}"
228 RANLIB_FOR_TARGET="${PNACL_RANLIB}"
229 AS_FOR_TARGET="${ILLEGAL_TOOL}"
230 LD_FOR_TARGET="${ILLEGAL_TOOL}"
231 OBJDUMP_FOR_TARGET="${ILLEGAL_TOOL}" )
232
233 STD_ENV_FOR_NEWLIB=(
234 CFLAGS_FOR_TARGET="--pnacl-arm-bias"
235 CPPFLAGS_FOR_TARGET="--pnacl-arm-bias"
236 CC_FOR_TARGET="${PNACL_GCC}"
237 GCC_FOR_TARGET="${PNACL_GCC}"
238 CXX_FOR_TARGET="${PNACL_GPP}"
239 AR_FOR_TARGET="${PNACL_AR}"
240 NM_FOR_TARGET="${PNACL_NM}"
241 RANLIB_FOR_TARGET="${PNACL_RANLIB}"
242 OBJDUMP_FOR_TARGET="${ILLEGAL_TOOL}"
243 AS_FOR_TARGET="${ILLEGAL_TOOL}"
244 LD_FOR_TARGET="${ILLEGAL_TOOL}"
245 STRIP_FOR_TARGET="${ILLEGAL_TOOL}" )
246
247
248 # The gold plugin that we use is documented at
249 # http://llvm.org/docs/GoldPlugin.html
250 # Despite its name it is actually used by both gold and bfd. The changes to
251 # this file to enable its use are:
252 # * Build shared
253 # * --enable-gold and --enable-plugin when building binutils
254 # * --with-binutils-include when building binutils
255 # * linking the plugin in bfd-plugins
256
257
258 ######################################################################
259 ######################################################################
260 #
261 # < USER ACCESSIBLE FUNCTIONS >
262 #
263 ######################################################################
264 ######################################################################
265
266 #@-------------------------------------------------------------------------
267
268 #@ hg-info-all - Show status of repositories
269 hg-info-all() {
270 hg-pull-all
271
272 hg-info "${TC_SRC_LLVM}" ${LLVM_REV}
273 hg-info "${TC_SRC_LLVM_GCC}" ${LLVM_GCC_REV}
274 hg-info "${TC_SRC_NEWLIB}" ${NEWLIB_REV}
275 hg-info "${TC_SRC_BINUTILS}" ${BINUTILS_REV}
276 }
277
278 #@ hg-update-all - Update all repos to the latest stable rev
279 hg-update-all() {
280 hg-update-llvm-gcc
281 hg-update-llvm
282 hg-update-newlib
283 hg-update-binutils
284 }
285
286 hg-assert-safe-to-update() {
287 local name="$1"
288 local dir="$2"
289 local rev="$3"
290 local defstr=$(echo "${name}" | tr '[a-z]-' '[A-Z]_')
291
292 if ! hg-on-branch "${dir}" pnacl-sfi ; then
293 Banner "hg/${name} is not on branch pnacl-sfi"
294 exit -1
295 fi
296
297 if ! hg-has-changes "${dir}"; then
298 return 0
299 fi
300
301 if hg-at-revision "${dir}" "${rev}" ; then
302 return 0
303 fi
304
305 Banner \
306 " ERROR " \
307 " " \
308 " hg/${name} needs to be updated to the stable revision " \
309 " but has local modifications. " \
310 " " \
311 " If your repository is behind stable, update it using: " \
312 " " \
313 " cd hg/${name}; hg update ${rev} " \
314 " (you may need to resolve conflicts) " \
315 " " \
316 " If your repository is ahead of stable, then modify: " \
317 " ${defstr}_REV (in tools/llvm/utman.sh) " \
318 " to suppress this error message. "
319 exit -1
320 }
321
322
323 hg-bot-sanity() {
324 local name="$1"
325 local dir="$2"
326
327 if ! ${UTMAN_BUILDBOT} ; then
328 return 0
329 fi
330
331 if ! hg-on-branch "${dir}" pnacl-sfi ||
332 hg-has-changes "${dir}" ||
333 hg-has-untracked "${dir}" ; then
334 Banner "WARNING: hg/${name} is in an illegal state." \
335 " Wiping and trying again."
336 rm -rf "${dir}"
337 hg-checkout-${name}
338 fi
339 }
340
341 hg-update-common() {
342 local name="$1"
343 local rev="$2"
344 local dir="$3"
345
346 # If this is a buildbot, do sanity checks here.
347 hg-bot-sanity "${name}" "${dir}"
348
349 # Make sure it is safe to update
350 hg-assert-safe-to-update "${name}" "${dir}" "${rev}"
351
352 StepBanner "HG-UPDATE" "Updating ${name} to ${rev}"
353 hg-pull "${dir}"
354 hg-update "${dir}" ${rev}
355 }
356
357 #@ hg-update-llvm-gcc - Update LLVM-GCC to the stable revision
358 hg-update-llvm-gcc() {
359 hg-update-common "llvm-gcc" ${LLVM_GCC_REV} "${TC_SRC_LLVM_GCC}"
360 }
361
362 #@ hg-update-llvm - Update LLVM to the stable revision
363 hg-update-llvm() {
364 hg-update-common "llvm" ${LLVM_REV} "${TC_SRC_LLVM}"
365 }
366
367 #@ hg-update-newlib - Update NEWLIB To the stable revision
368 hg-update-newlib() {
369 # Clean the headers first, so that sanity checks inside
370 # hg-update-common do not see any local modifications.
371 newlib-nacl-headers-check
372 newlib-nacl-headers-clean
373 hg-update-common "newlib" ${NEWLIB_REV} "${TC_SRC_NEWLIB}"
374 newlib-nacl-headers
375 }
376
377 #@ hg-update-binutils - Update BINUTILS to the stable revision
378 hg-update-binutils() {
379 # Clean the binutils generated file first, so that sanity checks
380 # inside hg-update-common do not see any local modifications.
381 binutils-mess-hide
382 hg-update-common "binutils" ${BINUTILS_REV} "${TC_SRC_BINUTILS}"
383 binutils-mess-unhide
384 }
385
386 #@ hg-pull-all - Pull all repos. (but do not update working copy)
387 #@ hg-pull-REPO - Pull repository REPO.
388 #@ (REPO can be llvm-gcc, llvm, newlib, binutils)
389 hg-pull-all() {
390 StepBanner "HG-PULL" "Running 'hg pull' in all repos..."
391 hg-pull-llvm-gcc
392 hg-pull-llvm
393 hg-pull-newlib
394 hg-pull-binutils
395 }
396
397 hg-pull-llvm-gcc() {
398 hg-pull "${TC_SRC_LLVM_GCC}"
399 }
400
401 hg-pull-llvm() {
402 hg-pull "${TC_SRC_LLVM}"
403 }
404
405 hg-pull-newlib() {
406 hg-pull "${TC_SRC_NEWLIB}"
407 }
408
409 hg-pull-binutils() {
410 hg-pull "${TC_SRC_BINUTILS}"
411 }
412
413 #@ hg-checkout-all - check out mercurial repos needed to build toolchain
414 #@ (skips repos which are already checked out)
415 hg-checkout-all() {
416 StepBanner "HG-CHECKOUT-ALL"
417 hg-checkout-llvm-gcc
418 hg-checkout-llvm
419 hg-checkout-binutils
420 hg-checkout-newlib
421 }
422
423 hg-checkout-llvm-gcc() {
424 hg-checkout ${REPO_LLVM_GCC} ${TC_SRC_LLVM_GCC} ${LLVM_GCC_REV}
425 }
426
427 hg-checkout-llvm() {
428 hg-checkout ${REPO_LLVM} ${TC_SRC_LLVM} ${LLVM_REV}
429 }
430
431 hg-checkout-binutils() {
432 hg-checkout ${REPO_BINUTILS} ${TC_SRC_BINUTILS} ${BINUTILS_REV}
433 }
434
435 hg-checkout-newlib() {
436 hg-checkout ${REPO_NEWLIB} ${TC_SRC_NEWLIB} ${NEWLIB_REV}
437 newlib-nacl-headers
438 }
439
440 #@ hg-clean - Remove all repos. (WARNING: local changes are lost)
441 hg-clean() {
442 StepBanner "HG-CLEAN"
443
444 echo "Are you sure?"
445 echo "This will DELETE all source repositories under 'native_client/hg'"
446 echo "Any local changes will be lost."
447 echo ""
448 echo "Type YES to confirm: "
449 read CONFIRM_TEXT
450
451 if [ $CONFIRM_TEXT == "YES" ]; then
452 StepBanner "HG-CLEAN" "Cleaning Mercurial repositories"
453 rm -rf "${TC_SRC}"
454 else
455 StepBanner "HG-CLEAN" "Clean cancelled by user"
456 fi
457 }
458
459 #@-------------------------------------------------------------------------
460
461 #@ download-trusted - Download and Install trusted SDKs (arm,x86-32,x86-64)
462 #@ (your untrusted build will not be modified)
463 download-trusted() {
464 StepBanner "DOWNLOAD-TRUSTED" "Downloading trusted toolchains"
465 local installdir="${INSTALL_ROOT}"
466 local tmpdir="${installdir}-backup"
467 local dldir="${installdir}-downloaded"
468
469 rm -rf "${dldir}"
470
471 if [ -d "${tmpdir}" ]; then
472 echo "ERROR: It is not expected that directory '${tmpdir}' exists."
473 echo " Please delete it if you don't need it"
474 exit -1
475 fi
476
477 if [ -d "${installdir}" ]; then
478 mv "${installdir}" "${tmpdir}"
479 fi
480
481 download-toolchains
482
483 if [ -d "${installdir}" ]; then
484 mv "${installdir}" "${dldir}"
485 fi
486
487 if [ -d "${tmpdir}" ]; then
488 mv "${tmpdir}" "${installdir}"
489 fi
490 }
491
492 #@-------------------------------------------------------------------------
493
494 #@ download-toolchains - Download and Install all SDKs (arm,x86-32,x86-64)
495
496 download-toolchains() {
497 gclient runhooks --force
498 }
499
500 #@-------------------------------------------------------------------------
501 #@ rebuild-pnacl-libs - organized native libs and build bitcode libs
502 rebuild-pnacl-libs() {
503 extrasdk-clean
504 clean-pnacl
505 newlib-bitcode
506 libstdcpp-bitcode
507 # NOTE: currently also builds some native code
508 extrasdk-make-install
509 organize-native-code
510 }
511
512
513 #@ everything - Build and install untrusted SDK.
514 everything() {
515
516 mkdir -p "${INSTALL_ROOT}"
517
518 # This is needed to build misc-tools and run ARM tests.
519 # We check this early so that there are no surprises later, and we can
520 # handle all user interaction early.
521 check-for-trusted
522
523 hg-checkout-all
524 hg-update-all
525
526 clean-install
527 RecordRevisionInfo
528
529 clean-logs
530
531 binutils-arm
532 llvm
533 driver
534 gcc-stage1-sysroot
535 gcc-stage1 ${CROSS_TARGET_ARM}
536 gcc-stage1 ${CROSS_TARGET_X86_32}
537 gcc-stage1 ${CROSS_TARGET_X86_64}
538
539 rebuild-pnacl-libs
540
541 # NOTE: we delay the tool building till after the sdk is essentially
542 # complete, so that sdk sanity checks don't fail
543 misc-tools
544
545 verify
546 }
547
548 #@ all - Alias for 'everything'
549 all() {
550 everything
551 }
552
553 #@ status - Show status of build directories
554 status() {
555 # TODO(robertm): this is currently broken
556 StepBanner "BUILD STATUS"
557
558 status-helper "BINUTILS-ARM" binutils-arm
559 status-helper "LLVM" llvm
560 status-helper "GCC-STAGE1" gcc-stage1
561
562 status-helper "NEWLIB-ARM" newlib-arm
563
564 status-helper "NEWLIB-BITCODE" newlib-bitcode
565 status-helper "EXTRASDK-BITCODE" extrasdk
566 status-helper "LIBSTDCPP-BITCODE" extrasdk-bitcode
567
568 }
569
570 status-helper() {
571 local title="$1"
572 local mod="$2"
573
574 if ${mod}-needs-configure; then
575 StepBanner "$title" "NEEDS FULL REBUILD"
576 speculative-add "${mod}"
577 elif ${mod}-needs-make; then
578 StepBanner "$title" "NEEDS MAKE (INCREMENTAL)"
579 speculative-add "${mod}"
580 else
581 StepBanner "$title" "OK (UP TO DATE)"
582 fi
583 }
584
585 speculative-add() {
586 local mod="$1"
587 SPECULATIVE_REBUILD_SET="${SPECULATIVE_REBUILD_SET} ${mod}"
588 }
589
590 speculative-check() {
591 local mod="$1"
592 local search=$(echo "${SPECULATIVE_REBUILD_SET}" | grep -F "$mod")
593 [ ${#search} -gt 0 ]
594 return $?
595 }
596
597
598
599 #@ clean - Clean the build and install directories.
600 clean() {
601 StepBanner "CLEAN" "Cleaning build, log, and install directories."
602
603 clean-logs
604 clean-build
605 clean-install
606 clean-scons
607 }
608
609 #@ fast-clean - Clean everything except LLVM.
610 fast-clean() {
611 local did_backup=false
612 local backup_dir="${NACL_ROOT}/llvm-build-backup"
613
614 if [ -d "${TC_BUILD_LLVM}" ]; then
615 rm -rf "${backup_dir}"
616 mv "${TC_BUILD_LLVM}" "${backup_dir}"
617 did_backup=true
618 fi
619
620 clean
621
622 if ${did_backup} ; then
623 mkdir -p "${TC_BUILD}"
624 mv "${backup_dir}" "${TC_BUILD_LLVM}"
625 fi
626 }
627
628 binutils-mess-hide() {
629 local messtmp="${TC_SRC}/binutils.tmp"
630 if [ -f "${BINUTILS_MESS}" ] ; then
631 mv "${BINUTILS_MESS}" "${messtmp}"
632 fi
633 }
634
635 binutils-mess-unhide() {
636 local messtmp="${TC_SRC}/binutils.tmp"
637 if [ -f "${messtmp}" ] ; then
638 mv "${messtmp}" "${BINUTILS_MESS}"
639 fi
640 }
641
642 #+ clean-scons - Clean scons-out directory
643 clean-scons() {
644 rm -rf scons-out
645 }
646
647 #+ clean-build - Clean all build directories
648 clean-build() {
649 rm -rf "${TC_BUILD}"
650 }
651
652 #+ clean-install - Clean install directories
653 clean-install() {
654 rm -rf "${INSTALL_ROOT}"
655 }
656
657 #+ clean-pnacl - Removes the pnacl-untrusted installation directory
658 clean-pnacl() {
659 StepBanner "pnacl" "cleaning ${PNACL_TOOLCHAIN_ROOT}/libs-*"
660 rm -rf ${PNACL_ARM_ROOT} \
661 ${PNACL_BITCODE_ROOT} \
662 ${PNACL_X8632_ROOT} \
663 ${PNACL_X8664_ROOT}
664 }
665
666
667
668
669 #@-------------------------------------------------------------------------
670
671 #@ untrusted_sdk <file> - Create untrusted SDK tarball from scratch
672 #@ (clean + all + prune + tarball)
673 untrusted_sdk() {
674 if [ ! -n "${1:-}" ]; then
675 echo "Error: untrusted_sdk needs a tarball name." >&2
676 exit 1
677 fi
678
679 clean
680 everything
681 prune
682 install-translators srpc
683 prune-translator-install srpc
684 tarball $1
685 }
686
687 #+ prune - Prune toolchain
688 prune() {
689 StepBanner "PRUNE" "Pruning toolchain"
690 local ACCEPTABLE_SIZE=250
691 local dir_size_before=$(get_dir_size_in_mb ${INSTALL_ROOT})
692
693 SubBanner "Size before: ${INSTALL_ROOT} ${dir_size_before}MB"
694 echo "removing some static libs we do not have any use for"
695 rm -f "${INSTALL_DIR}"/lib/lib*.a
696
697 echo "removing x86-32 frontend"
698 rm -rf "${INSTALL_DIR}"/libexec/gcc/i686-none-linux-gnu/
699 rm -rf "${INSTALL_DIR}"/bin/i686-none-linux-gnu-*
700
701 echo "removing x86-64 frontend"
702 rm -rf "${INSTALL_DIR}"/libexec/gcc/x86_64-none-linux-gnu/
703 rm -rf "${INSTALL_DIR}"/bin/x86_64-none-linux-gnu-*
704
705 echo "stripping binaries"
706 strip "${INSTALL_DIR}"/libexec/gcc/arm-none-linux-gnueabi/${GCC_VER}/c*
707 if ! strip "${INSTALL_DIR}"/bin/* ; then
708 echo "NOTE: some failures during stripping are expected"
709 fi
710
711 echo "removing llvm headers"
712 rm -rf "${INSTALL_DIR}"/include/llvm*
713
714 local dir_size_after=$(get_dir_size_in_mb ${INSTALL_ROOT})
715 SubBanner "Size after: ${INSTALL_ROOT} ${dir_size_after}MB"
716
717 if [[ ${dir_size_after} -gt ${ACCEPTABLE_SIZE} ]] ; then
718 echo "ERROR: size of toolchain exceeds ${ACCEPTABLE_SIZE}MB"
719 exit -1
720 fi
721
722 }
723
724 #+ tarball <filename> - Produce tarball file
725 tarball() {
726 if [ ! -n "${1:-}" ]; then
727 echo "Error: tarball needs a tarball name." >&2
728 exit 1
729 fi
730
731 local tarball="$1"
732 StepBanner "TARBALL" "Creating tar ball ${tarball}"
733
734 tar zcf "${tarball}" -C "${INSTALL_ROOT}" .
735 }
736
737
738 #########################################################################
739 # < LLVM >
740 #########################################################################
741
742
743 #+-------------------------------------------------------------------------
744 #+ llvm - Configure, build and install LLVM.
745
746 llvm() {
747 StepBanner "LLVM"
748
749 local srcdir="${TC_SRC_LLVM}"
750
751 assert-dir "${srcdir}" "You need to checkout LLVM."
752
753 if llvm-needs-configure; then
754 llvm-configure
755 else
756 SkipBanner "LLVM" "configure"
757 fi
758
759 if llvm-needs-make; then
760 llvm-make
761 else
762 SkipBanner "LLVM" "make"
763 fi
764
765 llvm-install
766 }
767
768 #+ llvm-clean - Clean LLVM completely
769 llvm-clean() {
770 StepBanner "LLVM" "Clean"
771 local objdir="${TC_BUILD_LLVM}"
772 rm -rf ${objdir}
773 mkdir -p ${objdir}
774 }
775
776 # Default case - Optimized configure
777 LLVM_EXTRA_OPTIONS="--enable-optimized"
778
779 #+ llvm-configure - Run LLVM configure
780 llvm-configure() {
781 StepBanner "LLVM" "Configure"
782
783 local srcdir="${TC_SRC_LLVM}"
784 local objdir="${TC_BUILD_LLVM}"
785
786 mkdir -p "${objdir}"
787 spushd "${objdir}"
788
789 # The --with-binutils-include is to allow llvm to build the gold plugin
790 local binutils_include="${TC_SRC_BINUTILS}/binutils-2.20/include"
791 RunWithLog "llvm.configure" \
792 env -i PATH=/usr/bin/:/bin \
793 MAKE_OPTS=${MAKE_OPTS} \
794 CC=${CC} \
795 CXX=${CXX} \
796 ${srcdir}/llvm-trunk/configure \
797 --disable-jit \
798 --with-binutils-include=${binutils_include} \
799 --enable-targets=x86,x86_64,arm \
800 --target=${CROSS_TARGET_ARM} \
801 --prefix=${INSTALL_DIR} \
802 --with-llvmgccdir=${INSTALL_DIR} \
803 ${LLVM_EXTRA_OPTIONS}
804
805
806 spopd
807 }
808
809 #+ llvm-configure-dbg - Run LLVM configure
810 # Not used by default. Call manually.
811 llvm-configure-dbg() {
812 StepBanner "LLVM" "Configure With Debugging"
813 LLVM_EXTRA_OPTIONS="--disable-optimized \
814 --enable-debug-runtime \
815 --enable-assertions "
816 llvm-configure
817 }
818
819
820 llvm-needs-configure() {
821 [ ! -f "${TC_BUILD_LLVM}/config.status" ]
822 return $?
823 }
824
825 llvm-needs-make() {
826 local srcdir="${TC_SRC_LLVM}"
827 local objdir="${TC_BUILD_LLVM}"
828
829 ts-modified "$srcdir" "$objdir"
830 return $?
831 }
832
833 #+ llvm-make - Run LLVM 'make'
834 llvm-make() {
835 StepBanner "LLVM" "Make"
836
837 local srcdir="${TC_SRC_LLVM}"
838 local objdir="${TC_BUILD_LLVM}"
839
840 spushd "${objdir}"
841
842 ts-touch-open "${objdir}"
843
844 RunWithLog llvm.make \
845 env -i PATH=/usr/bin/:/bin \
846 MAKE_OPTS="${MAKE_OPTS}" \
847 NACL_SANDBOX=0 \
848 CC=${CC} \
849 CXX=${CXX} \
850 make ${MAKE_OPTS} all
851
852 ts-touch-commit "${objdir}"
853
854 spopd
855 }
856
857 #+ llvm-install - Install LLVM
858 llvm-install() {
859 StepBanner "LLVM" "Install"
860
861 spushd "${TC_BUILD_LLVM}"
862 RunWithLog llvm.install \
863 make ${MAKE_OPTS} install
864
865 mkdir -p "${BFD_PLUGIN_DIR}"
866
867 if ${BUILD_PLATFORM_MAC} ; then
868 ln -sf ../../lib/libLLVMgold.dylib "${BFD_PLUGIN_DIR}"
869 ln -sf ../../lib/libLTO.dylib "${BFD_PLUGIN_DIR}"
870 elif ${BUILD_PLATFORM_LINUX} ; then
871 ln -sf ../../lib/libLLVMgold.so "${BFD_PLUGIN_DIR}"
872 ln -sf ../../lib/libLTO.so "${BFD_PLUGIN_DIR}"
873 else
874 echo "Unhandled host"
875 exit -1
876 fi
877
878 spopd
879 }
880
881
882
883 #########################################################################
884 # < GCC STAGE 1 >
885 #########################################################################
886
887 # Build "pregcc" which is a gcc that does not depend on having glibc/newlib
888 # already compiled. This also generates some important headers (confirm this).
889 #
890 # NOTE: depends on newlib source being set up so we can use it to set
891 # up a sysroot.
892 #
893
894 #+-------------------------------------------------------------------------
895 #+ gcc-stage1 - build and install pre-gcc
896 gcc-stage1() {
897 local target=$1
898 StepBanner "GCC-${target}"
899
900 if gcc-stage1-needs-configure ${target}; then
901 gcc-stage1-clean ${target}
902 gcc-stage1-configure ${target}
903 else
904 SkipBanner "GCC-${target}" "configure"
905 fi
906
907 # We must always make before we do make install, because
908 # the build must occur in a patched environment.
909 # http://code.google.com/p/nativeclient/issues/detail?id=1128
910 gcc-stage1-make ${target}
911
912 gcc-stage1-install ${target}
913 }
914
915 #+ gcc-stage1-sysroot - setup initial sysroot
916 gcc-stage1-sysroot() {
917 StepBanner "GCC" "Setting up initial sysroot"
918
919 local sys_include="${INSTALL_DIR}/${CROSS_TARGET_ARM}/include"
920 local sys_include2="${INSTALL_DIR}/${CROSS_TARGET_ARM}/sys-include"
921
922 rm -rf "${sys_include}" "${sys_include2}"
923 mkdir -p "${sys_include}"
924 ln -sf "${sys_include}" "${sys_include2}"
925 cp -r "${NEWLIB_INCLUDE_DIR}"/* ${sys_include}
926 }
927
928 #+ gcc-stage1-clean - Clean gcc stage 1
929 gcc-stage1-clean() {
930 local target=$1
931
932 StepBanner "GCC-${target}" "Clean"
933 local objdir="${TC_BUILD_LLVM_GCC1}-${target}"
934 rm -rf "${objdir}"
935 }
936
937 gcc-stage1-needs-configure() {
938 local target=$1
939 speculative-check "llvm" && return 0
940 ts-newer-than "${TC_BUILD_LLVM}" \
941 "${TC_BUILD_LLVM_GCC1}-${target}" && return 0
942 [ ! -f "${TC_BUILD_LLVM_GCC1}-${target}/config.status" ]
943 return $?
944 }
945
946 #+ gcc-stage1-configure - Configure GCC stage 1
947 gcc-stage1-configure() {
948 local target=$1
949 StepBanner "GCC-${target}" "Configure ${target}"
950
951 local srcdir="${TC_SRC_LLVM_GCC}"
952 local objdir="${TC_BUILD_LLVM_GCC1}-${target}"
953
954 mkdir -p "${objdir}"
955 spushd "${objdir}"
956
957 # NOTE: hack, assuming presence of x86/32 toolchain (used for both 32/64)
958 local config_opts=""
959 case ${target} in
960 arm-*)
961 config_opts="--with-as=${PNACL_AS_ARM} \
962 --with-arch=${ARM_ARCH} \
963 --with-fpu=${ARM_FPU}"
964 ;;
965 i686-*)
966 config_opts="--with-as=${PNACL_AS_X8632}"
967 ;;
968 x86_64-*)
969 config_opts="--with-as=${PNACL_AS_X8664}"
970 ;;
971 esac
972
973 # TODO(robertm): do we really need CROSS_TARGET_*
974 RunWithLog llvm-pregcc-${target}.configure \
975 env -i PATH=/usr/bin/:/bin \
976 CC=${CC} \
977 CXX=${CXX} \
978 CFLAGS="-Dinhibit_libc" \
979 ${srcdir}/llvm-gcc-4.2/configure \
980 --prefix=${INSTALL_DIR} \
981 --enable-llvm=${INSTALL_DIR} \
982 --with-newlib \
983 --disable-libmudflap \
984 --disable-decimal-float \
985 --disable-libssp \
986 --disable-libgomp \
987 --disable-multilib \
988 --enable-languages=c,c++ \
989 --disable-threads \
990 --disable-libstdcxx-pch \
991 --disable-shared \
992 --without-headers \
993 ${config_opts} \
994 --target=${target} \
995 --with-sysroot="${NEWLIB_INSTALL_DIR}"
996
997 spopd
998 }
999
1000 gcc-stage1-make() {
1001 local target=$1
1002 local srcdir="${TC_SRC_LLVM_GCC}"
1003 local objdir="${TC_BUILD_LLVM_GCC1}-${target}"
1004 spushd ${objdir}
1005
1006 StepBanner "GCC-${target}" "Make (Stage 1)"
1007
1008 ts-touch-open "${objdir}"
1009
1010 # In case it is still patched from an interrupted make
1011 xgcc-unpatch-nofail "${target}"
1012
1013 # we built our version of binutil for multiple targets, so they work here
1014 local ar=${CROSS_TARGET_AR}
1015 local ranlib=${CROSS_TARGET_RANLIB}
1016 mkdir -p "${objdir}/dummy-bin"
1017 ln -sf ${ar} "${objdir}/dummy-bin/${target}-ar"
1018 ln -sf ${ranlib} "${objdir}/dummy-bin/${target}-ranlib"
1019
1020 # NOTE: we add ${INSTALL_DIR}/bin to PATH
1021 RunWithLog llvm-pregcc-${target}.make \
1022 env -i PATH=/usr/bin/:/bin:${INSTALL_DIR}/bin:${objdir}/dummy-bin \
1023 CC=${CC} \
1024 CXX=${CXX} \
1025 CFLAGS="-Dinhibit_libc" \
1026 make ${MAKE_OPTS} all-gcc
1027
1028 xgcc-patch "${target}"
1029
1030 RunWithLog libgcc.clean \
1031 env -i PATH=/usr/bin/:/bin:${INSTALL_DIR}/bin \
1032 make clean-target-libgcc
1033
1034 StepBanner "GCC-${target}" "Make (Stage 2)"
1035 # NOTE: This builds more than what we need right now. For example,
1036 # libstdc++ is unused (we always use the bitcode one). This might change
1037 # when we start supporting shared libraries.
1038 RunWithLog llvm-pregcc2-${target}.make \
1039 env -i PATH=/usr/bin/:/bin:${INSTALL_DIR}/bin:${objdir}/dummy-bin \
1040 CC=${CC} \
1041 CXX=${CXX} \
1042 CFLAGS="-Dinhibit_libc" \
1043 make ${MAKE_OPTS} all
1044
1045 xgcc-unpatch "${target}"
1046
1047 ts-touch-commit "${objdir}"
1048
1049 spopd
1050 }
1051
1052 #+ xgcc-patch - Patch xgcc and clean libgcc
1053 xgcc-patch() {
1054 # This is a hack. Ideally gcc would be configured with a pnacl-nacl target
1055 # and xgcc would produce sfi code automatically. This is not the case, so
1056 # we cheat gcc's build by replacing xgcc behind its back.
1057 local target="$1"
1058 local objdir="${TC_BUILD_LLVM_GCC1}-${target}"
1059 local XGCC="${objdir}/gcc/xgcc"
1060 local XGCC_REAL="${XGCC}-real"
1061 local arch=""
1062 local driver=""
1063
1064 StepBanner "GCC-${target}" "Patching xgcc and cleaning libgcc $target"
1065
1066 # Make sure XGCC exists
1067 if [ ! -f "${XGCC}" ] ; then
1068 Abort "xgcc-patch" "Real xgcc does not exist."
1069 return
1070 fi
1071
1072 # Make sure it is a real ELF file
1073 if is-shell-script "${XGCC}" ; then
1074 Abort "xgcc-patch" "xgcc already patched"
1075 return
1076 fi
1077
1078 # N.B:
1079 # * We have to use the arch cc1 istead of the more common practice of using
1080 # the ARM cc1 for everything. The reason is that the ARM cc1 will reject a
1081 # asm that uses ebx for example
1082 # * Because of the previous item, we have to use the arch driver bacuse
1083 # the ARM driver will pass options like -mfpu that the x86 cc1 cannot handle.
1084 case ${target} in
1085 arm-*) arch="arm" ;;
1086 i686-*) arch="x86-32" ;;
1087 x86_64-*) arch="x86-64" ;;
1088 esac
1089
1090 mv "${XGCC}" "${XGCC_REAL}"
1091 cat > "${XGCC}" <<EOF
1092 #!/bin/sh
1093 XGCC_ABSPATH=\$(cd \$(dirname \$0) && pwd)
1094 XGCC_NAME=\$(basename \$0)
1095 XGCC_REAL=\${XGCC_ABSPATH}/\${XGCC_NAME}-real
1096 ${PNACL_GCC} \\
1097 --driver="\${XGCC_REAL}" \\
1098 --pnacl-bias=${arch} -arch ${arch} "\$@"
1099 EOF
1100
1101 chmod 755 "${XGCC}"
1102
1103 }
1104
1105 xgcc-unpatch() {
1106 local target="$1"
1107 local objdir="${TC_BUILD_LLVM_GCC1}-${target}"
1108 local XGCC="${objdir}/gcc/xgcc"
1109 local XGCC_REAL="${XGCC}-real"
1110
1111 StepBanner "GCC-${target}" "Unpatching xgcc"
1112
1113 # Make sure XGCC exists
1114 if [ ! -f "${XGCC}" ] ; then
1115 Abort "xgcc-unpatch" "Real xgcc does not exist."
1116 return
1117 fi
1118
1119 # Make sure it isn't a real ELF file
1120 if ! is-shell-script "${XGCC}" ; then
1121 Abort "xgcc-unpatch" "xgcc already unpatched?"
1122 return
1123 fi
1124
1125 rm "${XGCC}"
1126 mv "${XGCC_REAL}" "${XGCC}"
1127 }
1128
1129 xgcc-unpatch-nofail() {
1130 local target="$1"
1131 local objdir="${TC_BUILD_LLVM_GCC1}-${target}"
1132 local XGCC="${objdir}/gcc/xgcc"
1133 local XGCC_REAL="${XGCC}-real"
1134
1135 # If the old patch file exists, delete it.
1136 if [ -f "${XGCC}" ] && is-shell-script "${XGCC}"; then
1137 rm "${XGCC}"
1138 fi
1139
1140 # If there's a real one around, move it back.
1141 if [ -f "${XGCC_REAL}" ]; then
1142 mv "${XGCC_REAL}" "${XGCC}"
1143 fi
1144 }
1145
1146 #+ gcc-stage1-install - Install GCC stage 1
1147 gcc-stage1-install() {
1148 local target=$1
1149 StepBanner "GCC-${target}" "Install ${target}"
1150
1151 local objdir="${TC_BUILD_LLVM_GCC1}-${target}"
1152 spushd "${TC_BUILD_LLVM_GCC1}-${target}"
1153
1154 # NOTE: we add ${INSTALL_DIR}/bin to PATH
1155 RunWithLog llvm-pregcc-${target}.install \
1156 env -i PATH=/usr/bin/:/bin:${INSTALL_DIR}/bin:${objdir}/dummy-bin \
1157 CC=${CC} \
1158 CXX=${CXX} \
1159 CFLAGS="-Dinhibit_libc" \
1160 make ${MAKE_OPTS} install
1161
1162 spopd
1163 }
1164
1165
1166 #########################################################################
1167 #########################################################################
1168 # < LIBSTDCPP-BITCODE >
1169 #########################################################################
1170 #########################################################################
1171
1172 #+ libstdcpp-bitcode - build and install libstdcpp in bitcode
1173 libstdcpp-bitcode() {
1174 StepBanner "LIBSTDCPP-BITCODE"
1175
1176 if libstdcpp-bitcode-needs-configure; then
1177 libstdcpp-bitcode-clean
1178 libstdcpp-bitcode-configure
1179 else
1180 SkipBanner "LIBSTDCPP-BITCODE" "configure"
1181 fi
1182
1183 if libstdcpp-bitcode-needs-make; then
1184 libstdcpp-bitcode-make
1185 else
1186 SkipBanner "LIBSTDCPP-BITCODE" "make"
1187 fi
1188
1189 libstdcpp-bitcode-install
1190 }
1191
1192 #+ libstdcpp-bitcode-clean - clean libstdcpp in bitcode
1193 libstdcpp-bitcode-clean() {
1194 StepBanner "LIBSTDCPP-BITCODE" "Clean"
1195 rm -rf "${TC_BUILD_LIBSTDCPP_BITCODE}"
1196 }
1197
1198 libstdcpp-bitcode-needs-configure() {
1199 speculative-check "gcc-stage1" && return 0
1200 ts-newer-than "${TC_BUILD_LLVM_GCC1}-${CROSS_TARGET_ARM}" \
1201 "${TC_BUILD_LIBSTDCPP_BITCODE}" && return 0
1202 [ ! -f "${TC_BUILD_LIBSTDCPP_BITCODE}/config.status" ]
1203 return #?
1204 }
1205
1206 #+ libstdcpp-bitcode-configure - configure libstdcpp for bitcode
1207 libstdcpp-bitcode-configure() {
1208 StepBanner "LIBSTDCPP-BITCODE" "Configure"
1209 libstdcpp-configure-common "${TC_BUILD_LIBSTDCPP_BITCODE}"
1210 }
1211
1212 libstdcpp-configure-common() {
1213 local srcdir="${TC_SRC_LIBSTDCPP}"
1214 local objdir="$1"
1215
1216 mkdir -p "${objdir}"
1217 spushd "${objdir}"
1218
1219 RunWithLog llvm-gcc.configure_libstdcpp \
1220 env -i PATH=/usr/bin/:/bin:${INSTALL_DIR}/bin \
1221 "${STD_ENV_FOR_LIBSTDCPP[@]}" \
1222 "${srcdir}"/configure \
1223 --host=${CROSS_TARGET_ARM} \
1224 --prefix=${INSTALL_DIR} \
1225 --enable-llvm=${INSTALL_DIR} \
1226 --with-newlib \
1227 --disable-libstdcxx-pch \
1228 --disable-shared \
1229 --enable-languages=c,c++ \
1230 --target=${CROSS_TARGET_ARM} \
1231 --with-sysroot=${NEWLIB_INSTALL_DIR} \
1232 --with-arch=${ARM_ARCH} \
1233 --srcdir="${srcdir}"
1234 spopd
1235 }
1236
1237 libstdcpp-bitcode-needs-make() {
1238 local srcdir="${TC_SRC_LIBSTDCPP}"
1239 local objdir="${TC_BUILD_LIBSTDCPP_BITCODE}"
1240
1241 ts-modified "$srcdir" "$objdir"
1242 return $?
1243 }
1244
1245 #+ libstdcpp-bitcode-make - Make libstdcpp in bitcode
1246 libstdcpp-bitcode-make() {
1247 StepBanner "LIBSTDCPP-BITCODE" "Make"
1248 libstdcpp-make-common "${TC_BUILD_LIBSTDCPP_BITCODE}"
1249 }
1250
1251 libstdcpp-make-common() {
1252 local srcdir="${TC_SRC_LIBSTDCPP}"
1253 local objdir="$1"
1254
1255 ts-touch-open "${objdir}"
1256
1257 spushd "${objdir}"
1258 RunWithLog llvm-gcc.make_libstdcpp \
1259 env -i PATH=/usr/bin/:/bin:${INSTALL_DIR}/bin \
1260 make \
1261 "${STD_ENV_FOR_LIBSTDCPP[@]}" \
1262 ${MAKE_OPTS}
1263 spopd
1264
1265 ts-touch-commit "${objdir}"
1266 }
1267
1268 #+ libstdcpp-bitcode-install - Install libstdcpp in bitcode
1269 libstdcpp-bitcode-install() {
1270 StepBanner "LIBSTDCPP-BITCODE" "Install"
1271 local objdir="${TC_BUILD_LIBSTDCPP_BITCODE}"
1272 local dest="${PNACL_BITCODE_ROOT}"
1273
1274 spushd "${objdir}"
1275
1276 # install headers (=install-data)
1277 # for good measure make sure we do not keep any old headers
1278 rm -rf "${INSTALL_ROOT}/include/c++"
1279 RunWithLog llvm-gcc.install_libstdcpp \
1280 make \
1281 "${STD_ENV_FOR_LIBSTDCPP[@]}" \
1282 ${MAKE_OPTS} install-data
1283 # install bitcode library
1284 cp "${objdir}/src/.libs/libstdc++.a" "${dest}"
1285
1286 spopd
1287 }
1288
1289 #+ misc-tools - Build and install sel_ldr and validator for ARM.
1290 misc-tools() {
1291 if ${UTMAN_BUILD_ARM} ; then
1292 StepBanner "MISC-ARM" "Building sel_ldr (ARM)"
1293
1294 # TODO(robertm): revisit some of these options
1295 RunWithLog arm_sel_ldr \
1296 ./scons MODE=opt-host \
1297 platform=arm \
1298 sdl=none \
1299 naclsdk_validate=0 \
1300 sysinfo=0 \
1301 sel_ldr
1302 rm -rf "${INSTALL_ROOT}/tools-arm"
1303 mkdir "${INSTALL_ROOT}/tools-arm"
1304 local sconsdir="scons-out/opt-${SCONS_BUILD_PLATFORM}-arm"
1305 cp "${sconsdir}/obj/src/trusted/service_runtime/sel_ldr" \
1306 "${INSTALL_ROOT}/tools-arm"
1307 else
1308 StepBanner "MISC-ARM" "Skipping ARM sel_ldr (No trusted ARM toolchain)"
1309 fi
1310
1311 if ${BUILD_PLATFORM_LINUX} ; then
1312 StepBanner "MISC-ARM" "Building validator (ARM)"
1313 RunWithLog arm_ncval_core \
1314 ./scons MODE=opt-host \
1315 targetplatform=arm \
1316 sysinfo=0 \
1317 arm-ncval-core
1318 rm -rf "${INSTALL_ROOT}/tools-x86"
1319 mkdir "${INSTALL_ROOT}/tools-x86"
1320 cp scons-out/opt-linux-x86-32-to-arm/obj/src/trusted/validator_arm/\
1321 arm-ncval-core ${INSTALL_ROOT}/tools-x86
1322 else
1323 StepBanner "MISC-ARM" "Skipping ARM validator (Not yet supported on Mac)"
1324 fi
1325 }
1326
1327
1328 #########################################################################
1329 # < BINUTILS >
1330 #########################################################################
1331
1332 #+-------------------------------------------------------------------------
1333 #+ binutils-arm - Build and install binutils for ARM
1334 binutils-arm() {
1335 StepBanner "BINUTILS-ARM"
1336
1337 local srcdir="${TC_SRC_BINUTILS}"
1338
1339 assert-dir "${srcdir}" "You need to checkout binutils."
1340
1341 if binutils-arm-needs-configure; then
1342 binutils-arm-clean
1343 binutils-arm-configure
1344 else
1345 SkipBanner "BINUTILS-ARM" "configure"
1346 fi
1347
1348 if binutils-arm-needs-make; then
1349 binutils-arm-make
1350 else
1351 SkipBanner "BINUTILS-ARM" "make"
1352 fi
1353
1354 binutils-arm-install
1355 }
1356
1357 #+ binutils-arm-clean - Clean binutils
1358 binutils-arm-clean() {
1359 StepBanner "BINUTILS-ARM" "Clean"
1360 local objdir="${TC_BUILD_BINUTILS_ARM}"
1361 rm -rf ${objdir}
1362 }
1363
1364 #+ binutils-arm-configure- Configure binutils for ARM
1365 binutils-arm-configure() {
1366 StepBanner "BINUTILS-ARM" "Configure"
1367
1368 local srcdir="${TC_SRC_BINUTILS}"
1369 local objdir="${TC_BUILD_BINUTILS_ARM}"
1370
1371 # enable multiple targets so that we can use the same ar with all .o files
1372 local targ="arm-pc-nacl,i686-pc-nacl,x86_64-pc-nacl"
1373 mkdir -p "${objdir}"
1374 spushd "${objdir}"
1375
1376 # --enable-checking is to avoid a build failure:
1377 # tc-arm.c:2489: warning: empty body in an if-statement
1378 # The --enable-gold and --enable-plugins options are on so that we
1379 # can use gold's support for plugin to link PNaCl modules.
1380
1381 # TODO(pdox): Building binutils for nacl/nacl64 target currently requires
1382 # providing NACL_ALIGN_* defines. This should really be defined inside
1383 # binutils instead.
1384 RunWithLog binutils.arm.configure \
1385 env -i \
1386 PATH="/usr/bin:/bin" \
1387 CC=${CC} \
1388 CXX=${CXX} \
1389 CFLAGS="-DNACL_ALIGN_BYTES=32 -DNACL_ALIGN_POW2=5" \
1390 ${srcdir}/binutils-2.20/configure --prefix=${INSTALL_DIR} \
1391 --target=${BINUTILS_TARGET} \
1392 --enable-targets=${targ} \
1393 --enable-checking \
1394 --enable-gold=yes \
1395 --enable-ld=yes \
1396 --enable-plugins \
1397 --disable-werror \
1398 --with-sysroot=${NEWLIB_INSTALL_DIR}
1399 spopd
1400 }
1401
1402 binutils-arm-needs-configure() {
1403 [ ! -f "${TC_BUILD_BINUTILS_ARM}/config.status" ]
1404 return $?
1405 }
1406
1407 binutils-arm-needs-make() {
1408 local srcdir="${TC_SRC_BINUTILS}"
1409 local objdir="${TC_BUILD_BINUTILS_ARM}"
1410
1411 ts-modified "$srcdir" "$objdir"
1412 return $?
1413 }
1414
1415 #+ binutils-arm-make - Make binutils for ARM
1416 binutils-arm-make() {
1417 StepBanner "BINUTILS-ARM" "Make"
1418 local srcdir="${TC_SRC_BINUTILS}"
1419 local objdir="${TC_BUILD_BINUTILS_ARM}"
1420 spushd "${objdir}"
1421
1422 ts-touch-open "${objdir}"
1423
1424 RunWithLog binutils.arm.make \
1425 env -i PATH="/usr/bin:/bin" \
1426 make ${MAKE_OPTS}
1427
1428 ts-touch-commit "${objdir}"
1429
1430 spopd
1431 }
1432
1433 #+ binutils-arm-install - Install binutils for ARM
1434 binutils-arm-install() {
1435 StepBanner "BINUTILS-ARM" "Install"
1436 local objdir="${TC_BUILD_BINUTILS_ARM}"
1437 spushd "${objdir}"
1438
1439 RunWithLog binutils.arm.install \
1440 env -i PATH="/usr/bin:/bin" \
1441 make \
1442 install ${MAKE_OPTS}
1443
1444 spopd
1445
1446 # Binutils builds readelf and size, but doesn't install it.
1447 mkdir -p "${INSTALL_BIN}"
1448 cp -f "${objdir}"/binutils/readelf "${PNACL_READELF}"
1449 cp -f "${objdir}"/binutils/size "${PNACL_SIZE}"
1450 }
1451
1452 #+-------------------------------------------------------------------------
1453 #+ binutils-liberty - Build native binutils libiberty
1454 binutils-liberty() {
1455 local srcdir="${TC_SRC_BINUTILS}"
1456
1457 assert-dir "${srcdir}" "You need to checkout binutils."
1458
1459 if binutils-liberty-needs-configure; then
1460 binutils-liberty-clean
1461 binutils-liberty-configure
1462 else
1463 SkipBanner "BINUTILS-LIBERTY" "configure"
1464 fi
1465
1466 if binutils-liberty-needs-make; then
1467 binutils-liberty-make
1468 else
1469 SkipBanner "BINUTILS-LIBERTY" "make"
1470 fi
1471 }
1472
1473 binutils-liberty-needs-configure() {
1474 [ ! -f "${TC_BUILD_BINUTILS_LIBERTY}/config.status" ]
1475 return $?
1476 }
1477
1478 #+ binutils-liberty-clean - Clean binutils-liberty
1479 binutils-liberty-clean() {
1480 StepBanner "BINUTILS-LIBERTY" "Clean"
1481 local objdir="${TC_BUILD_BINUTILS_LIBERTY}"
1482 rm -rf ${objdir}
1483 }
1484
1485 #+ binutils-liberty-configure - Configure binutils-liberty for X86
1486 binutils-liberty-configure() {
1487 StepBanner "BINUTILS-LIBERTY" "Configure"
1488
1489 local srcdir="${TC_SRC_BINUTILS}"
1490 local objdir="${TC_BUILD_BINUTILS_LIBERTY}"
1491
1492 mkdir -p "${objdir}"
1493 spushd "${objdir}"
1494 RunWithLog binutils.liberty.configure \
1495 env -i \
1496 PATH="/usr/bin:/bin" \
1497 CC=${CC} \
1498 CXX=${CXX} \
1499 ${srcdir}/binutils-2.20/configure
1500 spopd
1501 }
1502
1503 binutils-liberty-needs-make() {
1504 local srcdir="${TC_SRC_BINUTILS}"
1505 local objdir="${TC_BUILD_BINUTILS_LIBERTY}"
1506
1507 ts-modified "$srcdir" "$objdir"
1508 return $?
1509 }
1510
1511 #+ binutils-liberty-make - Make binutils-liberty for X86
1512 binutils-liberty-make() {
1513 StepBanner "BINUTILS-LIBERTY" "Make"
1514 local srcdir="${TC_SRC_BINUTILS}"
1515 local objdir="${TC_BUILD_BINUTILS_LIBERTY}"
1516 spushd "${objdir}"
1517
1518 ts-touch-open "${objdir}"
1519
1520 RunWithLog binutils.liberty.make \
1521 env -i PATH="/usr/bin:/bin" \
1522 make ${MAKE_OPTS} all-libiberty
1523
1524 ts-touch-commit "${objdir}"
1525
1526 spopd
1527 }
1528
1529 #########################################################################
1530 # CLIENT BINARIES (SANDBOXED)
1531 #########################################################################
1532
1533 check-sb-mode() {
1534 local mode=$1
1535 if [ ${mode} != "srpc" ] && [ ${mode} != "nonsrpc" ]; then
1536 echo "ERROR: Unsupported mode. Choose one of: srpc, nonsrpc"
1537 exit -1
1538 fi
1539 }
1540
1541 check-sb-arch() {
1542 local arch=$1
1543 for valid_arch in x8632 x8664 arm universal ; do
1544 if [ "${arch}" == "${valid_arch}" ] ; then
1545 return
1546 fi
1547 done
1548
1549 echo "ERROR: Unsupported arch. Choose one of: x8632, x8664, arm, universal"
1550 exit -1
1551 }
1552
1553 #+-------------------------------------------------------------------------
1554 #+ llvm-tools-sb <arch> <mode> - Build and install llvm tools (sandboxed)
1555 llvm-tools-sb() {
1556 local srcdir="${TC_SRC_LLVM}"
1557
1558 assert-dir "${srcdir}" "You need to checkout llvm."
1559
1560 if [ $# -ne 2 ]; then
1561 echo "ERROR: Usage llvm-tools-sb <arch> <mode>"
1562 exit -1
1563 fi
1564
1565 local arch=$1
1566 local mode=$2
1567 check-sb-arch ${arch}
1568 check-sb-mode ${mode}
1569
1570 if llvm-tools-sb-needs-configure "${arch}" "${mode}" ; then
1571 llvm-tools-sb-clean "${arch}" "${mode}"
1572 llvm-tools-sb-configure "${arch}" "${mode}"
1573 else
1574 SkipBanner "LLVM-TOOLS-SB" "configure ${arch} ${mode} "
1575 fi
1576
1577 if llvm-tools-sb-needs-make "${arch}" "${mode}" ; then
1578 llvm-tools-sb-make "${arch}" "${mode}"
1579 else
1580 SkipBanner "LLVM-TOOLS-SB" "make ${arch} ${mode} "
1581 fi
1582
1583 llvm-tools-sb-install "${arch}" "${mode}"
1584 }
1585
1586 llvm-tools-sb-needs-configure() {
1587 local arch=$1
1588 local mode=$2
1589 local objdir="${TC_BUILD}/llvm-tools-${arch}-${mode}-sandboxed"
1590 [ ! -f "${objdir}/config.status" ]
1591 return $?
1592 }
1593
1594 # llvm-tools-sb-clean - Clean llvm tools (sandboxed) for x86
1595 llvm-tools-sb-clean() {
1596 local arch=$1
1597 local mode=$2
1598 StepBanner "LLVM-TOOLS-SB" "Clean ${arch} ${mode}"
1599 local objdir="${TC_BUILD}/llvm-tools-${arch}-${mode}-sandboxed"
1600
1601 rm -rf "${objdir}"
1602 mkdir -p "${objdir}"
1603 }
1604
1605 llvm-tools-sb-setup() {
1606 local arch=$1
1607 local mode=$2
1608 local bitsize
1609 local prefix
1610 local flags
1611
1612 flags="-static"
1613 case ${mode} in
1614 srpc) flags+=" -DNACL_SRPC" ;;
1615 nonsrpc) ;;
1616 esac
1617
1618 # Speed things up by avoiding an intermediate step
1619 flags+=" --pnacl-skip-ll"
1620
1621 LLVM_SB_CONFIGURE_ENV=(
1622 AR="${PNACL_AR}" \
1623 AS="${PNACL_AS}" \
1624 CC="${PNACL_GCC} ${flags}" \
1625 CXX="${PNACL_GPP} ${flags}" \
1626 LD="${PNACL_LD} ${flags}" \
1627 NM="${PNACL_NM}" \
1628 RANLIB="${PNACL_RANLIB}" \
1629 LDFLAGS="") # TODO(pdox): Support -s
1630 }
1631
1632 # llvm-tools-sb-configure - Configure llvm tools (sandboxed) for x86
1633 llvm-tools-sb-configure() {
1634 local arch=$1
1635 local mode=$2
1636 llvm-tools-sb-setup ${arch} ${mode}
1637
1638 StepBanner "LLVM-TOOLS-SB" "Configure ${arch} ${mode}"
1639 local srcdir="${TC_SRC_LLVM}"
1640 local objdir="${TC_BUILD}/llvm-tools-${arch}-${mode}-sandboxed"
1641 local installdir="${PNACL_SB_ROOT}/${arch}/${mode}"
1642 local targets=""
1643 case ${arch} in
1644 x8632) targets=x86 ;;
1645 x8664) targets=x86_64 ;;
1646 arm) targets=arm ;;
1647 universal) targets=x86,x86_64,arm ;;
1648 esac
1649
1650 spushd ${objdir}
1651 RunWithLog \
1652 llvm.tools.${arch}.${mode}.sandboxed.configure \
1653 env -i \
1654 PATH="/usr/bin:/bin" \
1655 ${srcdir}/llvm-trunk/configure \
1656 "${LLVM_SB_CONFIGURE_ENV[@]}" \
1657 --prefix=${installdir} \
1658 --host=nacl \
1659 --disable-jit \
1660 --enable-optimized \
1661 --target=${CROSS_TARGET_ARM} \
1662 --enable-targets=${targets} \
1663 --enable-pic=no \
1664 --enable-static \
1665 --enable-shared=no
1666 spopd
1667 }
1668
1669 llvm-tools-sb-needs-make() {
1670 local arch=$1
1671 local mode=$2
1672 local srcdir="${TC_SRC_LLVM}"
1673 local objdir="${TC_BUILD}/llvm-tools-${arch}-${mode}-sandboxed"
1674
1675 ts-modified "$srcdir" "$objdir"
1676 return $?
1677 }
1678
1679 # llvm-tools-sb-make - Make llvm tools (sandboxed) for x86
1680 llvm-tools-sb-make() {
1681 local arch=$1
1682 local mode=$2
1683 llvm-tools-sb-setup ${arch} ${mode}
1684
1685 StepBanner "LLVM-TOOLS-SB" "Make ${arch} ${mode}"
1686 local objdir="${TC_BUILD}/llvm-tools-${arch}-${mode}-sandboxed"
1687
1688 spushd ${objdir}
1689 ts-touch-open "${objdir}"
1690
1691 local build_with_srpc=0
1692 if [ ${mode} == "srpc" ]; then
1693 build_with_srpc=1
1694 fi
1695
1696 RunWithLog llvm.tools.${arch}.${mode}.sandboxed.make \
1697 env -i PATH="/usr/bin:/bin" \
1698 ONLY_TOOLS=llc \
1699 NACL_SANDBOX=1 \
1700 NACL_SRPC=${build_with_srpc} \
1701 KEEP_SYMBOLS=1 \
1702 VERBOSE=1 \
1703 make ENABLE_OPTIMIZED=1 OPTIMIZE_OPTION=-O3 \
1704 ${MAKE_OPTS} tools-only
1705
1706 ts-touch-commit "${objdir}"
1707
1708 spopd
1709 }
1710
1711 # llvm-tools-sb-install - Install llvm tools (sandboxed) for x86
1712 llvm-tools-sb-install() {
1713 local arch=$1
1714 local mode=$2
1715 llvm-tools-sb-setup ${arch} ${mode}
1716
1717 StepBanner "LLVM-TOOLS-SB" "Install ${arch} ${mode}"
1718 local objdir="${TC_BUILD}/llvm-tools-${arch}-${mode}-sandboxed"
1719 spushd ${objdir}
1720
1721 RunWithLog llvm.tools.${arch}.${mode}.sandboxed.install \
1722 env -i PATH="/usr/bin:/bin" \
1723 ONLY_TOOLS=llc \
1724 NACL_SANDBOX=1 \
1725 KEEP_SYMBOLS=1 \
1726 make ${MAKE_OPTS} install
1727
1728 spopd
1729
1730 translate-and-install-sb-tool ${arch} ${mode} llc
1731 }
1732
1733 translate-and-install-sb-tool() {
1734 local arch=$1
1735 local mode=$2
1736 local name=$3
1737
1738 # Translate bitcode program into an actual native executable.
1739 # If arch = universal, we need to translate and install multiple times.
1740 local bindir="${PNACL_SB_ROOT}/${arch}/${mode}/bin"
1741 local pexe="${bindir}/${name}.pexe"
1742
1743 # Rename to .pexe
1744 mv "${bindir}/${name}" "${pexe}"
1745
1746 local arches
1747 if [ "${arch}" == "universal" ]; then
1748 arches="${SBTC_BUILD_WITH_PNACL}"
1749 else
1750 arches="${arch}"
1751 fi
1752
1753 local installer
1754 if [ "${arch}" == "universal" ]; then
1755 installer="cp -f"
1756 else
1757 installer="mv -f"
1758 fi
1759
1760 # In universal/mode/bin directory, we'll end up with every translation:
1761 # e.g. llc.arm.nexe, llc.x8632.nexe, llc.x8664.nexe
1762 # In arch/mode/bin directories, we'll end up with just one copy
1763 local num_arches=$(wc -w <<< "${arches}")
1764 local extra=""
1765 if [ ${num_arches} -gt 1 ] && QueueConcurrent; then
1766 extra=" (background)"
1767 fi
1768
1769 for tarch in ${arches}; do
1770 local nexe="${bindir}/${name}.${tarch}.nexe"
1771 StepBanner "TRANSLATE" "Translating ${name}.pexe to ${tarch}${extra}"
1772 "${PNACL_TRANSLATE}" -arch ${tarch} "${pexe}" -o "${nexe}" &
1773 QueueLastProcess
1774 done
1775
1776 if [ ${num_arches} -gt 1 ] && ! QueueEmpty ; then
1777 StepBanner "TRANSLATE" "Waiting for processes to finish"
1778 fi
1779 QueueWait
1780
1781 for tarch in ${arches}; do
1782 local nexe="${bindir}/${name}.${tarch}.nexe"
1783 local bindir_tarch="${PNACL_SB_ROOT}/${tarch}/${mode}/bin"
1784 mkdir -p "${bindir_tarch}"
1785 ${installer} "${nexe}" "${bindir_tarch}/${name}"
1786 done
1787 }
1788
1789 #+-------------------------------------------------------------------------
1790 #+ binutils-sb <arch> <mode> - Build and install binutils (sandboxed)
1791 binutils-sb() {
1792 local srcdir="${TC_SRC_BINUTILS}"
1793
1794 assert-dir "${srcdir}" "You need to checkout binutils."
1795
1796 if [ $# -ne 2 ]; then
1797 echo "ERROR: Usage binutils-sb <arch> <mode>"
1798 exit -1
1799 fi
1800
1801 local arch=$1
1802 local mode=$2
1803 check-sb-arch ${arch}
1804 check-sb-mode ${mode}
1805
1806 if [ ! -d "${NNACL_ROOT}" ] ; then
1807 echo "ERROR: Install Native Client toolchain"
1808 exit -1
1809 fi
1810
1811 if [ ! -f "${TC_BUILD_BINUTILS_LIBERTY}/libiberty/libiberty.a" ] ; then
1812 echo "ERROR: Missing lib. Run this script with binutils-liberty option"
1813 exit -1
1814 fi
1815
1816 if binutils-sb-needs-configure "${arch}" "${mode}"; then
1817 binutils-sb-clean "${arch}" "${mode}"
1818 binutils-sb-configure "${arch}" "${mode}"
1819 else
1820 SkipBanner "BINUTILS-SB" "configure ${arch} ${mode}"
1821 fi
1822
1823 if binutils-sb-needs-make "${arch}" "${mode}"; then
1824 binutils-sb-make "${arch}" "${mode}"
1825 else
1826 SkipBanner "BINUTILS-SB" "make ${arch} ${mode}"
1827 fi
1828
1829 binutils-sb-install "${arch}" "${mode}"
1830 }
1831
1832 binutils-sb-needs-configure() {
1833 local arch=$1
1834 local mode=$2
1835 [ ! -f "${TC_BUILD}/binutils-${arch}-${mode}-sandboxed/config.status" ]
1836 return $?
1837 }
1838
1839 # binutils-sb-clean - Clean binutils (sandboxed) for x86
1840 binutils-sb-clean() {
1841 local arch=$1
1842 local mode=$2
1843 StepBanner "BINUTILS-SB" "Clean ${arch} ${mode}"
1844 local objdir="${TC_BUILD}/binutils-${arch}-${mode}-sandboxed"
1845 rm -rf "${objdir}"
1846 mkdir -p "${objdir}"
1847 }
1848
1849 # binutils-sb-configure - Configure binutils (sandboxed) for x86
1850 binutils-sb-configure() {
1851 local arch=$1
1852 local mode=$2
1853 StepBanner "BINUTILS-SB" "Configure ${arch} ${mode}"
1854 local bitsize=${arch:3:2}
1855 local nacl="nacl${bitsize/"32"/}"
1856 local srcdir="${TC_SRC_BINUTILS}"
1857 local objdir="${TC_BUILD}/binutils-${arch}-${mode}-sandboxed"
1858 local installdir="${PNACL_SB_ROOT}/${arch}/${mode}"
1859
1860 local flags="-DNACL_ALIGN_BYTES=32 -DNACL_ALIGN_POW2=5 -DNACL_TOOLCHAIN_PATCH"
1861 if [ ${mode} == "srpc" ]; then
1862 flags+=" -DNACL_SRPC"
1863 fi
1864
1865 spushd ${objdir}
1866 mkdir -p liberty_tmp
1867 cp "${TC_BUILD_BINUTILS_LIBERTY}/libiberty/libiberty.a" liberty_tmp
1868 RunWithLog \
1869 binutils.${arch}.${mode}.sandboxed.configure \
1870 env -i \
1871 PATH="/usr/bin:/bin" \
1872 AR="${NNACL_ROOT}/bin/${nacl}-ar" \
1873 AS="${NNACL_ROOT}/bin/${nacl}-as" \
1874 CC="${NNACL_ROOT}/bin/${nacl}-gcc" \
1875 CXX="${NNACL_ROOT}/bin/${nacl}-g++" \
1876 LD="${NNACL_ROOT}/bin/${nacl}-ld" \
1877 RANLIB="${NNACL_ROOT}/bin/${nacl}-ranlib" \
1878 CFLAGS="-m${bitsize} -O3 ${flags} -I${NNACL_ROOT}/${nacl}/include" \
1879 LDFLAGS="-s" \
1880 LDFLAGS_FOR_BUILD="-L../liberty_tmp" \
1881 ${srcdir}/binutils-2.20/configure \
1882 --prefix=${installdir} \
1883 --host=${nacl} \
1884 --target=${nacl} \
1885 --disable-nls \
1886 --disable-werror \
1887 --enable-static \
1888 --enable-shared=no
1889 spopd
1890 }
1891
1892 binutils-sb-needs-make() {
1893 local arch=$1
1894 local mode=$2
1895 local srcdir="${TC_SRC_BINUTILS}"
1896 local objdir="${TC_BUILD}/binutils-${arch}-${mode}-sandboxed"
1897
1898 ts-modified "$srcdir" "$objdir"
1899 return $?
1900 }
1901
1902 # binutils-sb-make - Make binutils (sandboxed) for x86
1903 binutils-sb-make() {
1904 local arch=$1
1905 local mode=$2
1906 StepBanner "BINUTILS-SB" "Make ${arch} ${mode}"
1907 local objdir="${TC_BUILD}/binutils-${arch}-${mode}-sandboxed"
1908
1909 spushd ${objdir}
1910
1911 ts-touch-open "${objdir}"
1912
1913 local build_with_srpc=0
1914 if [ ${mode} == "srpc" ]; then
1915 build_with_srpc=1
1916 fi
1917
1918 RunWithLog binutils.${arch}.sandboxed.make \
1919 env -i PATH="/usr/bin:/bin" \
1920 NACL_SRPC=${build_with_srpc} \
1921 make ${MAKE_OPTS} all-gas all-ld
1922
1923 ts-touch-commit "${objdir}"
1924
1925 spopd
1926 }
1927
1928 # binutils-sb-install - Install binutils (sandboxed) for x86
1929 binutils-sb-install() {
1930 local arch=$1
1931 local mode=$2
1932 StepBanner "BINUTILS-SB" "Install ${arch} ${mode}"
1933 local objdir="${TC_BUILD}/binutils-${arch}-${mode}-sandboxed"
1934
1935 spushd ${objdir}
1936
1937 RunWithLog binutils.${arch}.${mode}.sandboxed.install \
1938 env -i PATH="/usr/bin:/bin" \
1939 make install-gas install-ld
1940
1941 spopd
1942 }
1943
1944
1945 #+ tools-sb {arch} {mode} - Build all sandboxed tools for arch, mode
1946 tools-sb() {
1947 local arch=$1
1948 local mode=$2
1949
1950 StepBanner "${arch}" "Sandboxing"
1951 StepBanner "----------" "--------------------------------------"
1952 llvm-tools-sb ${arch} ${mode}
1953
1954 # Use regular toolchain for building binutils.
1955 # This is a temporary hack because we can't build binutils with pnacl yet.
1956 # TODO(pdox): Make binutils buildable with pnacl.
1957 local arches
1958 if [[ "${arch}" == "universal" ]] ; then
1959 arches="${SBTC_BUILD_WITH_PNACL}"
1960 else
1961 arches="${arch}"
1962 fi
1963 for arch in ${arches} ; do
1964 if [[ "${arch}" == "arm" ]] ; then
1965 StepBanner "BINUTILS-SB" "Skipping ARM build (not yet sandboxed)"
1966 else
1967 binutils-sb ${arch} ${mode}
1968 fi
1969 done
1970 }
1971
1972
1973 #+--------------------------------------------------------------------------
1974 #@ install-translators {srpc/nonsrpc} - Builds and installs sandboxed
1975 #@ translator components
1976 install-translators() {
1977 if [ $# -ne 1 ]; then
1978 echo "ERROR: Usage install-translators <srpc/nonsrpc>"
1979 exit -1
1980 fi
1981
1982 local srpc_kind=$1
1983 check-sb-mode ${srpc_kind}
1984
1985 StepBanner "INSTALL SANDBOXED TRANSLATORS (${srpc_kind})"
1986
1987 binutils-liberty
1988
1989 if ${SBTC_PRODUCTION}; then
1990 # Build each architecture separately.
1991 for arch in ${SBTC_BUILD_WITH_PNACL} ; do
1992 tools-sb ${arch} ${srpc_kind}
1993 done
1994 else
1995 # Using arch `universal` builds the sandboxed tools to a .pexe
1996 # which support all targets. This .pexe is then translated to
1997 # each architecture specified in ${SBTC_BUILD_WITH_PNACL}.
1998 tools-sb universal ${srpc_kind}
1999 fi
2000
2001 echo "Done"
2002 }
2003
2004 #+-------------------------------------------------------------------------
2005 #@ prune-translator-install - Prunes translator install directories
2006 prune-translator-install() {
2007 if [ $# -ne 1 ]; then
2008 echo "ERROR: Usage prune-translator-install <srpc/nonsrpc>"
2009 exit -1
2010 fi
2011
2012 local srpc_kind=$1
2013 check-sb-mode ${srpc_kind}
2014
2015 StepBanner "PRUNE" "Pruning translator installs (${srpc_kind})"
2016
2017 spushd "${PNACL_SB_X8632}/${srpc_kind}"
2018 rm -rf include lib nacl share
2019 rm -rf bin/llvm-config bin/tblgen
2020 spopd
2021
2022 spushd "${PNACL_SB_X8664}/${srpc_kind}"
2023 rm -rf include lib nacl64 share
2024 rm -rf bin/llvm-config bin/tblgen
2025 spopd
2026
2027 if ! ${SBTC_PRODUCTION}; then
2028 spushd "${PNACL_SB_UNIVERSAL}/${srpc_kind}"
2029 rm -rf include lib share
2030 rm -f bin/llvm-config bin/tblgen
2031 # Delete intermediate files generated by the driver
2032 rm -f -- bin/llc*---llc.pexe---*
2033 spopd
2034 fi
2035
2036 echo "Done"
2037 }
2038
2039 #########################################################################
2040 # < NEWLIB-ARM >
2041 # < NEWLIB-BITCODE >
2042 #########################################################################
2043
2044 #+ newlib-bitcode - Build and install newlib in bitcode.
2045 newlib-bitcode() {
2046 StepBanner "NEWLIB-BITCODE"
2047
2048 if newlib-bitcode-needs-configure; then
2049 newlib-bitcode-clean
2050 newlib-bitcode-configure
2051 else
2052 SkipBanner "NEWLIB-BITCODE" "configure"
2053 fi
2054
2055 if newlib-bitcode-needs-make; then
2056 newlib-bitcode-make
2057 else
2058 SkipBanner "NEWLIB-BITCODE" "make"
2059 fi
2060
2061 newlib-bitcode-install
2062 }
2063
2064 #+ newlib-bitcode-clean - Clean bitcode newlib.
2065 newlib-bitcode-clean() {
2066 StepBanner "NEWLIB-BITCODE" "Clean"
2067 rm -rf "${TC_BUILD_NEWLIB_BITCODE}"
2068 }
2069
2070 newlib-bitcode-needs-configure() {
2071 speculative-check "gcc-stage1" && return 0
2072 ts-newer-than "${TC_BUILD_LLVM_GCC1}-${CROSS_TARGET_ARM}" \
2073 "${TC_BUILD_NEWLIB_BITCODE}" && return 0
2074
2075 [ ! -f "${TC_BUILD_NEWLIB_BITCODE}/config.status" ]
2076 return #?
2077 }
2078
2079 #+ newlib-bitcode-configure - Configure bitcode Newlib
2080 newlib-bitcode-configure() {
2081 StepBanner "NEWLIB-BITCODE" "Configure"
2082 newlib-configure-common "${TC_BUILD_NEWLIB_BITCODE}"
2083 }
2084
2085 newlib-configure-common() {
2086 local srcdir="${TC_SRC_NEWLIB}"
2087 local objdir="$1"
2088 mkdir -p "${objdir}"
2089 spushd "${objdir}"
2090
2091 RunWithLog newlib.configure \
2092 env -i \
2093 PATH="/usr/bin:/bin" \
2094 "${STD_ENV_FOR_NEWLIB[@]}" \
2095 ${srcdir}/newlib-trunk/configure \
2096 --disable-libgloss \
2097 --disable-multilib \
2098 --prefix="${NEWLIB_INSTALL_DIR}" \
2099 --disable-newlib-supplied-syscalls \
2100 --disable-texinfo \
2101 --target="${REAL_CROSS_TARGET}"
2102 spopd
2103 }
2104
2105 newlib-bitcode-needs-make() {
2106 local srcdir="${TC_SRC_NEWLIB}"
2107 local objdir="${TC_BUILD_NEWLIB_BITCODE}"
2108
2109 ts-modified "$srcdir" "$objdir"
2110 return $?
2111 }
2112
2113 #+ newlib-bitcode-make - Make bitcode Newlib
2114 newlib-bitcode-make() {
2115 StepBanner "NEWLIB-BITCODE" "Make"
2116 newlib-make-common "${TC_BUILD_NEWLIB_BITCODE}"
2117 }
2118
2119 newlib-make-common() {
2120 local srcdir="${TC_SRC_NEWLIB}"
2121 local objdir="$1"
2122
2123 ts-touch-open "${objdir}"
2124
2125 spushd "${objdir}"
2126 RunWithLog newlib.make \
2127 env -i PATH="/usr/bin:/bin" \
2128 make \
2129 "${STD_ENV_FOR_NEWLIB[@]}" \
2130 ${MAKE_OPTS}
2131 spopd
2132
2133 ts-touch-commit "${objdir}"
2134
2135 }
2136
2137 #+ newlib-bitcde-install - Install Bitcode Newlib
2138 newlib-bitcode-install() {
2139 StepBanner "NEWLIB-BITCODE" "Install"
2140
2141 local objdir="${TC_BUILD_NEWLIB_BITCODE}"
2142
2143 spushd "${objdir}"
2144
2145 # NOTE: we might be better off not using install, as we are already
2146 # doing a bunch of copying of headers and libs further down
2147 RunWithLog newlib.install \
2148 env -i PATH="/usr/bin:/bin" \
2149 make \
2150 "${STD_ENV_FOR_NEWLIB[@]}" \
2151 install ${MAKE_OPTS}
2152
2153 ###########################################################
2154 # -- HACK HACK HACK --
2155 # newlib installs into ${REAL_CROSS_TARGET}
2156 # For now, move it back to the old ${CROSS_TARGET_ARM}
2157 # where everything expects it to be.
2158 rm -rf "${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}"
2159 mv "${NEWLIB_INSTALL_DIR}/${REAL_CROSS_TARGET}" \
2160 "${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}"
2161 ###########################################################
2162
2163 StepBanner "NEWLIB-BITCODE" "Extra-install"
2164 local sys_include=${INSTALL_DIR}/${CROSS_TARGET_ARM}/include
2165 local sys_lib=${INSTALL_DIR}/${CROSS_TARGET_ARM}/lib
2166 # NOTE: we provide a new one via extra-sdk
2167 rm ${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}/include/pthread.h
2168
2169 cp ${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}/include/machine/endian.h \
2170 ${sys_include}
2171 cp ${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}/include/sys/param.h \
2172 ${sys_include}
2173 cp ${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}/include/newlib.h \
2174 ${sys_include}
2175
2176 # NOTE: we provide our own pthread.h via extra-sdk
2177 StepBanner "NEWLIB-BITCODE" "Removing old pthreads headers"
2178 rm -f "${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}/usr/include/pthread.h"
2179 rm -f "${sys_include}/pthread.h"
2180
2181 StepBanner "NEWLIB-BITCODE" "copying libraries"
2182 local destdir="${PNACL_BITCODE_ROOT}"
2183 # We only install libc/libg/libm
2184 mkdir -p "${destdir}"
2185 cp ${objdir}/${REAL_CROSS_TARGET}/newlib/lib[cgm].a "${destdir}"
2186
2187 spopd
2188 }
2189
2190
2191 #########################################################################
2192 # < EXTRASDK >
2193 #########################################################################
2194 #+ extrasdk-clean - Clean extra-sdk stuff
2195
2196 extrasdk-clean() {
2197 StepBanner "EXTRASDK-BITCODE" "Clean"
2198 rm -rf "${TC_BUILD_EXTRASDK_BITCODE}"
2199
2200 StepBanner "EXTRASDK-BITCODE" "Clean bitcode lib"
2201 # TODO(robertm): consider having a dedicated dir for this so can
2202 # delete this wholesale
2203 # Do not clean libc and libstdc++ but everything else
2204 rm -f "${PNACL_BITCODE_ROOT}"/*google*.a
2205 rm -f "${PNACL_BITCODE_ROOT}"/*nacl*
2206 rm -f "${PNACL_BITCODE_ROOT}"/libpthread.a
2207 rm -f "${PNACL_BITCODE_ROOT}"/libsrpc.a
2208 rm -f "${PNACL_BITCODE_ROOT}"/libnpapi.a
2209 rm -f "${PNACL_BITCODE_ROOT}"/libppapi.a
2210 rm -f "${PNACL_BITCODE_ROOT}"/libnosys.a
2211 rm -f "${PNACL_BITCODE_ROOT}"/libav.a
2212 rm -f "${PNACL_BITCODE_ROOT}"/libgio.a
2213
2214 StepBanner "EXTRASDK-BITCODE" "Clean arm libs"
2215 # Do not clean libgcc but everything else
2216 rm -f "${PNACL_ARM_ROOT}"/*crt*
2217
2218 StepBanner "EXTRASDK-BITCODE" "Clean x86-32 libs"
2219 # Do not clean libgcc but everything else
2220 rm -f "${PNACL_X8632_ROOT}"/*crt*
2221
2222 StepBanner "EXTRASDK-BITCODE" "Clean x86-64 libs"
2223 # Do not clean libgcc but everything else
2224 rm -f "${PNACL_X8664_ROOT}"/*crt*
2225
2226 # clean scons obj dirs
2227 rm -rf scons-out/nacl_extra_sdk-*-pnacl
2228 }
2229
2230 #+ extrasdk-make-install - build and install all extra sdk components
2231 extrasdk-make-install() {
2232 StepBanner "EXTRASDK"
2233 local headerdir="${NEWLIB_INSTALL_DIR}/${CROSS_TARGET_ARM}/include"
2234
2235 StepBanner "EXTRASDK" "Make/Install headers"
2236 RunWithLog "extra_sdk.headers" \
2237 ./scons MODE=nacl_extra_sdk \
2238 extra_sdk_lib_destination="${PNACL_BITCODE_ROOT}" \
2239 extra_sdk_include_destination="${headerdir}" \
2240 bitcode=1 \
2241 platform=arm \
2242 sdl=none \
2243 naclsdk_validate=0 \
2244 extra_sdk_update_header
2245
2246 StepBanner "EXTRASDK" "Make/Install bitcode libpthread"
2247 RunWithLog "extra_sdk.bitcode_libpthread" \
2248 ./scons MODE=nacl_extra_sdk -j 8\
2249 extra_sdk_lib_destination="${PNACL_BITCODE_ROOT}" \
2250 extra_sdk_include_destination="${headerdir}" \
2251 bitcode=1 \
2252 platform=arm \
2253 sdl=none \
2254 naclsdk_validate=0 \
2255 install_libpthread
2256
2257 StepBanner "EXTRASDK" "Make/Install bitcode components"
2258 RunWithLog "extra_sdk.bitcode_components" \
2259 ./scons MODE=nacl_extra_sdk -j 8\
2260 extra_sdk_lib_destination="${PNACL_BITCODE_ROOT}" \
2261 extra_sdk_include_destination="${headerdir}" \
2262 disable_nosys_linker_warnings=1 \
2263 bitcode=1 \
2264 platform=arm \
2265 sdl=none \
2266 naclsdk_validate=0 \
2267 --verbose \
2268 extra_sdk_libs
2269
2270 StepBanner "EXTRASDK" "Make/Install arm components"
2271 RunWithLog "extra_sdk.arm_components" \
2272 ./scons MODE=nacl_extra_sdk \
2273 extra_sdk_lib_destination="${PNACL_ARM_ROOT}" \
2274 extra_sdk_include_destination="${headerdir}" \
2275 bitcode=1 \
2276 platform=arm \
2277 sdl=none \
2278 naclsdk_validate=0 \
2279 --verbose \
2280 extra_sdk_libs_platform
2281
2282 StepBanner "EXTRASDK" "Make/Install x86-32 components"
2283 RunWithLog "extra_sdk.libs_x8632" \
2284 ./scons MODE=nacl_extra_sdk \
2285 extra_sdk_lib_destination="${PNACL_X8632_ROOT}" \
2286 extra_sdk_include_destination="${headerdir}" \
2287 bitcode=1 \
2288 platform=x86-32 \
2289 sdl=none \
2290 naclsdk_validate=0 \
2291 --verbose \
2292 extra_sdk_libs_platform
2293
2294 StepBanner "EXTRASDK" "Make/Install x86-64 components"
2295 RunWithLog "extra_sdk.libs_x8664" \
2296 ./scons MODE=nacl_extra_sdk \
2297 extra_sdk_lib_destination="${PNACL_X8664_ROOT}" \
2298 extra_sdk_include_destination="${headerdir}" \
2299 bitcode=1 \
2300 platform=x86-64 \
2301 sdl=none \
2302 naclsdk_validate=0 \
2303 --verbose \
2304 extra_sdk_libs_platform
2305 }
2306
2307 newlib-nacl-headers-clean() {
2308 # Clean the include directory and revert it to its pure state
2309 if [ -d "${TC_SRC_NEWLIB}" ]; then
2310 rm -rf "${NEWLIB_INCLUDE_DIR}"
2311 # If the script is interrupted right here,
2312 # then NEWLIB_INCLUDE_DIR will not exist, and the repository
2313 # will be in a bad state. This will be fixed during the next
2314 # invocation by newlib-nacl-headers.
2315
2316 # We jump into the parent directory and use a relative path so that
2317 # hg does not get confused by pathnames which contain a symlink.
2318 spushd "$(dirname "${NEWLIB_INCLUDE_DIR}")"
2319 RunWithLog "newlib-freshen" \
2320 hg-revert "$(basename "${NEWLIB_INCLUDE_DIR}")"
2321 spopd
2322 fi
2323 }
2324
2325 #+ newlib-nacl-headers - Install NaCl headers to newlib
2326 newlib-nacl-headers() {
2327 StepBanner "newlib-nacl-headers" "Adding nacl headers to newlib"
2328
2329 assert-dir "${TC_SRC_NEWLIB}" "Newlib is not checked out"
2330
2331 # Make sure the headers directory has no local changes
2332 newlib-nacl-headers-check
2333 newlib-nacl-headers-clean
2334
2335 # Install the headers
2336 "${EXPORT_HEADER_SCRIPT}" \
2337 "${NACL_SYS_HEADERS}" \
2338 "${NEWLIB_INCLUDE_DIR}"
2339
2340 # Record the header install time
2341 ts-touch "${NACL_SYS_TS}"
2342 }
2343
2344 #+ newlib-nacl-headers-check - Make sure the newlib nacl headers haven't
2345 #+ been modified since the last install.
2346 newlib-nacl-headers-check() {
2347 # The condition where NEWLIB_INCLUDE_DIR does not exist may have been
2348 # caused by an incomplete call to newlib-nacl-headers-clean().
2349 # Let it pass this check so that the clean will be able to finish.
2350 # See the comment in newlib-nacl-headers-clean()
2351 if ! [ -d "${TC_SRC_NEWLIB}" ] ||
2352 ! [ -d "${NEWLIB_INCLUDE_DIR}" ]; then
2353 return 0
2354 fi
2355
2356 # Already clean?
2357 if ! hg-has-changes "${NEWLIB_INCLUDE_DIR}" &&
2358 ! hg-has-untracked "${NEWLIB_INCLUDE_DIR}" ; then
2359 return 0
2360 fi
2361
2362 if ts-dir-changed "${NACL_SYS_TS}" "${NEWLIB_INCLUDE_DIR}"; then
2363 echo ""
2364 echo "*******************************************************************"
2365 echo "* ERROR *"
2366 echo "* The NewLib include directory has local modifications *"
2367 echo "*******************************************************************"
2368 echo "* The NewLib include directory should not be modified directly. *"
2369 echo "* Instead, modifications should be done from: *"
2370 echo "* src/trusted/service_runtime/include *"
2371 echo "* *"
2372 echo "* To destroy the local changes to newlib, run: *"
2373 echo "* tools/llvm/utman.sh newlib-nacl-headers-clean *"
2374 echo "*******************************************************************"
2375 echo ""
2376 if ${UTMAN_BUILDBOT} ; then
2377 newlib-nacl-headers-clean
2378 else
2379 exit -1
2380 fi
2381 fi
2382 }
2383
2384 #+-------------------------------------------------------------------------
2385 #+ driver - Install driver scripts.
2386 driver() {
2387 StepBanner "DRIVER"
2388 # need to prep the dir just in case..
2389 prep-install-dir
2390 # otherwise linker-install will stomp it.
2391 linker-install
2392 driver-install
2393 driver-intrinsics
2394 }
2395
2396 driver-intrinsics() {
2397 StepBanner "DRIVER" "Install LLVM intrinsics"
2398 "${INSTALL_DIR}"/bin/llvm-as \
2399 tools/llvm/llvm-intrinsics.ll \
2400 -o "${INSTALL_ROOT}/llvm-intrinsics.bc"
2401 }
2402
2403 # Just in case we're calling this manually
2404 prep-install-dir() {
2405 mkdir -p ${INSTALL_DIR}
2406 }
2407
2408 # We need to adjust the start address and aligment of nacl arm modules
2409 linker-install() {
2410 StepBanner "DRIVER" "Installing untrusted ld scripts"
2411 mkdir -p "${LDSCRIPTS_DIR}"
2412 cp tools/llvm/ld_script_arm_untrusted "${LDSCRIPTS_DIR}"
2413 cp tools/llvm/ld_script_x8632_untrusted "${LDSCRIPTS_DIR}"
2414 cp tools/llvm/ld_script_x8664_untrusted "${LDSCRIPTS_DIR}"
2415 }
2416
2417 # The driver is a simple python script which changes its behavior
2418 # depending on the name it is invoked as.
2419 driver-install() {
2420 StepBanner "DRIVER" "Installing driver adaptors to ${INSTALL_DIR}"
2421 # TODO(robertm): move the driver to their own dir
2422 # rm -rf ${INSTALL_DIR}
2423 mkdir -p "${INSTALL_BIN}"
2424 rm -f "${INSTALL_BIN}/pnacl-*"
2425 cp tools/llvm/driver.py "${INSTALL_BIN}"
2426 for s in gcc g++ as arm-as i686-as x86_64-as \
2427 bclink opt dis ld strip translate illegal nop \
2428 ar nm ranlib pexecheck ; do
2429 local t="pnacl-$s"
2430 ln -fs driver.py "${INSTALL_BIN}/$t"
2431 done
2432 }
2433
2434 ######################################################################
2435 ######################################################################
2436 #
2437 # HELPER FUNCTIONS
2438 #
2439 # (These should not generally be used directly)
2440 #
2441 ######################################################################
2442 ######################################################################
2443
2444 RecordRevisionInfo() {
2445 mkdir -p "${INSTALL_ROOT}"
2446 svn info > "${INSTALL_ROOT}/REV"
2447 }
2448
2449
2450 #+ organize-native-code - Saves the native code libraries for each architecture
2451 #+ into the toolchain/pnacl-untrusted/<arch> directories .
2452 organize-native-code() {
2453 StepBanner "PNACL" "Organizing Native Code"
2454
2455 readonly arm_src=${INSTALL_ROOT}
2456 readonly arm_llvm_gcc=${INSTALL_DIR}
2457
2458 StepBanner "PNaCl" "arm native code: ${PNACL_ARM_ROOT}"
2459 mkdir -p ${PNACL_ARM_ROOT}
2460 local startup_dir=${arm_llvm_gcc}/lib/gcc/arm-none-linux-gnueabi/${GCC_VER}
2461 cp -f ${startup_dir}/libgcc.a ${PNACL_ARM_ROOT}
2462 cp -f ${startup_dir}/libgcc_eh.a ${PNACL_ARM_ROOT}
2463 DebugRun ls -l ${PNACL_ARM_ROOT}
2464
2465 StepBanner "PNaCl" "x86-32 native code: ${PNACL_X8632_ROOT}"
2466 mkdir -p ${PNACL_X8632_ROOT}
2467 local startup_dir=${arm_llvm_gcc}/lib/gcc/${CROSS_TARGET_X86_32}/${GCC_VER}
2468 cp -f ${startup_dir}/libgcc.a ${PNACL_X8632_ROOT}
2469 cp -f ${startup_dir}/libgcc_eh.a ${PNACL_X8632_ROOT}
2470 DebugRun ls -l ${PNACL_X8632_ROOT}
2471
2472 StepBanner "PNaCl" "x86-64 native code: ${PNACL_X8664_ROOT}"
2473 mkdir -p ${PNACL_X8664_ROOT}
2474 local startup_dir=${arm_llvm_gcc}/lib/gcc/${CROSS_TARGET_X86_64}/${GCC_VER}
2475 cp -f ${startup_dir}/libgcc.a ${PNACL_X8664_ROOT}
2476 cp -f ${startup_dir}/libgcc_eh.a ${PNACL_X8664_ROOT}
2477 DebugRun ls -l ${PNACL_X8664_ROOT}
2478 }
2479
2480 ######################################################################
2481 ######################################################################
2482 # < VERIFY >
2483 ######################################################################
2484 ######################################################################
2485
2486 readonly LLVM_DIS=${INSTALL_DIR}/bin/llvm-dis
2487 readonly LLVM_BCANALYZER=${INSTALL_DIR}/bin/llvm-bcanalyzer
2488 readonly LLVM_OPT=${INSTALL_DIR}/bin/opt
2489 readonly LLVM_AR=${CROSS_TARGET_AR}
2490
2491 # Note: we could replace this with a modified version of tools/elf_checker.py
2492 # if we do not want to depend on binutils
2493 readonly NACL_OBJDUMP=${INSTALL_DIR}/bin/arm-pc-nacl-objdump
2494
2495 # Usage: VerifyArchive <checker> <pattern> <filename>
2496 ExtractAndCheck() {
2497 local checker="$1"
2498 local pattern="$2"
2499 local archive="$3"
2500 local tmp="/tmp/ar-verify-${RANDOM}"
2501 rm -rf ${tmp}
2502 mkdir -p ${tmp}
2503 cp "${archive}" "${tmp}"
2504 spushd ${tmp}
2505 ${LLVM_AR} x $(basename ${archive})
2506 # extract all the files
2507 local count=0
2508 for i in ${pattern} ; do
2509 if [ ! -e "$i" ]; then
2510 # we may also see the unexpanded pattern here if there is no match
2511 continue
2512 fi
2513 count=$((count+1))
2514 ${checker} $i
2515 done
2516 if [ "${count}" = "0" ] ; then
2517 echo "FAIL - archive empty or wrong contents: ${archive}"
2518 ls -l "${tmp}"
2519 exit -1
2520 fi
2521 echo "PASS (${count} files)"
2522 rm -rf "${tmp}"
2523 spopd
2524 }
2525
2526 # Usage: VerifyLinkerScript <filename>
2527 VerifyLinkerScript() {
2528 local archive="$1"
2529 # Use cpp to strip the C-style comments.
2530 ${PNACL_GCC} -E -xc "${archive}" | awk -v archive="$(basename ${archive})" '
2531 BEGIN { status = 0 }
2532 NF == 0 || $1 == "#" { next }
2533 $1 == "INPUT" && $2 == "(" && $NF == ")" { next }
2534 {
2535 print "FAIL - unexpected linker script(?) contents:", archive
2536 status = 1
2537 exit(status)
2538 }
2539 END { if (status == 0) print "PASS (trivial linker script)" }
2540 ' || exit -1
2541 }
2542
2543 # Usage: VerifyArchive <checker> <pattern> <filename>
2544 VerifyArchive() {
2545 local checker="$1"
2546 local pattern="$2"
2547 local archive="$3"
2548 echo -n "verify $(basename "${archive}"): "
2549 type="$(file --brief --mime-type "${archive}")"
2550 case "$type" in
2551 application/x-archive)
2552 ExtractAndCheck "$checker" "$pattern" "$archive"
2553 ;;
2554 text/x-c)
2555 # A linker script with C comments looks like C to "file".
2556 VerifyLinkerScript "$archive"
2557 ;;
2558 *)
2559 echo "FAIL - unknown file type ($type): ${archive}"
2560 exit -1
2561 ;;
2562 esac
2563 }
2564
2565 #
2566 # verify-object-llvm <obj>
2567 #
2568 # Verifies that a given .o file is bitcode and free of ASMSs
2569 verify-object-llvm() {
2570 local t=$(${LLVM_DIS} $1 -o -)
2571
2572 if grep asm <<<$t ; then
2573 echo
2574 echo "ERROR asm in $1"
2575 echo
2576 exit -1
2577 fi
2578 }
2579
2580
2581
2582 check-elf-abi() {
2583 local arch_info=$(${NACL_OBJDUMP} -f $1)
2584 if ! grep -q $2 <<< ${arch_info} ; then
2585 echo "ERROR $1 - bad file format: $2 vs ${arch_info}\n"
2586 echo ${arch_info}
2587 exit -1
2588 fi
2589 }
2590
2591
2592 # verify-object-arm <obj>
2593 #
2594 # Ensure that the ARCH properties are what we expect, this is a little
2595 # fragile and needs to be updated when tools change
2596 verify-object-arm() {
2597 check-elf-abi $1 "elf32-littlearm-nacl"
2598 arch_info=$("${PNACL_READELF}" -A $1)
2599 #TODO(robertm): some refactoring and cleanup needed
2600 if ! grep -q "Tag_FP_arch: VFPv2" <<< ${arch_info} ; then
2601 echo "ERROR $1 - bad Tag_FP_arch\n"
2602 #TODO(robertm): figure out what the right thing to do is here, c.f.
2603 # http://code.google.com/p/nativeclient/issues/detail?id=966
2604 "${PNACL_READELF}" -A $1 | grep Tag_FP_arch
2605 exit -1
2606 fi
2607
2608 if ! grep -q "Tag_CPU_arch: v7" <<< ${arch_info} ; then
2609 echo "FAIL bad $1 Tag_CPU_arch\n"
2610 "${PNACL_READELF}" -A $1 | grep Tag_CPU_arch
2611 exit -1
2612 fi
2613 }
2614
2615
2616 # verify-object-x86-32 <obj>
2617 #
2618 verify-object-x86-32() {
2619 check-elf-abi $1 "elf32-nacl"
2620 }
2621
2622 # verify-object-x86-64 <obj>
2623 #
2624 verify-object-x86-64() {
2625 check-elf-abi $1 "elf64-nacl"
2626 }
2627
2628
2629 #
2630 # verify-archive-llvm <archive>
2631 # Verifies that a given archive is bitcode and free of ASMSs
2632 #
2633 verify-archive-llvm() {
2634 if ${LLVM_BCANALYZER} "$1" 2> /dev/null ; then
2635 # This fires only when we build in single-bitcode-lib mode
2636 echo -n "verify $(basename "$1"): "
2637 verify-object-llvm "$1"
2638 echo "PASS (single-bitcode)"
2639 else
2640 # Currently all the files are .o in the llvm archives.
2641 # Eventually more and more should be .bc.
2642 VerifyArchive verify-object-llvm '*.bc *.o' "$@"
2643 fi
2644 }
2645
2646 #
2647 # verify-archive-arm <archive>
2648 # Verifies that a given archive is a proper arm achive
2649 #
2650 verify-archive-arm() {
2651 VerifyArchive verify-object-arm '*.o' "$@"
2652 }
2653
2654 #
2655 # verify-archive-x86-32 <archive>
2656 # Verifies that a given archive is a proper x86-32 achive
2657 #
2658 verify-archive-x86-32() {
2659 VerifyArchive verify-object-x86-32 '*.o' "$@"
2660 }
2661
2662 #
2663 # verify-archive-x86-64 <archive>
2664 # Verifies that a given archive is a proper x86-64 achive
2665 #
2666 verify-archive-x86-64() {
2667 VerifyArchive verify-object-x86-64 '*.o' "$@"
2668 }
2669 #@-------------------------------------------------------------------------
2670 #+ verify - Verifies that toolchain/pnacl-untrusted ELF files
2671 #+ are of the correct architecture.
2672 verify() {
2673 StepBanner "VERIFY"
2674
2675 if ${UTMAN_BUILD_ARM}; then
2676 SubBanner "VERIFY: ${PNACL_ARM_ROOT}"
2677 for i in ${PNACL_ARM_ROOT}/*.o ; do
2678 verify-object-arm "$i"
2679 done
2680
2681 for i in ${PNACL_ARM_ROOT}/*.a ; do
2682 verify-archive-arm "$i"
2683 done
2684 fi
2685
2686 SubBanner "VERIFY: ${PNACL_X8632_ROOT}"
2687 for i in ${PNACL_X8632_ROOT}/*.o ; do
2688 verify-object-x86-32 "$i"
2689 done
2690
2691 for i in ${PNACL_X8632_ROOT}/*.a ; do
2692 verify-archive-x86-32 "$i"
2693 done
2694
2695 SubBanner "VERIFY: ${PNACL_X8664_ROOT}"
2696 for i in ${PNACL_X8664_ROOT}/*.o ; do
2697 verify-object-x86-64 "$i"
2698 done
2699
2700 for i in ${PNACL_X8664_ROOT}/*.a ; do
2701 verify-archive-x86-64 "$i"
2702 done
2703
2704 SubBanner "VERIFY: ${PNACL_BITCODE_ROOT}"
2705 for i in ${PNACL_BITCODE_ROOT}/*.a ; do
2706 verify-archive-llvm "$i"
2707 done
2708
2709 # we currently do not expect any .o files in this directory
2710 #for i in ${PNACL_BITCODE_ROOT}/*.o ; do
2711 #done
2712 }
2713
2714 #@ verify-triple-build <arch> - Verify that the sandboxed translator produces
2715 #@ an identical translation of itself (llc.pexe)
2716 #@ as the unsandboxed translator.
2717 verify-triple-build() {
2718 if [ $# -eq 0 ]; then
2719 local arch
2720 for arch in ${SBTC_BUILD_WITH_PNACL} ; do
2721 verify-triple-build ${arch}
2722 done
2723 return
2724 fi
2725
2726 local arch=${1/-/} # Get rid of dashes
2727 local mode=srpc
2728
2729 check-sb-arch ${arch}
2730 check-sb-mode ${mode}
2731
2732 StepBanner "VERIFY" "Verifying triple build for ${arch}"
2733
2734 local archdir="${PNACL_SB_ROOT}/${arch}/${mode}"
2735 local archllc="${archdir}/bin/llc"
2736 local pexe
2737
2738 if ${SBTC_PRODUCTION} ; then
2739 pexe="${archdir}/bin/llc.pexe"
2740 else
2741 pexe="${PNACL_SB_ROOT}/universal/${mode}/bin/llc.pexe"
2742 fi
2743 assert-file "${archllc}" "sandboxed llc for ${arch} does not exist"
2744 assert-file "${pexe}" "llc.pexe does not exist"
2745
2746 local flags="--pnacl-sb --pnacl-driver-verbose"
2747 if [ ${mode} == "srpc" ] ; then
2748 flags+=" --pnacl-driver-set-SRPC=1"
2749 else
2750 flags+=" --pnacl-driver-set-SRPC=0"
2751 fi
2752
2753 if [ ${arch} == "arm" ] ; then
2754 # Use emulator if we are not on ARM
2755 local hostarch=$(uname -m)
2756 if ! [[ "${hostarch}" =~ arm ]]; then
2757 flags+=" --pnacl-use-emulator"
2758 fi
2759 fi
2760
2761 local objdir="${TC_BUILD}/triple-build"
2762 local newllc="${objdir}/llc.${arch}.rebuild.nexe"
2763 mkdir -p "${objdir}"
2764
2765 StepBanner "VERIFY" "Translating llc.pexe to ${arch} using sandboxed tools"
2766 RunWithLog "verify.triple.build" \
2767 "${PNACL_TRANSLATE}" ${flags} -arch ${arch} "${pexe}" -o "${newllc}"
2768
2769 if ! cmp --silent "${archllc}" "${newllc}" ; then
2770 Banner "TRIPLE BUILD VERIFY FAILED"
2771 echo "Expected these files to be identical, but they are not:"
2772 echo " ${archllc}"
2773 echo " ${newllc}"
2774 exit -1
2775 fi
2776 StepBanner "VERIFY" "Verified ${arch} OK"
2777 }
2778 ###################################################################### 35 ######################################################################
2779 ###################################################################### 36 ######################################################################
2780 # 37 #
2781 # < TESTING > 38 # < TESTING >
2782 # 39 #
2783 ###################################################################### 40 ######################################################################
2784 ###################################################################### 41 ######################################################################
2785 42
2786 # TODO(robertm): figure out what to do about concurrency in debug mode. 43 # TODO(robertm): figure out what to do about concurrency in debug mode.
2787 # Perhaps it is fine just tweaking that via UTMAN_CONCURRENCY. 44 # Perhaps it is fine just tweaking that via UTMAN_CONCURRENCY.
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
3015 ./run_all.sh CleanBenchmarks "$@" 272 ./run_all.sh CleanBenchmarks "$@"
3016 ./run_all.sh PopulateFromSpecHarness ${official} "$@" 273 ./run_all.sh PopulateFromSpecHarness ${official} "$@"
3017 ./run_all.sh TimedBuildAndRunBenchmarks ${setup} "$@" 274 ./run_all.sh TimedBuildAndRunBenchmarks ${setup} "$@"
3018 CollectTimingInfo $(pwd) ${result_file} ${setup} 275 CollectTimingInfo $(pwd) ${result_file} ${setup}
3019 spopd 276 spopd
3020 } 277 }
3021 278
3022 279
3023 #@ test-bot-base - tests that must pass on the bots to validate a TC 280 #@ test-bot-base - tests that must pass on the bots to validate a TC
3024 test-bot-base() { 281 test-bot-base() {
282 # TODO(robertm): this is missing adhoc tests.
3025 test-all 283 test-all
3026 } 284 }
3027 285
3028 286
3029 ######################################################################
3030 ######################################################################
3031 #
3032 # UTILITIES
3033 #
3034 ######################################################################
3035 ######################################################################
3036
3037 #@-------------------------------------------------------------------------
3038 #@ show-config
3039 show-config() {
3040 Banner "Config Settings:"
3041 echo "UTMAN_BUILDBOT: ${UTMAN_BUILDBOT}"
3042 echo "UTMAN_CONCURRENCY: ${UTMAN_CONCURRENCY}"
3043 echo "UTMAN_DEBUG: ${UTMAN_DEBUG}"
3044
3045 Banner "Your Environment:"
3046 env | grep UTMAN
3047 }
3048
3049 #@ help - Usage information. 287 #@ help - Usage information.
3050 help() { 288 help() {
3051 Usage 289 Usage
3052 } 290 }
3053 291
3054 #@ help-full - Usage information including internal functions. 292 #@ help-full - Usage information including internal functions.
3055 help-full() { 293 help-full() {
3056 Usage2 294 Usage2
3057 } 295 }
3058 296
3059 has-trusted-toolchain() {
3060 if [ -f toolchain/linux_arm-trusted/ld_script_arm_trusted ]; then
3061 return 0
3062 else
3063 return 1
3064 fi
3065 }
3066
3067 check-for-trusted() {
3068 if ! ${UTMAN_BUILD_ARM} ; then
3069 return
3070 fi
3071
3072 if ! has-trusted-toolchain; then
3073 echo '*******************************************************************'
3074 echo '* The ARM trusted toolchain does not appear to be installed yet *'
3075 echo '* It is needed to run ARM tests. *'
3076 echo '* *'
3077 echo '* To download and install the trusted toolchain, run: *'
3078 echo '* *'
3079 echo '* $ tools/llvm/utman.sh download-trusted *'
3080 echo '* *'
3081 echo '* To compile the trusted toolchain, use: *'
3082 echo '* *'
3083 echo '* $ tools/llvm/trusted-toolchain-creator.sh trusted_sdk *'
3084 echo '* (warning: this takes a while) *'
3085 echo '*******************************************************************'
3086
3087 # If building on the bots, do not continue since it needs to run ARM tests.
3088 if ${UTMAN_BUILDBOT} ; then
3089 echo "Building on bots --> need ARM trusted toolchain to run tests!"
3090 exit -1
3091 elif trusted-tc-confirm ; then
3092 echo "Continuing without ARM trusted toolchain"
3093 UTMAN_BUILD_ARM=false
3094 else
3095 echo "Okay, stopping."
3096 exit -1
3097 fi
3098 fi
3099 }
3100
3101 trusted-tc-confirm() {
3102 echo
3103 echo "Do you wish to continue without the ARM trusted TC (skip ARM testing)?"
3104 echo ""
3105 confirm-yes "Continue"
3106 return $?
3107 }
3108
3109 DebugRun() {
3110 if ${UTMAN_DEBUG} || ${UTMAN_BUILDBOT}; then
3111 "$@"
3112 fi
3113 }
3114
3115 ######################################################################
3116 ######################################################################
3117 #
3118 # < TIME STAMPING >
3119 #
3120 ######################################################################
3121 ######################################################################
3122
3123 ts-dir-changed() {
3124 local tsfile="$1"
3125 local dir="$2"
3126
3127 if [ -f "${tsfile}" ]; then
3128 local MODIFIED=$(find "${dir}" -newer "${tsfile}")
3129 [ ${#MODIFIED} -gt 0 ]
3130 ret=$?
3131 else
3132 true
3133 ret=$?
3134 fi
3135 return $ret
3136 }
3137
3138 # Check if the source for a given build has been modified
3139 ts-modified() {
3140 local srcdir="$1"
3141 local objdir="$2"
3142 local tsfile="${objdir}/${TIMESTAMP_FILENAME}"
3143
3144 ts-dir-changed "${tsfile}" "${srcdir}"
3145 return $?
3146 }
3147
3148 ts-touch() {
3149 local tsfile="$1"
3150 touch "${tsfile}"
3151 }
3152
3153 # Record the time when make begins, but don't yet
3154 # write that to the timestamp file.
3155 # (Just in case make fails)
3156
3157 ts-touch-open() {
3158 local objdir="$1"
3159 local tsfile="${objdir}/${TIMESTAMP_FILENAME}"
3160 local tsfile_open="${objdir}/${TIMESTAMP_FILENAME}_OPEN"
3161
3162 rm -f "${tsfile}"
3163 touch "${tsfile_open}"
3164 }
3165
3166
3167 # Write the timestamp. (i.e. make has succeeded)
3168
3169 ts-touch-commit() {
3170 local objdir="$1"
3171 local tsfile="${objdir}/${TIMESTAMP_FILENAME}"
3172 local tsfile_open="${objdir}/${TIMESTAMP_FILENAME}_OPEN"
3173
3174 mv -f "${tsfile_open}" "${tsfile}"
3175 }
3176
3177
3178 # ts-newer-than dirA dirB
3179 # Compare the make timestamps in both object directories.
3180 # returns true (0) if dirA is newer than dirB
3181 # returns false (1) otherwise.
3182 #
3183 # This functions errs on the side of returning 0, since
3184 # that forces a rebuild anyway.
3185
3186 ts-newer-than() {
3187 local objdir1="$1"
3188 local objdir2="$2"
3189
3190 local tsfile1="${objdir1}/${TIMESTAMP_FILENAME}"
3191 local tsfile2="${objdir2}/${TIMESTAMP_FILENAME}"
3192
3193 if [ ! -d "${objdir1}" ]; then return 0; fi
3194 if [ ! -d "${objdir2}" ]; then return 0; fi
3195
3196 if [ ! -f "${tsfile1}" ]; then return 0; fi
3197 if [ ! -f "${tsfile2}" ]; then return 0; fi
3198
3199 local MODIFIED=$(find "${tsfile1}" -newer "${tsfile2}")
3200 if [ ${#MODIFIED} -gt 0 ]; then
3201 return 0
3202 fi
3203 return 1
3204 }
3205
3206 ###################################################################### 297 ######################################################################
3207 ###################################################################### 298 ######################################################################
3208 # 299 #
3209 # < MAIN > 300 # < MAIN >
3210 # 301 #
3211 ###################################################################### 302 ######################################################################
3212 ###################################################################### 303 ######################################################################
3213 304
3214 mkdir -p "${INSTALL_ROOT}"
3215 PackageCheck
3216
3217 [ $# = 0 ] && set -- help # Avoid reference to undefined $1. 305 [ $# = 0 ] && set -- help # Avoid reference to undefined $1.
3218 if [ "$(type -t $1)" != "function" ]; then 306 if [ "$(type -t $1)" != "function" ]; then
3219 #Usage 307 #Usage
3220 echo "ERROR: unknown function '$1'." >&2 308 echo "ERROR: unknown function '$1'." >&2
3221 echo "For help, try:" 309 echo "For help, try:"
3222 echo " $0 help" 310 echo " $0 help"
3223 exit 1 311 exit 1
3224 fi 312 fi
3225 313
3226 "$@" 314 "$@"
OLDNEW
« no previous file with comments | « tools/llvm/utman.sh ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698