OLD | NEW |
1 # Copyright (c) 2012 Google Inc. All rights reserved. | 1 # Copyright (c) 2012 Google Inc. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """ | 5 """ |
6 TestGyp.py: a testing framework for GYP integration tests. | 6 TestGyp.py: a testing framework for GYP integration tests. |
7 """ | 7 """ |
8 | 8 |
9 import os | 9 import os |
10 import re | 10 import re |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 if not os.path.exists(destination_dir): | 216 if not os.path.exists(destination_dir): |
217 self.subdir(destination_dir) | 217 self.subdir(destination_dir) |
218 os.rename(source, destination) | 218 os.rename(source, destination) |
219 | 219 |
220 def report_not_up_to_date(self): | 220 def report_not_up_to_date(self): |
221 """ | 221 """ |
222 Reports that a build is not up-to-date. | 222 Reports that a build is not up-to-date. |
223 | 223 |
224 This provides common reporting for formats that have complicated | 224 This provides common reporting for formats that have complicated |
225 conditions for checking whether a build is up-to-date. Formats | 225 conditions for checking whether a build is up-to-date. Formats |
226 that expect exact output from the command (make, scons) can | 226 that expect exact output from the command (make) can |
227 just set stdout= when they call the run_build() method. | 227 just set stdout= when they call the run_build() method. |
228 """ | 228 """ |
229 print "Build is not up-to-date:" | 229 print "Build is not up-to-date:" |
230 print self.banner('STDOUT ') | 230 print self.banner('STDOUT ') |
231 print self.stdout() | 231 print self.stdout() |
232 stderr = self.stderr() | 232 stderr = self.stderr() |
233 if stderr: | 233 if stderr: |
234 print self.banner('STDERR ') | 234 print self.banner('STDERR ') |
235 print stderr | 235 print stderr |
236 | 236 |
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 chdir = kw.get('chdir') | 857 chdir = kw.get('chdir') |
858 if chdir: | 858 if chdir: |
859 result.append(chdir) | 859 result.append(chdir) |
860 result.append(self.configuration_dirname()) | 860 result.append(self.configuration_dirname()) |
861 if type == self.STATIC_LIB: | 861 if type == self.STATIC_LIB: |
862 result.append('lib') | 862 result.append('lib') |
863 result.append(self.built_file_basename(name, type, **kw)) | 863 result.append(self.built_file_basename(name, type, **kw)) |
864 return self.workpath(*result) | 864 return self.workpath(*result) |
865 | 865 |
866 | 866 |
867 class TestGypSCons(TestGypBase): | |
868 """ | |
869 Subclass for testing the GYP SCons generator. | |
870 """ | |
871 format = 'scons' | |
872 build_tool_list = ['scons', 'scons.py'] | |
873 ALL = 'all' | |
874 def build(self, gyp_file, target=None, **kw): | |
875 """ | |
876 Runs a scons build using the SCons configuration generated from the | |
877 specified gyp_file. | |
878 """ | |
879 arguments = kw.get('arguments', [])[:] | |
880 dirname = os.path.dirname(gyp_file) | |
881 if dirname: | |
882 arguments.extend(['-C', dirname]) | |
883 if self.configuration: | |
884 arguments.append('--mode=' + self.configuration) | |
885 if target not in (None, self.DEFAULT): | |
886 arguments.append(target) | |
887 kw['arguments'] = arguments | |
888 return self.run(program=self.build_tool, **kw) | |
889 def up_to_date(self, gyp_file, target=None, **kw): | |
890 """ | |
891 Verifies that a build of the specified SCons target is up to date. | |
892 """ | |
893 if target in (None, self.DEFAULT): | |
894 up_to_date_targets = 'all' | |
895 else: | |
896 up_to_date_targets = target | |
897 up_to_date_lines = [] | |
898 for arg in up_to_date_targets.split(): | |
899 up_to_date_lines.append("scons: `%s' is up to date.\n" % arg) | |
900 kw['stdout'] = ''.join(up_to_date_lines) | |
901 arguments = kw.get('arguments', [])[:] | |
902 arguments.append('-Q') | |
903 kw['arguments'] = arguments | |
904 return self.build(gyp_file, target, **kw) | |
905 def run_built_executable(self, name, *args, **kw): | |
906 """ | |
907 Runs an executable built by scons. | |
908 """ | |
909 configuration = self.configuration_dirname() | |
910 os.environ['LD_LIBRARY_PATH'] = os.path.join(configuration, 'lib') | |
911 # Enclosing the name in a list avoids prepending the original dir. | |
912 program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] | |
913 return self.run(program=program, *args, **kw) | |
914 def built_file_path(self, name, type=None, **kw): | |
915 """ | |
916 Returns a path to the specified file name, of the specified type, | |
917 as built by Scons. | |
918 | |
919 Built files are in a subdirectory that matches the configuration | |
920 name. The default is 'Default'. | |
921 | |
922 A chdir= keyword argument specifies the source directory | |
923 relative to which the output subdirectory can be found. | |
924 | |
925 "type" values of STATIC_LIB or SHARED_LIB append the necessary | |
926 prefixes and suffixes to a platform-independent library base name. | |
927 """ | |
928 result = [] | |
929 chdir = kw.get('chdir') | |
930 if chdir: | |
931 result.append(chdir) | |
932 result.append(self.configuration_dirname()) | |
933 if type in (self.STATIC_LIB, self.SHARED_LIB): | |
934 result.append('lib') | |
935 result.append(self.built_file_basename(name, type, **kw)) | |
936 return self.workpath(*result) | |
937 | |
938 | |
939 class TestGypXcode(TestGypBase): | 867 class TestGypXcode(TestGypBase): |
940 """ | 868 """ |
941 Subclass for testing the GYP Xcode generator. | 869 Subclass for testing the GYP Xcode generator. |
942 """ | 870 """ |
943 format = 'xcode' | 871 format = 'xcode' |
944 build_tool_list = ['xcodebuild'] | 872 build_tool_list = ['xcodebuild'] |
945 | 873 |
946 phase_script_execution = ("\n" | 874 phase_script_execution = ("\n" |
947 "PhaseScriptExecution /\\S+/Script-[0-9A-F]+\\.sh\n" | 875 "PhaseScriptExecution /\\S+/Script-[0-9A-F]+\\.sh\n" |
948 " cd /\\S+\n" | 876 " cd /\\S+\n" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 result.append(self.built_file_basename(name, type, **kw)) | 972 result.append(self.built_file_basename(name, type, **kw)) |
1045 return self.workpath(*result) | 973 return self.workpath(*result) |
1046 | 974 |
1047 | 975 |
1048 format_class_list = [ | 976 format_class_list = [ |
1049 TestGypGypd, | 977 TestGypGypd, |
1050 TestGypAndroid, | 978 TestGypAndroid, |
1051 TestGypMake, | 979 TestGypMake, |
1052 TestGypMSVS, | 980 TestGypMSVS, |
1053 TestGypNinja, | 981 TestGypNinja, |
1054 TestGypSCons, | |
1055 TestGypXcode, | 982 TestGypXcode, |
1056 ] | 983 ] |
1057 | 984 |
1058 def TestGyp(*args, **kw): | 985 def TestGyp(*args, **kw): |
1059 """ | 986 """ |
1060 Returns an appropriate TestGyp* instance for a specified GYP format. | 987 Returns an appropriate TestGyp* instance for a specified GYP format. |
1061 """ | 988 """ |
1062 format = kw.pop('format', os.environ.get('TESTGYP_FORMAT')) | 989 format = kw.pop('format', os.environ.get('TESTGYP_FORMAT')) |
1063 for format_class in format_class_list: | 990 for format_class in format_class_list: |
1064 if format == format_class.format: | 991 if format == format_class.format: |
1065 return format_class(*args, **kw) | 992 return format_class(*args, **kw) |
1066 raise Exception, "unknown format %r" % format | 993 raise Exception, "unknown format %r" % format |
OLD | NEW |