| 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 """Xcode project file generator. |     5 """Xcode project file generator. | 
|     6  |     6  | 
|     7 This module is both an Xcode project file generator and a documentation of the |     7 This module is both an Xcode project file generator and a documentation of the | 
|     8 Xcode project file format.  Knowledge of the project file format was gained |     8 Xcode project file format.  Knowledge of the project file format was gained | 
|     9 based on extensive experience with Xcode, and by making changes to projects in |     9 based on extensive experience with Xcode, and by making changes to projects in | 
|    10 Xcode.app and observing the resultant changes in the associated project files. |    10 Xcode.app and observing the resultant changes in the associated project files. | 
| (...skipping 2718 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2729                  cmp(x['ProjectRef'].Name().lower(), |  2729                  cmp(x['ProjectRef'].Name().lower(), | 
|  2730                      y['ProjectRef'].Name().lower())) |  2730                      y['ProjectRef'].Name().lower())) | 
|  2731     else: |  2731     else: | 
|  2732       # The link already exists.  Pull out the relevnt data. |  2732       # The link already exists.  Pull out the relevnt data. | 
|  2733       project_ref_dict = self._other_pbxprojects[other_pbxproject] |  2733       project_ref_dict = self._other_pbxprojects[other_pbxproject] | 
|  2734       product_group = project_ref_dict['ProductGroup'] |  2734       product_group = project_ref_dict['ProductGroup'] | 
|  2735       project_ref = project_ref_dict['ProjectRef'] |  2735       project_ref = project_ref_dict['ProjectRef'] | 
|  2736  |  2736  | 
|  2737     self._SetUpProductReferences(other_pbxproject, product_group, project_ref) |  2737     self._SetUpProductReferences(other_pbxproject, product_group, project_ref) | 
|  2738  |  2738  | 
 |  2739     inherit_unique_symroot = self._AllSymrootsUnique(other_pbxproject, False) | 
 |  2740     targets = other_pbxproject.GetProperty('targets') | 
 |  2741     if all(self._AllSymrootsUnique(t, inherit_unique_symroot) for t in targets): | 
 |  2742       dir_path = project_ref._properties['path'] | 
 |  2743       product_group._hashables.extend(dir_path) | 
 |  2744  | 
|  2739     return [product_group, project_ref] |  2745     return [product_group, project_ref] | 
|  2740  |  2746  | 
 |  2747   def _AllSymrootsUnique(self, target, inherit_unique_symroot): | 
 |  2748     # Returns True if all configurations have a unique 'SYMROOT' attribute. | 
 |  2749     # The value of inherit_unique_symroot decides, if a configuration is assumed | 
 |  2750     # to inherit a unique 'SYMROOT' attribute from its parent, if it doesn't | 
 |  2751     # define an explicit value for 'SYMROOT'. | 
 |  2752     for s in self._DefinedSymroots(target): | 
 |  2753       if (s is not None and not self._IsUniqueSymrootForTarget(s) or | 
 |  2754           s is None and not inherit_unique_symroot): | 
 |  2755         return False | 
 |  2756     return True | 
 |  2757  | 
 |  2758   def _DefinedSymroots(self, target): | 
 |  2759     # Returns all values for the 'SYMROOT' attribute defined in all | 
 |  2760     # configurations for this target. If any configuration doesn't define the | 
 |  2761     # 'SYMROOT' attribute, None is added to the returned set. If all | 
 |  2762     # configurations don't define the 'SYMROOT' attribute, an empty set is | 
 |  2763     # returned. | 
 |  2764     config_list = target.GetProperty('buildConfigurationList') | 
 |  2765     symroots = set() | 
 |  2766     for config in config_list.GetProperty('buildConfigurations'): | 
 |  2767       setting = config.GetProperty('buildSettings') | 
 |  2768       if 'SYMROOT' in setting: | 
 |  2769         symroots.add(setting['SYMROOT']) | 
 |  2770       else: | 
 |  2771         symroots.add(None) | 
 |  2772     if len(symroots) == 1 and None in symroots: | 
 |  2773       return set() | 
 |  2774     return symroots | 
 |  2775  | 
 |  2776   def _IsUniqueSymrootForTarget(self, symroot): | 
 |  2777     # This method returns True if all configurations in target contain a | 
 |  2778     # 'SYMROOT' attribute that is unique for the given target. A value is | 
 |  2779     # unique, if the Xcode macro '$SRCROOT' appears in it in any form. | 
 |  2780     uniquifier = ['$SRCROOT', '$(SRCROOT)'] | 
 |  2781     if any(x in symroot for x in uniquifier): | 
 |  2782       return True | 
 |  2783     return False | 
 |  2784  | 
|  2741   def _SetUpProductReferences(self, other_pbxproject, product_group, |  2785   def _SetUpProductReferences(self, other_pbxproject, product_group, | 
|  2742                               project_ref): |  2786                               project_ref): | 
|  2743     # TODO(mark): This only adds references to products in other_pbxproject |  2787     # TODO(mark): This only adds references to products in other_pbxproject | 
|  2744     # when they don't exist in this pbxproject.  Perhaps it should also |  2788     # when they don't exist in this pbxproject.  Perhaps it should also | 
|  2745     # remove references from this pbxproject that are no longer present in |  2789     # remove references from this pbxproject that are no longer present in | 
|  2746     # other_pbxproject.  Perhaps it should update various properties if they |  2790     # other_pbxproject.  Perhaps it should update various properties if they | 
|  2747     # change. |  2791     # change. | 
|  2748     for target in other_pbxproject._properties['targets']: |  2792     for target in other_pbxproject._properties['targets']: | 
|  2749       if not isinstance(target, PBXNativeTarget): |  2793       if not isinstance(target, PBXNativeTarget): | 
|  2750         continue |  2794         continue | 
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2883       self._XCPrint(file, 0, '/* Begin ' + class_name + ' section */\n') |  2927       self._XCPrint(file, 0, '/* Begin ' + class_name + ' section */\n') | 
|  2884       for object in sorted(objects_by_class[class_name], |  2928       for object in sorted(objects_by_class[class_name], | 
|  2885                            cmp=lambda x, y: cmp(x.id, y.id)): |  2929                            cmp=lambda x, y: cmp(x.id, y.id)): | 
|  2886         object.Print(file) |  2930         object.Print(file) | 
|  2887       self._XCPrint(file, 0, '/* End ' + class_name + ' section */\n') |  2931       self._XCPrint(file, 0, '/* End ' + class_name + ' section */\n') | 
|  2888  |  2932  | 
|  2889     if self._should_print_single_line: |  2933     if self._should_print_single_line: | 
|  2890       self._XCPrint(file, 0, '}; ') |  2934       self._XCPrint(file, 0, '}; ') | 
|  2891     else: |  2935     else: | 
|  2892       self._XCPrint(file, 1, '};\n') |  2936       self._XCPrint(file, 1, '};\n') | 
| OLD | NEW |