Index: SConstruct |
diff --git a/SConstruct b/SConstruct |
index 55b483b47c6efd03ddac58a1badca3270dbe8049..2b220f0dd7a310ad4bc789e6551ca4885943a391 100755 |
--- a/SConstruct |
+++ b/SConstruct |
@@ -352,6 +352,9 @@ def SetUpArgumentBits(env): |
BitFromArgument(env, 'arm_hard_float', default=False, |
desc='Build for hard float ARM ABI') |
+ BitFromArgument(env, 'skip_nonstable_bitcode', default=False, |
+ desc='Skip tests involving non-stable bitcode') |
+ |
######################################################################### |
# EXPERIMENTAL |
# This is for generating a testing library for use within private test |
@@ -1231,6 +1234,11 @@ def HasSuffix(item, suffix): |
return item.path.endswith(suffix) |
+def StripSuffix(string, suffix): |
+ assert string.endswith(suffix) |
+ return string[:-len(suffix)] |
+ |
+ |
def DualLibrary(env, lib_name, *args, **kwargs): |
"""Builder to build both .a and _shared.a library in one step. |
@@ -1560,31 +1568,49 @@ pre_base_env.AddMethod(ShouldUseVerboseOptions) |
DeclareBit('tests_use_irt', 'Non-browser tests also load the IRT image', False) |
-# Translate the given pexe. |
-def GetTranslatedNexe(env, pexe): |
+# Bit to be set by individual test/nacl.scons files that need to opt out. |
+DeclareBit('nonstable_bitcode', 'Tests use non-stable bitcode features', False) |
+ |
+ |
+def GetFinalizedPexe(env, pexe): |
+ """ Prep and finalize the ABI for a given pexe if needed. |
+ """ |
+ if not env.Bit('pnacl_generate_pexe') or env.Bit('nonstable_bitcode'): |
+ return pexe |
+ |
+ # We can remove this once we move all CommandSelLdrTestNacl to a nacl.scons |
+ # file instead. There are currently some canned nexe tests in build.scons. |
+ if env['NACL_BUILD_FAMILY'] == 'TRUSTED': |
+ return pexe |
+ |
+ # Otherwise, finalize during the build step, since there is no finalize tool |
+ # that can run on triggered bots such as the ARM HW bots. |
pexe_name = pexe.abspath |
- nexe_name = pexe_name[:pexe_name.index('.pexe')] + '.nexe' |
+ final_name = StripSuffix(pexe_name, '.nonfinal.pexe') + '.final.pexe' |
# Make sure the pexe doesn't get removed by the fake builders when |
# built_elsewhere=1 |
env.Precious(pexe) |
- node = env.Command(target=nexe_name, source=[pexe_name], |
- action=[Action('${TRANSLATECOM}', '${TRANSLATECOMSTR}')]) |
+ node = env.Command(target=final_name, source=[pexe_name], |
+ action=[Action('${PNACLFINALIZECOM}', |
+ '${PNACLFINALIZECOMSTR}')]) |
assert len(node) == 1, node |
return node[0] |
-pre_base_env.AddMethod(GetTranslatedNexe) |
+# Translate the given pexe. |
+def GetTranslatedNexe(env, pexe): |
+ # First finalize the pexe. |
+ pexe = GetFinalizedPexe(env, pexe) |
-def ShouldTranslateToNexe(env, pexe): |
- """ Determine when we need to translate a Pexe to a Nexe. |
- """ |
+ # Then check if we need to translate. |
# Check if we started with a pexe, so there is actually a translation step. |
if not env.Bit('pnacl_generate_pexe'): |
- return False |
+ return pexe |
- # There is no bitcode for trusted code. |
+ # We can remove this once we move all CommandSelLdrTestNacl to a nacl.scons |
+ # file instead. There are currently some canned nexe tests in build.scons. |
if env['NACL_BUILD_FAMILY'] == 'TRUSTED': |
- return False |
+ return pexe |
# Often there is a build step (do_not_run_tests=1) and a test step |
# (which is run with -j1). Normally we want to translate in the build step |
@@ -1593,10 +1619,25 @@ def ShouldTranslateToNexe(env, pexe): |
# to force the translation to be done in the test step. Hence, |
# we check the bit 'translate_in_build_step' / check if we are |
# in the test step. |
- return ( |
- env.Bit('translate_in_build_step') or not env.Bit('do_not_run_tests')) |
+ if not env.Bit('translate_in_build_step') and env.Bit('do_not_run_tests'): |
+ return pexe |
-pre_base_env.AddMethod(ShouldTranslateToNexe) |
+ pexe_name = pexe.abspath |
+ # Tidy up the suffix (remove the .final.pexe or .nonfinal.pexe), |
+ # depending on whether or not the pexe was finalized. |
+ suffix_to_strip = '.final.pexe' |
+ if not pexe_name.endswith(suffix_to_strip): |
+ suffix_to_strip = '.nonfinal.pexe' |
+ nexe_name = StripSuffix(pexe_name, suffix_to_strip) + '.nexe' |
+ # Make sure the pexe doesn't get removed by the fake builders when |
+ # built_elsewhere=1 |
+ env.Precious(pexe) |
+ node = env.Command(target=nexe_name, source=[pexe_name], |
+ action=[Action('${TRANSLATECOM}', '${TRANSLATECOMSTR}')]) |
+ assert len(node) == 1, node |
+ return node[0] |
+ |
+pre_base_env.AddMethod(GetTranslatedNexe) |
def CommandTestFileDumpCheck(env, |
@@ -1614,12 +1655,9 @@ def CommandTestFileDumpCheck(env, |
# ARM objdump though... a TODO(jvoung) for when there is time. |
if env.Bit('built_elsewhere'): |
return [] |
- if env.ShouldTranslateToNexe(target): |
- target_obj = env.GetTranslatedNexe(target) |
- else: |
- target_obj = target |
+ target = env.GetTranslatedNexe(target) |
return env.CommandTestFileCheck(name, |
- ['${OBJDUMP}', objdump_flags, target_obj], |
+ ['${OBJDUMP}', objdump_flags, target], |
check_file) |
pre_base_env.AddMethod(CommandTestFileDumpCheck) |
@@ -1660,9 +1698,9 @@ def CommandSelLdrTestNacl(env, name, nexe, |
env['TRUSTED_ENV'].Bit('windows')): |
return [] |
- if env.ShouldTranslateToNexe(nexe): |
- # The nexe is actually a pexe. Translate it before we run it. |
- nexe = env.GetTranslatedNexe(nexe) |
+ # The nexe might be a pexe that needs finalization, and translation. |
+ nexe = env.GetTranslatedNexe(nexe) |
+ |
command = [nexe] |
if args is not None: |
command += args |