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 collections | |
10 import itertools | |
9 import os | 11 import os |
10 import re | 12 import re |
11 import shutil | 13 import shutil |
12 import stat | 14 import stat |
13 import subprocess | 15 import subprocess |
14 import sys | 16 import sys |
15 import tempfile | 17 import tempfile |
16 | 18 |
17 import TestCmd | 19 import TestCmd |
18 import TestCommon | 20 import TestCommon |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
525 Verifies that a build of the specified target is up to date. | 527 Verifies that a build of the specified target is up to date. |
526 """ | 528 """ |
527 kw['stdout'] = ("make: Nothing to be done for `%s'." % | 529 kw['stdout'] = ("make: Nothing to be done for `%s'." % |
528 self.target_name(target)) | 530 self.target_name(target)) |
529 | 531 |
530 # We need to supply a custom matcher, since we don't want to depend on the | 532 # We need to supply a custom matcher, since we don't want to depend on the |
531 # exact stdout string. | 533 # exact stdout string. |
532 kw['match'] = self.match_single_line | 534 kw['match'] = self.match_single_line |
533 return self.build(gyp_file, target, **kw) | 535 return self.build(gyp_file, target, **kw) |
534 | 536 |
537 | |
538 class TestGypCMake(TestGypBase): | |
539 """ | |
540 Subclass for testing the GYP CMake generator. | |
Nico
2013/11/19 16:35:28
", using cmake's ninja backend"?
bungeman-chromium
2013/11/20 20:54:51
Done. Way back when I had this set up so it could
| |
541 """ | |
542 format = 'cmake' | |
543 build_tool_list = ['cmake'] | |
544 ALL = 'all' | |
545 | |
546 def cmake_build(self, gyp_file, target=None, **kw): | |
547 arguments = kw.get('arguments', [])[:] | |
548 | |
549 self.build_tool_list = ['cmake'] | |
550 self.initialize_build_tool() | |
551 | |
552 chdir = os.path.join(kw.get('chdir', '.'), | |
553 'out', | |
554 self.configuration_dirname()) | |
555 kw['chdir'] = chdir | |
556 | |
557 arguments.append('-G') | |
558 arguments.append('Ninja') | |
559 | |
560 kw['arguments'] = arguments | |
561 | |
562 stderr = kw.get('stderr', None) | |
563 if stderr: | |
564 kw['stderr'] = stderr.split('$$$')[0] | |
565 | |
566 self.run(program=self.build_tool, **kw) | |
567 | |
568 def ninja_build(self, gyp_file, target=None, **kw): | |
569 arguments = kw.get('arguments', [])[:] | |
570 | |
571 self.build_tool_list = ['ninja'] | |
572 self.initialize_build_tool() | |
573 | |
574 # Add a -C output/path to the command line. | |
575 arguments.append('-C') | |
576 arguments.append(os.path.join('out', self.configuration_dirname())) | |
577 | |
578 if target not in (None, self.DEFAULT): | |
579 arguments.append(target) | |
580 | |
581 kw['arguments'] = arguments | |
582 | |
583 stderr = kw.get('stderr', None) | |
584 if stderr: | |
585 stderrs = stderr.split('$$$') | |
586 kw['stderr'] = stderrs[1] if len(stderrs) > 1 else '' | |
587 | |
588 return self.run(program=self.build_tool, **kw) | |
589 | |
590 def build(self, gyp_file, target=None, status=0, **kw): | |
591 # Two tools must be run to build, cmake and the ninja. | |
592 # Allow cmake to succeed when the overall expectation is to fail. | |
593 if status is None: | |
594 kw['status'] = None | |
595 else: | |
596 if not isinstance(status, collections.Iterable): status = (status,) | |
597 kw['status'] = list(itertools.chain((0,), status)) | |
598 self.cmake_build(gyp_file, target, **kw) | |
599 kw['status'] = status | |
600 self.ninja_build(gyp_file, target, **kw) | |
601 | |
602 def run_built_executable(self, name, *args, **kw): | |
603 # Enclosing the name in a list avoids prepending the original dir. | |
604 program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] | |
605 if sys.platform == 'darwin': | |
606 configuration = self.configuration_dirname() | |
607 os.environ['DYLD_LIBRARY_PATH'] = os.path.join('out', configuration) | |
608 return self.run(program=program, *args, **kw) | |
609 | |
610 def built_file_path(self, name, type=None, **kw): | |
611 result = [] | |
612 chdir = kw.get('chdir') | |
613 if chdir: | |
614 result.append(chdir) | |
615 result.append('out') | |
616 result.append(self.configuration_dirname()) | |
617 if type == self.STATIC_LIB: | |
618 if sys.platform != 'darwin': | |
619 result.append('obj.target') | |
620 elif type == self.SHARED_LIB: | |
621 if sys.platform != 'darwin' and sys.platform != 'win32': | |
622 result.append('lib.target') | |
623 subdir = kw.get('subdir') | |
624 if subdir and type != self.SHARED_LIB: | |
625 result.append(subdir) | |
626 result.append(self.built_file_basename(name, type, **kw)) | |
627 return self.workpath(*result) | |
628 | |
629 def up_to_date(self, gyp_file, target=None, **kw): | |
630 result = self.ninja_build(gyp_file, target, **kw) | |
631 if not result: | |
632 stdout = self.stdout() | |
633 if 'ninja: no work to do' not in stdout: | |
634 self.report_not_up_to_date() | |
635 self.fail_test() | |
636 return result | |
637 | |
638 | |
535 class TestGypMake(TestGypBase): | 639 class TestGypMake(TestGypBase): |
536 """ | 640 """ |
537 Subclass for testing the GYP Make generator. | 641 Subclass for testing the GYP Make generator. |
538 """ | 642 """ |
539 format = 'make' | 643 format = 'make' |
540 build_tool_list = ['make'] | 644 build_tool_list = ['make'] |
541 ALL = 'all' | 645 ALL = 'all' |
542 def build(self, gyp_file, target=None, **kw): | 646 def build(self, gyp_file, target=None, **kw): |
543 """ | 647 """ |
544 Runs a Make build using the Makefiles generated from the specified | 648 Runs a Make build using the Makefiles generated from the specified |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
986 result.append(chdir) | 1090 result.append(chdir) |
987 configuration = self.configuration_dirname() | 1091 configuration = self.configuration_dirname() |
988 result.extend(['build', configuration]) | 1092 result.extend(['build', configuration]) |
989 result.append(self.built_file_basename(name, type, **kw)) | 1093 result.append(self.built_file_basename(name, type, **kw)) |
990 return self.workpath(*result) | 1094 return self.workpath(*result) |
991 | 1095 |
992 | 1096 |
993 format_class_list = [ | 1097 format_class_list = [ |
994 TestGypGypd, | 1098 TestGypGypd, |
995 TestGypAndroid, | 1099 TestGypAndroid, |
1100 TestGypCMake, | |
996 TestGypMake, | 1101 TestGypMake, |
997 TestGypMSVS, | 1102 TestGypMSVS, |
998 TestGypNinja, | 1103 TestGypNinja, |
999 TestGypXcode, | 1104 TestGypXcode, |
1000 ] | 1105 ] |
1001 | 1106 |
1002 def TestGyp(*args, **kw): | 1107 def TestGyp(*args, **kw): |
1003 """ | 1108 """ |
1004 Returns an appropriate TestGyp* instance for a specified GYP format. | 1109 Returns an appropriate TestGyp* instance for a specified GYP format. |
1005 """ | 1110 """ |
1006 format = kw.pop('format', os.environ.get('TESTGYP_FORMAT')) | 1111 format = kw.pop('format', os.environ.get('TESTGYP_FORMAT')) |
1007 for format_class in format_class_list: | 1112 for format_class in format_class_list: |
1008 if format == format_class.format: | 1113 if format == format_class.format: |
1009 return format_class(*args, **kw) | 1114 return format_class(*args, **kw) |
1010 raise Exception, "unknown format %r" % format | 1115 raise Exception, "unknown format %r" % format |
OLD | NEW |