2 # Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
9 # TODO(mseaborn): Enable -Wstrict-prototypes here. Currently
10 # dlmalloc/malloc.c does not build with this warning.
11 env.FilterOut(CFLAGS=['-Wstrict-prototypes'])
13 # This module shouldn't be built in an environment that uses glibc.
14 if env.Bit('nacl_glibc'):
15 raise UserError('src/untrusted/irt/nacl.scons in the wrong environment?')
17 blob_env = env.Clone()
18 blob_env.Append(LINKFLAGS=['-Wl,-Trodata-segment=${IRT_BLOB_DATA_START}',
19 '-Wl,-Ttext-segment=${IRT_BLOB_CODE_START}'])
21 irt_support_sources = [
24 'irt_private_pthread.c',
28 # NACL_GC_WRAP_SYSCALL uses ({...}) syntax.
29 blob_env.FilterOut(CCFLAGS=['-pedantic'])
31 irt_common_interfaces = [
46 'irt_exception_handling.c',
47 'irt_dev_list_mappings.c',
52 # These are the objects and libraries that go into every IRT image.
53 irt_support_objs = [blob_env.ComponentObject(x) for x in
54 (irt_support_sources + irt_common_interfaces)]
56 # We also get nc_init_private.c, nc_thread.c and nc_tsd.c via
57 # #includes of .c files.
59 blob_env.ComponentObject(module,
60 '${MAIN_DIR}/src/untrusted/pthread/%s.c' % module)
61 for module in ['nc_mutex',
65 blob_env.ComponentObject('sys_private',
66 '${MAIN_DIR}/src/untrusted/nacl/sys_private.c'),
67 blob_env.ComponentObject(
68 'dynamic_annotations.o',
69 '${MAIN_DIR}/src/untrusted/valgrind/dynamic_annotations.c'),
72 if env.Bit('target_arm'):
73 read_tp_obj = blob_env.ComponentObject('aeabi_read_tp.o', 'aeabi_read_tp.S')
74 irt_support_objs.append(read_tp_obj)
75 # Publish the object file for tests/irt_private_pthread to use.
76 # Putting aeabi_read_tp.o into libirt_support_private is not
77 # sufficient because of link ordering issues.
78 env.Replicate('${STAGING_DIR}', read_tp_obj)
80 # Build a library so that irt_support_objs can be used in tests that
81 # cover IRT-internal code.
82 env.ComponentLibrary('libirt_support_private', irt_support_objs)
84 irt_nonbrowser = ['irt_interfaces.c',
85 'irt_core_resource.c',
95 irt_core_library = blob_env.ComponentProgram(
96 'irt_core', irt_support_objs + irt_nonbrowser, EXTRA_LIBS=irt_libs)
97 env.SDKInstallBin('irt_core.nexe', irt_core_library)
99 # TODO(mcgrathr): these should be installed, but scons is a mystery
100 #env.AddHeaderToSdk(['irt.h'])
101 #env.AddHeaderToSdk(['irt_ppapi.h'])
103 # Make sure that the linked IRT nexe never uses TLS via the TLS ABI
104 # register (e.g., %gs on x86-32). All IRT code must avoid direct use
105 # of the TLS ABI register, which is reserved for user TLS. Instead,
106 # ensure all TLS accesses use a call to __nacl_read_tp (or __aeabi_read_tp
107 # for ARM), which the IRT code overrides to segregate IRT-private TLS
109 if ((env.Bit('build_arm') or env.Bit('build_x86_32'))
110 # Do not try to run OBJDUMP if 'built_elsewhere', since that *might*
111 # mean that a toolchain is not even present. E.g., the arm buildbots
112 # do not have the pnacl toolchain, since that is built for x86 hosts.
113 and not env.Bit('built_elsewhere')):
114 check_tls_arch = '${TARGET_FULLARCH}'
115 if env.Bit('build_arm'):
116 check_tls_arch = 'arm'
117 node = env.CommandTest('irt_core_tls_test.out',
118 ['${PYTHON}', env.File('check_tls.py'),
119 check_tls_arch, '${OBJDUMP}', irt_core_library],
120 # don't run ${PYTHON} under the emulator.
121 direct_emulation=False)
122 env.AddNodeToTestSuite(node, ['small_tests'], 'run_irt_core_tls_test')