OLD | NEW |
1 # Copyright 2010 the V8 project authors. All rights reserved. | 1 # Copyright 2010 the V8 project authors. All rights reserved. |
2 # Redistribution and use in source and binary forms, with or without | 2 # Redistribution and use in source and binary forms, with or without |
3 # modification, are permitted provided that the following conditions are | 3 # modification, are permitted provided that the following conditions are |
4 # met: | 4 # met: |
5 # | 5 # |
6 # * Redistributions of source code must retain the above copyright | 6 # * Redistributions of source code must retain the above copyright |
7 # notice, this list of conditions and the following disclaimer. | 7 # notice, this list of conditions and the following disclaimer. |
8 # * Redistributions in binary form must reproduce the above | 8 # * Redistributions in binary form must reproduce the above |
9 # copyright notice, this list of conditions and the following | 9 # copyright notice, this list of conditions and the following |
10 # disclaimer in the documentation and/or other materials provided | 10 # disclaimer in the documentation and/or other materials provided |
11 # with the distribution. | 11 # with the distribution. |
12 # * Neither the name of Google Inc. nor the names of its | 12 # * Neither the name of Google Inc. nor the names of its |
13 # contributors may be used to endorse or promote products derived | 13 # contributors may be used to endorse or promote products derived |
14 # from this software without specific prior written permission. | 14 # from this software without specific prior written permission. |
15 # | 15 # |
16 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 import platform | 28 import platform |
29 import re | 29 import re |
| 30 import subprocess |
30 import sys | 31 import sys |
31 import os | 32 import os |
32 from os.path import join, dirname, abspath | 33 from os.path import join, dirname, abspath |
33 from types import DictType, StringTypes | 34 from types import DictType, StringTypes |
34 root_dir = dirname(File('SConstruct').rfile().abspath) | 35 root_dir = dirname(File('SConstruct').rfile().abspath) |
35 sys.path.insert(0, join(root_dir, 'tools')) | 36 sys.path.insert(0, join(root_dir, 'tools')) |
36 import js2c, utils | 37 import js2c, utils |
37 | 38 |
38 # ANDROID_TOP is the top of the Android checkout, fetched from the environment | 39 # ANDROID_TOP is the top of the Android checkout, fetched from the environment |
39 # variable 'TOP'. You will also need to set the CXX, CC, AR and RANLIB | 40 # variable 'TOP'. You will also need to set the CXX, CC, AR and RANLIB |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 }, | 136 }, |
136 'gcc': { | 137 'gcc': { |
137 'all': { | 138 'all': { |
138 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'], | 139 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'], |
139 'CXXFLAGS': ['$CCFLAGS', '-fno-rtti', '-fno-exceptions'], | 140 'CXXFLAGS': ['$CCFLAGS', '-fno-rtti', '-fno-exceptions'], |
140 }, | 141 }, |
141 'visibility:hidden': { | 142 'visibility:hidden': { |
142 # Use visibility=default to disable this. | 143 # Use visibility=default to disable this. |
143 'CXXFLAGS': ['-fvisibility=hidden'] | 144 'CXXFLAGS': ['-fvisibility=hidden'] |
144 }, | 145 }, |
| 146 'strictaliasing:off': { |
| 147 'CCFLAGS': ['-fno-strict-aliasing'] |
| 148 }, |
145 'mode:debug': { | 149 'mode:debug': { |
146 'CCFLAGS': ['-g', '-O0'], | 150 'CCFLAGS': ['-g', '-O0'], |
147 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'], | 151 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'], |
148 'os:android': { | 152 'os:android': { |
149 'CCFLAGS': ['-mthumb'] | 153 'CCFLAGS': ['-mthumb'] |
150 } | 154 } |
151 }, | 155 }, |
152 'mode:release': { | 156 'mode:release': { |
153 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections', | 157 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections', |
154 '-ffunction-sections'], | 158 '-ffunction-sections'], |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 'release': '', | 649 'release': '', |
646 'debug': '_g' | 650 'debug': '_g' |
647 } | 651 } |
648 | 652 |
649 | 653 |
650 def Abort(message): | 654 def Abort(message): |
651 print message | 655 print message |
652 sys.exit(1) | 656 sys.exit(1) |
653 | 657 |
654 | 658 |
655 def GuessToolchain(os): | 659 def GuessOS(env): |
656 tools = Environment()['TOOLS'] | 660 return utils.GuessOS() |
| 661 |
| 662 |
| 663 def GuessArch(env): |
| 664 return utils.GuessArchitecture() |
| 665 |
| 666 |
| 667 def GuessToolchain(env): |
| 668 tools = env['TOOLS'] |
657 if 'gcc' in tools: | 669 if 'gcc' in tools: |
658 return 'gcc' | 670 return 'gcc' |
659 elif 'msvc' in tools: | 671 elif 'msvc' in tools: |
660 return 'msvc' | 672 return 'msvc' |
661 else: | 673 else: |
662 return None | 674 return None |
663 | 675 |
664 | 676 |
665 def GuessVisibility(os, toolchain): | 677 def GuessVisibility(env): |
| 678 os = env['os'] |
| 679 toolchain = env['toolchain']; |
666 if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc': | 680 if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc': |
667 # MinGW / Cygwin can't do it. | 681 # MinGW / Cygwin can't do it. |
668 return 'default' | 682 return 'default' |
669 elif os == 'solaris': | 683 elif os == 'solaris': |
670 return 'default' | 684 return 'default' |
671 else: | 685 else: |
672 return 'hidden' | 686 return 'hidden' |
673 | 687 |
674 | 688 |
675 OS_GUESS = utils.GuessOS() | 689 def GuessStrictAliasing(env): |
676 TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS) | 690 # There seems to be a problem with gcc 4.5.x. |
677 ARCH_GUESS = utils.GuessArchitecture() | 691 # See http://code.google.com/p/v8/issues/detail?id=884 |
678 VISIBILITY_GUESS = GuessVisibility(OS_GUESS, TOOLCHAIN_GUESS) | 692 # It can be worked around by disabling strict aliasing. |
| 693 toolchain = env['toolchain']; |
| 694 if toolchain == 'gcc': |
| 695 env = Environment(tools=['gcc']) |
| 696 # The gcc version should be available in env['CCVERSION'], |
| 697 # but when scons detects msvc this value is not set. |
| 698 version = subprocess.Popen([env['CC'], '-dumpversion'], |
| 699 stdout=subprocess.PIPE).communicate()[0] |
| 700 if version.find('4.5') == 0: |
| 701 return 'off' |
| 702 return 'default' |
679 | 703 |
680 | 704 |
681 SIMPLE_OPTIONS = { | 705 PLATFORM_OPTIONS = { |
682 'toolchain': { | 706 'arch': { |
683 'values': ['gcc', 'msvc'], | 707 'values': ['arm', 'ia32', 'x64', 'mips'], |
684 'default': TOOLCHAIN_GUESS, | 708 'guess': GuessArch, |
685 'help': 'the toolchain to use (%s)' % TOOLCHAIN_GUESS | 709 'help': 'the architecture to build for' |
686 }, | 710 }, |
687 'os': { | 711 'os': { |
688 'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'sola
ris', 'cygwin'], | 712 'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'sola
ris', 'cygwin'], |
689 'default': OS_GUESS, | 713 'guess': GuessOS, |
690 'help': 'the os to build for (%s)' % OS_GUESS | 714 'help': 'the os to build for' |
691 }, | 715 }, |
692 'arch': { | 716 'toolchain': { |
693 'values':['arm', 'ia32', 'x64', 'mips'], | 717 'values': ['gcc', 'msvc'], |
694 'default': ARCH_GUESS, | 718 'guess': GuessToolchain, |
695 'help': 'the architecture to build for (%s)' % ARCH_GUESS | 719 'help': 'the toolchain to use' |
696 }, | 720 } |
| 721 } |
| 722 |
| 723 SIMPLE_OPTIONS = { |
697 'regexp': { | 724 'regexp': { |
698 'values': ['native', 'interpreted'], | 725 'values': ['native', 'interpreted'], |
699 'default': 'native', | 726 'default': 'native', |
700 'help': 'Whether to use native or interpreted regexp implementation' | 727 'help': 'Whether to use native or interpreted regexp implementation' |
701 }, | 728 }, |
702 'snapshot': { | 729 'snapshot': { |
703 'values': ['on', 'off', 'nobuild'], | 730 'values': ['on', 'off', 'nobuild'], |
704 'default': 'off', | 731 'default': 'off', |
705 'help': 'build using snapshots for faster start-up' | 732 'help': 'build using snapshots for faster start-up' |
706 }, | 733 }, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 'default': 'dumb', | 821 'default': 'dumb', |
795 'help': 'the console to use for the d8 shell' | 822 'help': 'the console to use for the d8 shell' |
796 }, | 823 }, |
797 'verbose': { | 824 'verbose': { |
798 'values': ['on', 'off'], | 825 'values': ['on', 'off'], |
799 'default': 'off', | 826 'default': 'off', |
800 'help': 'more output from compiler and linker' | 827 'help': 'more output from compiler and linker' |
801 }, | 828 }, |
802 'visibility': { | 829 'visibility': { |
803 'values': ['default', 'hidden'], | 830 'values': ['default', 'hidden'], |
804 'default': VISIBILITY_GUESS, | 831 'guess': GuessVisibility, |
805 'help': 'shared library symbol visibility (%s)' % VISIBILITY_GUESS | 832 'help': 'shared library symbol visibility' |
| 833 }, |
| 834 'strictaliasing': { |
| 835 'values': ['default', 'off'], |
| 836 'guess': GuessStrictAliasing, |
| 837 'help': 'assume strict aliasing while optimizing' |
806 }, | 838 }, |
807 'pgo': { | 839 'pgo': { |
808 'values': ['off', 'instrument', 'optimize'], | 840 'values': ['off', 'instrument', 'optimize'], |
809 'default': 'off', | 841 'default': 'off', |
810 'help': 'select profile guided optimization variant', | 842 'help': 'select profile guided optimization variant', |
811 } | 843 } |
812 } | 844 } |
813 | 845 |
| 846 ALL_OPTIONS = dict(PLATFORM_OPTIONS, **SIMPLE_OPTIONS) |
| 847 |
| 848 |
| 849 def AddOptions(options, result): |
| 850 guess_env = Environment(options=result) |
| 851 for (name, option) in options.iteritems(): |
| 852 if 'guess' in option: |
| 853 # Option has a guess function |
| 854 guess = option.get('guess') |
| 855 default = guess(guess_env) |
| 856 else: |
| 857 # Option has a fixed default |
| 858 default = option.get('default') |
| 859 help = '%s (%s)' % (option.get('help'), ", ".join(option['values'])) |
| 860 result.Add(name, help, default) |
| 861 |
814 | 862 |
815 def GetOptions(): | 863 def GetOptions(): |
816 result = Options() | 864 result = Options() |
817 result.Add('mode', 'compilation mode (debug, release)', 'release') | 865 result.Add('mode', 'compilation mode (debug, release)', 'release') |
818 result.Add('sample', 'build sample (shell, process, lineprocessor)', '') | 866 result.Add('sample', 'build sample (shell, process, lineprocessor)', '') |
819 result.Add('cache', 'directory to use for scons build cache', '') | 867 result.Add('cache', 'directory to use for scons build cache', '') |
820 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,..
.)', '') | 868 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,..
.)', '') |
821 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '') | 869 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '') |
822 for (name, option) in SIMPLE_OPTIONS.iteritems(): | 870 AddOptions(PLATFORM_OPTIONS, result) |
823 help = '%s (%s)' % (name, ", ".join(option['values'])) | 871 AddOptions(SIMPLE_OPTIONS, result) |
824 result.Add(name, help, option.get('default')) | |
825 return result | 872 return result |
826 | 873 |
827 | 874 |
| 875 def GetTools(opts): |
| 876 env = Environment(options=opts) |
| 877 os = env['os'] |
| 878 toolchain = env['toolchain'] |
| 879 if os == 'win32' and toolchain == 'gcc': |
| 880 return ['mingw'] |
| 881 elif os == 'win32' and toolchain == 'msvc': |
| 882 return ['msvc', 'mslink', 'mslib', 'msvs'] |
| 883 else: |
| 884 return ['default'] |
| 885 |
| 886 |
828 def GetVersionComponents(): | 887 def GetVersionComponents(): |
829 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)") | 888 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)") |
830 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)") | 889 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)") |
831 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)") | 890 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)") |
832 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)") | 891 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)") |
833 | 892 |
834 patterns = [MAJOR_VERSION_PATTERN, | 893 patterns = [MAJOR_VERSION_PATTERN, |
835 MINOR_VERSION_PATTERN, | 894 MINOR_VERSION_PATTERN, |
836 BUILD_NUMBER_PATTERN, | 895 BUILD_NUMBER_PATTERN, |
837 PATCH_LEVEL_PATTERN] | 896 PATCH_LEVEL_PATTERN] |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 if env['soname'] == 'on' and env['library'] == 'static': | 956 if env['soname'] == 'on' and env['library'] == 'static': |
898 Abort("Shared Object soname not applicable for static library.") | 957 Abort("Shared Object soname not applicable for static library.") |
899 if env['os'] != 'win32' and env['pgo'] != 'off': | 958 if env['os'] != 'win32' and env['pgo'] != 'off': |
900 Abort("Profile guided optimization only supported on Windows.") | 959 Abort("Profile guided optimization only supported on Windows.") |
901 if env['cache'] and not os.path.isdir(env['cache']): | 960 if env['cache'] and not os.path.isdir(env['cache']): |
902 Abort("The specified cache directory does not exist.") | 961 Abort("The specified cache directory does not exist.") |
903 if not (env['arch'] == 'arm' or env['simulator'] == 'arm') and ('unalignedacce
sses' in ARGUMENTS): | 962 if not (env['arch'] == 'arm' or env['simulator'] == 'arm') and ('unalignedacce
sses' in ARGUMENTS): |
904 print env['arch'] | 963 print env['arch'] |
905 print env['simulator'] | 964 print env['simulator'] |
906 Abort("Option unalignedaccesses only supported for the ARM architecture.") | 965 Abort("Option unalignedaccesses only supported for the ARM architecture.") |
907 for (name, option) in SIMPLE_OPTIONS.iteritems(): | 966 for (name, option) in ALL_OPTIONS.iteritems(): |
908 if (not option.get('default')) and (name not in ARGUMENTS): | 967 if (not name in env): |
909 message = ("A value for option %s must be specified (%s)." % | 968 message = ("A value for option %s must be specified (%s)." % |
910 (name, ", ".join(option['values']))) | 969 (name, ", ".join(option['values']))) |
911 Abort(message) | 970 Abort(message) |
912 if not env[name] in option['values']: | 971 if not env[name] in option['values']: |
913 message = ("Unknown %s value '%s'. Possible values are (%s)." % | 972 message = ("Unknown %s value '%s'. Possible values are (%s)." % |
914 (name, env[name], ", ".join(option['values']))) | 973 (name, env[name], ", ".join(option['values']))) |
915 Abort(message) | 974 Abort(message) |
916 | 975 |
917 | 976 |
918 class BuildContext(object): | 977 class BuildContext(object): |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 if var in os.environ: | 1085 if var in os.environ: |
1027 overrides[var] = os.environ[var] | 1086 overrides[var] = os.environ[var] |
1028 for override in arg.split(','): | 1087 for override in arg.split(','): |
1029 pos = override.find(':') | 1088 pos = override.find(':') |
1030 if pos == -1: | 1089 if pos == -1: |
1031 continue | 1090 continue |
1032 overrides[override[:pos].strip()] = override[pos+1:].strip() | 1091 overrides[override[:pos].strip()] = override[pos+1:].strip() |
1033 return overrides | 1092 return overrides |
1034 | 1093 |
1035 | 1094 |
1036 def BuildSpecific(env, mode, env_overrides): | 1095 def BuildSpecific(env, mode, env_overrides, tools): |
1037 options = {'mode': mode} | 1096 options = {'mode': mode} |
1038 for option in SIMPLE_OPTIONS: | 1097 for option in ALL_OPTIONS: |
1039 options[option] = env[option] | 1098 options[option] = env[option] |
1040 PostprocessOptions(options, env['os']) | 1099 PostprocessOptions(options, env['os']) |
1041 | 1100 |
1042 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']
)) | 1101 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']
)) |
1043 | 1102 |
1044 # Remove variables which can't be imported from the user's external | 1103 # Remove variables which can't be imported from the user's external |
1045 # environment into a construction environment. | 1104 # environment into a construction environment. |
1046 user_environ = os.environ.copy() | 1105 user_environ = os.environ.copy() |
1047 try: | 1106 try: |
1048 del user_environ['ENV'] | 1107 del user_environ['ENV'] |
(...skipping 30 matching lines...) Expand all Loading... |
1079 if context.options['soname'] == 'on': | 1138 if context.options['soname'] == 'on': |
1080 soname = GetSpecificSONAME() | 1139 soname = GetSpecificSONAME() |
1081 if soname == '': | 1140 if soname == '': |
1082 soname = 'lib' + library_name + '.so' | 1141 soname = 'lib' + library_name + '.so' |
1083 env['SONAME'] = soname | 1142 env['SONAME'] = soname |
1084 | 1143 |
1085 # Build the object files by invoking SCons recursively. | 1144 # Build the object files by invoking SCons recursively. |
1086 (object_files, shell_files, mksnapshot) = env.SConscript( | 1145 (object_files, shell_files, mksnapshot) = env.SConscript( |
1087 join('src', 'SConscript'), | 1146 join('src', 'SConscript'), |
1088 build_dir=join('obj', target_id), | 1147 build_dir=join('obj', target_id), |
1089 exports='context', | 1148 exports='context tools', |
1090 duplicate=False | 1149 duplicate=False |
1091 ) | 1150 ) |
1092 | 1151 |
1093 context.mksnapshot_targets.append(mksnapshot) | 1152 context.mksnapshot_targets.append(mksnapshot) |
1094 | 1153 |
1095 # Link the object files into a library. | 1154 # Link the object files into a library. |
1096 env.Replace(**context.flags['v8']) | 1155 env.Replace(**context.flags['v8']) |
1097 | 1156 |
1098 context.ApplyEnvOverrides(env) | 1157 context.ApplyEnvOverrides(env) |
1099 if context.options['library'] == 'static': | 1158 if context.options['library'] == 'static': |
1100 library = env.StaticLibrary(library_name, object_files) | 1159 library = env.StaticLibrary(library_name, object_files) |
1101 else: | 1160 else: |
1102 # There seems to be a glitch in the way scons decides where to put | 1161 # There seems to be a glitch in the way scons decides where to put |
1103 # PDB files when compiling using MSVC so we specify it manually. | 1162 # PDB files when compiling using MSVC so we specify it manually. |
1104 # This should not affect any other platforms. | 1163 # This should not affect any other platforms. |
1105 pdb_name = library_name + '.dll.pdb' | 1164 pdb_name = library_name + '.dll.pdb' |
1106 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name) | 1165 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name) |
1107 context.library_targets.append(library) | 1166 context.library_targets.append(library) |
1108 | 1167 |
1109 d8_env = Environment() | 1168 d8_env = Environment(tools=tools) |
1110 d8_env.Replace(**context.flags['d8']) | 1169 d8_env.Replace(**context.flags['d8']) |
1111 context.ApplyEnvOverrides(d8_env) | 1170 context.ApplyEnvOverrides(d8_env) |
1112 shell = d8_env.Program('d8' + suffix, object_files + shell_files) | 1171 shell = d8_env.Program('d8' + suffix, object_files + shell_files) |
1113 context.d8_targets.append(shell) | 1172 context.d8_targets.append(shell) |
1114 | 1173 |
1115 for sample in context.samples: | 1174 for sample in context.samples: |
1116 sample_env = Environment() | 1175 sample_env = Environment(tools=tools) |
1117 sample_env.Replace(**context.flags['sample']) | 1176 sample_env.Replace(**context.flags['sample']) |
1118 sample_env.Prepend(LIBS=[library_name]) | 1177 sample_env.Prepend(LIBS=[library_name]) |
1119 context.ApplyEnvOverrides(sample_env) | 1178 context.ApplyEnvOverrides(sample_env) |
1120 sample_object = sample_env.SConscript( | 1179 sample_object = sample_env.SConscript( |
1121 join('samples', 'SConscript'), | 1180 join('samples', 'SConscript'), |
1122 build_dir=join('obj', 'sample', sample, target_id), | 1181 build_dir=join('obj', 'sample', sample, target_id), |
1123 exports='sample context', | 1182 exports='sample context tools', |
1124 duplicate=False | 1183 duplicate=False |
1125 ) | 1184 ) |
1126 sample_name = sample + suffix | 1185 sample_name = sample + suffix |
1127 sample_program = sample_env.Program(sample_name, sample_object) | 1186 sample_program = sample_env.Program(sample_name, sample_object) |
1128 sample_env.Depends(sample_program, library) | 1187 sample_env.Depends(sample_program, library) |
1129 context.sample_targets.append(sample_program) | 1188 context.sample_targets.append(sample_program) |
1130 | 1189 |
1131 cctest_env = env.Copy() | 1190 cctest_env = env.Copy() |
1132 cctest_env.Prepend(LIBS=[library_name]) | 1191 cctest_env.Prepend(LIBS=[library_name]) |
1133 cctest_program = cctest_env.SConscript( | 1192 cctest_program = cctest_env.SConscript( |
1134 join('test', 'cctest', 'SConscript'), | 1193 join('test', 'cctest', 'SConscript'), |
1135 build_dir=join('obj', 'test', target_id), | 1194 build_dir=join('obj', 'test', target_id), |
1136 exports='context object_files', | 1195 exports='context object_files tools', |
1137 duplicate=False | 1196 duplicate=False |
1138 ) | 1197 ) |
1139 context.cctest_targets.append(cctest_program) | 1198 context.cctest_targets.append(cctest_program) |
1140 | 1199 |
1141 return context | 1200 return context |
1142 | 1201 |
1143 | 1202 |
1144 def Build(): | 1203 def Build(): |
1145 opts = GetOptions() | 1204 opts = GetOptions() |
1146 env = Environment(options=opts) | 1205 tools = GetTools(opts) |
| 1206 env = Environment(options=opts, tools=tools) |
| 1207 |
1147 Help(opts.GenerateHelpText(env)) | 1208 Help(opts.GenerateHelpText(env)) |
1148 VerifyOptions(env) | 1209 VerifyOptions(env) |
1149 env_overrides = ParseEnvOverrides(env['env'], env['importenv']) | 1210 env_overrides = ParseEnvOverrides(env['env'], env['importenv']) |
1150 | 1211 |
1151 SourceSignatures(env['sourcesignatures']) | 1212 SourceSignatures(env['sourcesignatures']) |
1152 | 1213 |
1153 libraries = [] | 1214 libraries = [] |
1154 mksnapshots = [] | 1215 mksnapshots = [] |
1155 cctests = [] | 1216 cctests = [] |
1156 samples = [] | 1217 samples = [] |
1157 d8s = [] | 1218 d8s = [] |
1158 modes = SplitList(env['mode']) | 1219 modes = SplitList(env['mode']) |
1159 for mode in modes: | 1220 for mode in modes: |
1160 context = BuildSpecific(env.Copy(), mode, env_overrides) | 1221 context = BuildSpecific(env.Copy(), mode, env_overrides, tools) |
1161 libraries += context.library_targets | 1222 libraries += context.library_targets |
1162 mksnapshots += context.mksnapshot_targets | 1223 mksnapshots += context.mksnapshot_targets |
1163 cctests += context.cctest_targets | 1224 cctests += context.cctest_targets |
1164 samples += context.sample_targets | 1225 samples += context.sample_targets |
1165 d8s += context.d8_targets | 1226 d8s += context.d8_targets |
1166 | 1227 |
1167 env.Alias('library', libraries) | 1228 env.Alias('library', libraries) |
1168 env.Alias('mksnapshot', mksnapshots) | 1229 env.Alias('mksnapshot', mksnapshots) |
1169 env.Alias('cctests', cctests) | 1230 env.Alias('cctests', cctests) |
1170 env.Alias('sample', samples) | 1231 env.Alias('sample', samples) |
(...skipping 12 matching lines...) Expand all Loading... |
1183 # version of scons. Also, there's a bug in some revisions that | 1244 # version of scons. Also, there's a bug in some revisions that |
1184 # doesn't allow this flag to be set, so we swallow any exceptions. | 1245 # doesn't allow this flag to be set, so we swallow any exceptions. |
1185 # Lovely. | 1246 # Lovely. |
1186 try: | 1247 try: |
1187 SetOption('warn', 'no-deprecated') | 1248 SetOption('warn', 'no-deprecated') |
1188 except: | 1249 except: |
1189 pass | 1250 pass |
1190 | 1251 |
1191 | 1252 |
1192 Build() | 1253 Build() |
OLD | NEW |