xcodeproj 0.3.5 → 0.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/bin/xcodeproj +13 -0
  2. data/lib/xcodeproj.rb +13 -1
  3. data/lib/xcodeproj/command.rb +131 -0
  4. data/lib/xcodeproj/command/project_diff.rb +53 -0
  5. data/lib/xcodeproj/command/show.rb +35 -0
  6. data/lib/xcodeproj/command/target_diff.rb +43 -0
  7. data/lib/xcodeproj/config.rb +66 -38
  8. data/lib/xcodeproj/constants.rb +146 -0
  9. data/lib/xcodeproj/helper.rb +28 -0
  10. data/lib/xcodeproj/project.rb +462 -156
  11. data/lib/xcodeproj/project/object.rb +251 -138
  12. data/lib/xcodeproj/project/object/build_configuration.rb +27 -0
  13. data/lib/xcodeproj/project/object/build_file.rb +26 -0
  14. data/lib/xcodeproj/project/object/build_phase.rb +132 -61
  15. data/lib/xcodeproj/project/object/build_rule.rb +46 -0
  16. data/lib/xcodeproj/project/object/configuration_list.rb +47 -0
  17. data/lib/xcodeproj/project/object/container_item_proxy.rb +49 -0
  18. data/lib/xcodeproj/project/object/file_reference.rb +80 -48
  19. data/lib/xcodeproj/project/object/group.rb +213 -89
  20. data/lib/xcodeproj/project/object/native_target.rb +171 -114
  21. data/lib/xcodeproj/project/object/root_object.rb +66 -0
  22. data/lib/xcodeproj/project/object/target_dependency.rb +23 -0
  23. data/lib/xcodeproj/project/object_attributes.rb +382 -0
  24. data/lib/xcodeproj/project/object_list.rb +64 -118
  25. data/lib/xcodeproj/project/recursive_diff.rb +116 -0
  26. data/lib/xcodeproj/workspace.rb +56 -2
  27. metadata +38 -10
  28. data/lib/xcodeproj/project/association.rb +0 -54
  29. data/lib/xcodeproj/project/association/has_many.rb +0 -51
  30. data/lib/xcodeproj/project/association/has_one.rb +0 -39
  31. data/lib/xcodeproj/project/association/reflection.rb +0 -86
  32. data/lib/xcodeproj/project/object/configuration.rb +0 -97
@@ -2,122 +2,246 @@ module Xcodeproj
2
2
  class Project
3
3
  module Object
4
4
 
5
- class AbstractGroupEntry < AbstractPBXObject
6
- has_one :group, :inverse_of => :children
7
-
8
- def initialize(project, uuid, attributes)
9
- is_new = uuid.nil?
10
- super
11
- # If there's no root_object yet, then this is probably the main group.
12
- if is_new && @project.root_object
13
- @project.main_group.children << self
14
- end
15
- end
5
+ # This class represents a group. A group can contain other groups
6
+ # (PBXGroup) and file references (PBXFileReference).
7
+ #
8
+ class PBXGroup < AbstractObject
9
+
10
+ # @return [ObjectList<PBXGroup, PBXFileReference>]
11
+ # the objects contained by the group.
12
+ #
13
+ has_many :children, [PBXGroup, PBXFileReference]
14
+
15
+ # @return [String] the source tree to which this group is relative.
16
+ #
17
+ # Usually is group <group>.
18
+ #
19
+ attribute :source_tree, String, '<group>'
20
+
21
+ # @return [String] the path to a folder in the file system.
22
+ #
23
+ # This attribute is present for groups that are linked to a folder in
24
+ # the file system.
25
+ #
26
+ attribute :path, String
27
+
28
+ # @return [String] the name of the group.
29
+ #
30
+ # If path is specified this attribute is not present.
31
+ #
32
+ attribute :name, String
16
33
 
17
- def destroy
18
- group.child_references.delete(uuid)
19
- super
20
- end
34
+ end
35
+
36
+ # The purpose of this subclass is not understood.
37
+ #
38
+ class PBXVariantGroup < PBXGroup
21
39
 
22
- # Sorts groups before files and inside those sorts by name.
23
- def <=>(other)
24
- if self.is_a?(PBXGroup) && other.is_a?(PBXFileReference)
25
- -1
26
- elsif self.is_a?(PBXFileReference) && other.is_a?(PBXGroup)
27
- 1
28
- else
29
- self.name <=> other.name
30
- end
31
- end
32
40
  end
33
41
 
34
- # @todo The `source_tree` can probably be more than just `<group>`.
35
- class PBXGroup < AbstractGroupEntry
36
- # [String] the source tree to which this group is relative. It can be
37
- # `<group>`.
38
- attribute :source_tree
39
-
40
- has_many :children, :class => AbstractGroupEntry do |child|
41
- # Associating the AbstractGroupEntry instance to this group through
42
- # the inverse association will also remove it from the group it was
43
- # in.
44
- child.group = self
45
- end
42
+ # A group that contains multiple files references to the different
43
+ # versions of a resource.
44
+ #
45
+ # Used to contain the different versions of a `xcdatamodel`.
46
+ #
47
+ class XCVersionGroup < PBXGroup
46
48
 
47
- def initialize(*)
48
- super
49
- self.source_tree ||= '<group>'
50
- self.child_references ||= []
51
- end
49
+ # @return [PBXFileReference] the reference to the current version.
50
+ #
51
+ has_one :current_version, PBXFileReference
52
52
 
53
- def main_group?
54
- @project.main_group.uuid == uuid
55
- end
53
+ # @return [String] the type of the versioned resource.
54
+ #
55
+ attribute :version_group_type, String, 'wrapper.xcdatamodel'
56
+
57
+ end
58
+
59
+ class PBXGroup < AbstractObject
56
60
 
57
- def name
58
- if name = super
61
+ ## CONVENIENCE METHODS #################################################
62
+
63
+ # @!group Convenience methods
64
+
65
+ # @return [String] the name of the group taking into account the path
66
+ # or other factors if needed.
67
+ #
68
+ def display_name
69
+ if name
59
70
  name
60
- elsif attributes.has_key?('path')
61
- File.basename(attributes['path'])
62
- elsif main_group?
71
+ elsif path
72
+ File.basename(path)
73
+ elsif self.equal?(project.main_group)
63
74
  'Main Group'
64
75
  end
65
76
  end
66
77
 
78
+ # @return [Array<PBXFileReference>] the files references in the group
79
+ # children.
80
+ #
67
81
  def files
68
- children.list_by_class(PBXFileReference)
69
- end
70
-
71
- def create_file(path)
72
- files.new("path" => path)
73
- end
74
-
75
- def create_files(paths)
76
- paths.map { |path| create_file(path) }
77
- end
78
-
79
- def source_files
80
- children.list_by_class(PBXFileReference) do |list|
81
- list.let(:uuid_scope) do
82
- files.reject { |file| file.build_files.empty? }.map(&:uuid)
83
- end
84
- end
82
+ children.select { |obj| obj.class == PBXFileReference }
85
83
  end
86
84
 
85
+ # @return [Array<PBXGroup>] the groups in the group
86
+ # children.
87
+ #
87
88
  def groups
88
- children.list_by_class(PBXGroup)
89
+ children.select { |obj| obj.class == PBXGroup }
89
90
  end
90
91
 
91
- def create_group(name)
92
- groups.new("name" => name)
92
+ # @return [Array<XCVersionGroup>] the version groups in the group
93
+ # children.
94
+ #
95
+ def version_groups
96
+ children.select { |obj| obj.class == XCVersionGroup }
97
+ end
98
+
99
+ # Creates a new file reference with the given path and adds it to the
100
+ # group or to an optional subpath.
101
+ #
102
+ # @note The subpath is created if needed, similar to the UNIX command `mkdir -p`
103
+ #
104
+ # @param [#to_s] path
105
+ # the file system path of the file.
106
+ #
107
+ # @param [String] sub_group_path
108
+ # an optional subgroup path indicating the groups separated by a `/`.
109
+ #
110
+ # @return [PBXFileReference] the new file reference.
111
+ #
112
+ def new_file(path, sub_group_path = nil)
113
+ file = project.new(PBXFileReference)
114
+ file.path = path.to_s
115
+ file.name = file.pathname.basename.to_s
116
+ file.update_last_known_file_type
117
+
118
+ target = find_subpath(sub_group_path, true)
119
+ target.children << file
120
+ file
121
+ end
122
+
123
+ # Creates a new group with the given name and adds it to the children
124
+ # of the group.
125
+ #
126
+ # @note (see #new_file)
127
+ #
128
+ # @param [#to_s] name
129
+ # the name of the new group.
130
+ #
131
+ # @param [String] sub_group_path (see #new_file)
132
+ #
133
+ # @return [PBXGroup] the new group.
134
+ #
135
+ def new_group(name, sub_group_path = nil)
136
+ group = project.new(PBXGroup)
137
+ group.name = name
138
+
139
+ target = find_subpath(sub_group_path, true)
140
+ target.children << group
141
+ group
93
142
  end
94
143
 
95
- def version_groups
96
- children.list_by_class(XCVersionGroup)
144
+ # Creates a file reference to a static library and adds it to the
145
+ # children of the group.
146
+ #
147
+ # @note (see #new_file)
148
+ #
149
+ # @param [#to_s] product_name
150
+ # the name of the new static library.
151
+ #
152
+ # @param [String] sub_group_path (see #new_file)#
153
+ # @return [PBXFileReference] the new group.
154
+ #
155
+ def new_static_library(product_name, sub_group_path = nil)
156
+ file = new_file("lib#{product_name}.a", sub_group_path)
157
+ file.include_in_index = '0'
158
+ file.source_tree = 'BUILT_PRODUCTS_DIR'
159
+ file.explicit_file_type = file.last_known_file_type
160
+ file.last_known_file_type = nil
161
+ file
162
+ end
163
+
164
+ # Creates a new group to represent a `xcdatamodel` file.
165
+ #
166
+ # @return [XCVersionGroup] The new group.
167
+ #
168
+ def new_xcdatamodel_group(xcdatamodel_path)
169
+ g = @project.new(XCVersionGroup)
170
+ g.path = xcdatamodel_path
171
+ g.version_group_type = 'wrapper.xcdatamodel'
172
+ file = g.new_file(xcdatamodel_path.sub(/xcdatamodeld$/, 'xcdatamodel'))
173
+ g.current_version = file
174
+ g
175
+ end
176
+
177
+ # Traverses the children groups and finds the group with the given
178
+ # path, optionally, creating any needed group.
179
+ #
180
+ # @param path (see #find_subpath)
181
+ #
182
+ # @note (see #find_subpath)
183
+ #
184
+ def [](path)
185
+ find_subpath(path)
186
+ end
187
+
188
+ # Traverses the children groups and finds the children with the given
189
+ # path, optionally, creating any needed group. If the given path is
190
+ # `nil` it returns itself.
191
+ #
192
+ # @param [String] path
193
+ # a string with the names of the groups separated by a '`/`'.
194
+ #
195
+ # @param [Boolean] should_create
196
+ # whether the path should be created.
197
+ #
198
+ # @note The path is matched against the {#display_name} of the groups.
199
+ #
200
+ # @example
201
+ # g = main_group['Frameworks']
202
+ # g.name #=> 'Frameworks'
203
+ #
204
+ # @return [PBXGroup] the group if found.
205
+ #
206
+ def find_subpath(path, should_create = false)
207
+ return self unless path
208
+ path = path.split('/') unless path.is_a?(Array)
209
+ child_name = path.shift
210
+ child = children.find{ |c| c.display_name == child_name }
211
+ child = new_group(child_name) if child.nil? && should_create
212
+ if path.empty?
213
+ child
214
+ else
215
+ child.find_subpath(path, should_create)
216
+ end
97
217
  end
98
218
 
219
+ # Adds an object to the group.
220
+ #
221
+ # @return [ObjectList<AbstractObject>] the children list.
222
+ #
99
223
  def <<(child)
100
224
  children << child
101
225
  end
102
- end
103
226
 
104
- class XCVersionGroup < PBXGroup
105
-
106
- attribute :version_group_type
107
- attribute :current_version
108
- attribute :path
109
-
110
- def self.new_xcdatamodel_group(project, xcdatamodel_path)
111
- group = new(project, nil, 'path' => xcdatamodel_path, 'versionGroupType' => 'wrapper.xcdatamodel')
112
- file = group.files.new(
113
- 'path' => xcdatamodel_path.sub(/xcdatamodeld$/, 'xcdatamodel'),
114
- 'lastKnownFileType' => 'wrapper.xcdatamodel'
115
- )
116
- group.current_version = file.uuid
117
- group
227
+ # Sorts the children of the group by type and then by name.
228
+ #
229
+ # @return [void]
230
+ #
231
+ def sort_by_type
232
+ children.sort do |x, y|
233
+ if x.is_a?(PBXGroup) && y.is_a?(PBXFileReference)
234
+ -1
235
+ elsif x.is_a?(PBXFileReference) && y.is_a?(PBXGroup)
236
+ 1
237
+ elsif x.respond_to?(:name) && y.respond_to?(:name)
238
+ x.name <=> y.name
239
+ else
240
+ 0
241
+ end
242
+ end
118
243
  end
119
- end
120
-
244
+ end # PBXGroup
121
245
  end
122
246
  end
123
247
  end
@@ -2,160 +2,217 @@ module Xcodeproj
2
2
  class Project
3
3
  module Object
4
4
 
5
- class PBXNativeTarget < AbstractPBXObject
6
- STATIC_LIBRARY = 'com.apple.product-type.library.static'
5
+ # Represents a target.
6
+ #
7
+ class PBXNativeTarget < AbstractObject
7
8
 
8
- # [String] the name of the build product
9
- attribute :product_name
10
-
11
- # [String] the build product type identifier
12
- attribute :product_type
13
-
14
- has_many :build_phases
15
- has_many :dependencies # TODO :class => ?
16
- has_many :build_rules # TODO :class => ?
17
- has_one :build_configuration_list, :class => XCConfigurationList
18
- has_one :product, :uuid => :product_reference
19
-
20
- def self.new_static_library(project, platform, name)
21
- project.add_system_framework(platform == :ios ? 'Foundation' : 'Cocoa')
22
-
23
- target = new(project, nil, 'productType' => STATIC_LIBRARY, 'productName' => name)
24
- target.product.path = "lib#{name}.a"
9
+ # @return [String] The name of the Target.
10
+ #
11
+ attribute :name, String
25
12
 
26
- target.build_configurations.each do |config|
27
- config.build_settings.merge!(XCBuildConfiguration::COMMON_BUILD_SETTINGS[platform])
13
+ # @return [XCConfigurationList] the list of the build configurations of
14
+ # the target. This list commonly include two configurations `Debug`
15
+ # and `Release`.
16
+ #
17
+ has_one :build_configuration_list, XCConfigurationList
28
18
 
29
- # E.g. [:ios, :release]
30
- extra_settings_key = [platform, config.name.downcase.to_sym]
31
- if extra_settings = XCBuildConfiguration::COMMON_BUILD_SETTINGS[extra_settings_key]
32
- config.build_settings.merge!(extra_settings)
33
- end
34
- end
19
+ # @return [PBXBuildRule] the build phases of the target.
20
+ #
21
+ # @note Apparently only PBXCopyFilesBuildPhase and
22
+ # PBXShellScriptBuildPhase can appear multiple times in a target.
23
+ #
24
+ has_many :build_phases, AbstractBuildPhase
35
25
 
36
- target
37
- end
26
+ # @return [PBXBuildRule] the build rules of this target.
27
+ #
28
+ has_many :build_rules, PBXBuildRule
38
29
 
39
- # You need to specify a product. For a static library you can use
40
- # PBXFileReference.new_static_library.
41
- def initialize(project, *)
42
- super
43
- self.name ||= product_name
44
- self.build_rule_references ||= []
45
- self.dependency_references ||= []
30
+ # @return [PBXNativeTarget] the targets necessary to build this target.
31
+ #
32
+ has_many :dependencies, PBXTargetDependency
46
33
 
47
- unless build_phase_references
48
- self.build_phase_references = []
34
+ # @return [String] the name of the build product.
35
+ #
36
+ attribute :product_name, String
49
37
 
50
- source_build_phases.new
51
- copy_files_build_phases.new
52
- #shell_script_build_phases.new
38
+ # @return [String] the build product type identifier.
39
+ #
40
+ attribute :product_type, String, 'com.apple.product-type.library.static'
53
41
 
54
- phase = frameworks_build_phases.new
55
- if frameworks_group = @project.groups.where(:name => 'Frameworks')
56
- frameworks_group.files.each { |framework| phase << framework }
57
- end
58
- end
42
+ # @return [PBXFileReference] the reference to the product file.
43
+ #
44
+ has_one :product_reference, PBXFileReference
59
45
 
60
- unless build_configuration_list
61
- self.build_configuration_list = project.objects.add(XCConfigurationList, {
62
- 'defaultConfigurationIsVisible' => '0',
63
- 'defaultConfigurationName' => 'Release',
64
- })
65
- # TODO or should this happen in buildConfigurationList?
66
- build_configuration_list.build_configurations.new_debug
67
- build_configuration_list.build_configurations.new_release
68
- end
46
+ # @return [String] the install path of the product.
47
+ #
48
+ attribute :product_install_path, String
69
49
 
70
- unless product
71
- self.product = @project.files.new_static_library(product_name)
72
- end
73
- end
50
+ ## CONVENIENCE METHODS #################################################
74
51
 
75
- alias_method :_product=, :product=
76
- def product=(product)
77
- self._product = product
78
- @project.products << product
79
- end
52
+ # @!group Convenience methods
80
53
 
54
+ # @return [ObjectList<XCBuildConfiguration>] the build
55
+ # configurations of the target.
56
+ #
81
57
  def build_configurations
82
58
  build_configuration_list.build_configurations
83
59
  end
84
60
 
61
+ # @return [Hash] the build settings of the build configuration with the
62
+ # given name.
63
+ #
64
+ # @param [String] build_configuration_name
65
+ # the name of a build configuration.
66
+ #
85
67
  def build_settings(build_configuration_name)
86
68
  build_configuration_list.build_settings(build_configuration_name)
87
69
  end
88
70
 
89
- def source_build_phases
90
- build_phases.list_by_class(PBXSourcesBuildPhase)
71
+ # Adds source files to the target.
72
+ #
73
+ # @param [Array<PBXFileReference>] file_references
74
+ # The files references of the source files that should be added to
75
+ # the target.
76
+ #
77
+ # @param [Hash{String=>String}] compiler_flags
78
+ # The compiler flags for the source files.
79
+ #
80
+ # @return [void]
81
+ #
82
+ def add_file_references(file_references, compiler_flags = {})
83
+ file_references.each do |file|
84
+ build_file = project.new(PBXBuildFile)
85
+ build_file.file_ref = file
86
+
87
+ extension = File.extname(file.path)
88
+ header_extensions = Constants::HEADER_FILES_EXTENSIONS
89
+ if (header_extensions.include?(extension))
90
+ build_file.settings = { 'ATTRIBUTES' => ["Public"] }
91
+ phase = headers_build_phase
92
+ phase.files << build_file
93
+ else
94
+ build_file.settings = { 'COMPILER_FLAGS' => compiler_flags } if compiler_flags && !compiler_flags.empty?
95
+ source_build_phase.files << build_file
96
+ end
97
+ end
91
98
  end
92
99
 
93
- def copy_files_build_phases
94
- build_phases.list_by_class(PBXCopyFilesBuildPhase)
95
- end
96
100
 
97
- def frameworks_build_phases
98
- build_phases.list_by_class(PBXFrameworksBuildPhase)
101
+ # @!group Accessing build phases
102
+
103
+ # Finds or creates the headers build phase of the target.
104
+ #
105
+ # @note A target should have only one headers build phase.
106
+ #
107
+ # @return [PBXHeadersBuildPhase] the headers build phase.
108
+ #
109
+ def headers_build_phase
110
+ unless @headers_build_phase
111
+ headers_build_phase = build_phases.find { |bp| bp.class == PBXHeadersBuildPhase }
112
+ unless headers_build_phase
113
+ # Working around a bug in Xcode 4.2 betas, remove this once the
114
+ # Xcode bug is fixed:
115
+ # https://github.com/alloy/cocoapods/issues/13
116
+ # phase = copy_header_phase || headers_build_phases.first
117
+ headers_build_phase = project.new(PBXHeadersBuildPhase)
118
+ build_phases << headers_build_phase
119
+ end
120
+ @headers_build_phase = headers_build_phase
121
+ end
122
+ @headers_build_phase
99
123
  end
100
124
 
101
- def shell_script_build_phases
102
- build_phases.list_by_class(PBXShellScriptBuildPhase)
125
+ # Finds or creates the source build phase of the target.
126
+ #
127
+ # @note A target should have only one source build phase.
128
+ #
129
+ # @return [PBXSourcesBuildPhase] the source build phase.
130
+ #
131
+ def source_build_phase
132
+ unless @source_build_phase
133
+ source_build_phase = build_phases.find { |bp| bp.class == PBXSourcesBuildPhase }
134
+ unless source_build_phase
135
+ source_build_phase = project.new(PBXSourcesBuildPhase)
136
+ build_phases << source_build_phase
137
+ end
138
+ @source_build_phase = source_build_phase
139
+ end
140
+ @source_build_phase
103
141
  end
104
142
 
105
- def resources_build_phases
106
- build_phases.list_by_class(PBXResourcesBuildPhase)
143
+ # Finds or creates the frameworks build phase of the target.
144
+ #
145
+ # @note A target should have only one frameworks build phase.
146
+ #
147
+ # @return [PBXFrameworksBuildPhase] the frameworks build phase.
148
+ #
149
+ def frameworks_build_phase
150
+ bp = build_phases.find { |bp| bp.class == PBXFrameworksBuildPhase }
151
+ unless bp
152
+ bp = project.new(PBXFrameworksBuildPhase)
153
+ build_phases << bp
154
+ end
155
+ bp
107
156
  end
108
157
 
109
- # Adds source files to the target.
158
+ # Finds or creates the resources build phase of the target.
110
159
  #
111
- # @note
112
- # It finds an existing file reference or creates a new one.
160
+ # @note A target should have only one resources build phase.
113
161
  #
114
- # @param source_file_descriptions [Array<SourceFileDescription>] The
115
- # description of the source files to add.
162
+ # @return [PBXResourcesBuildPhase] the resources build phase.
116
163
  #
117
- # @return [Array<PBXFileReference>]
164
+ def resources_build_phase
165
+ bp = build_phases.find { |bp| bp.class == PBXResourcesBuildPhase }
166
+ unless bp
167
+ bp = project.new(PBXResourcesBuildPhase)
168
+ build_phases << bp
169
+ end
170
+ bp
171
+ end
172
+
173
+ # @return [Array<PBXCopyFilesBuildPhase>]
174
+ # the copy files build phases of the target.
118
175
  #
119
- def add_source_files(source_file_descriptions)
120
- # Cache the files for performance.
121
- files = @project.files.to_a
122
- new_files = []
123
- source_file_descriptions.each do |source_file_description|
124
- path = source_file_description.path
125
- copy_header_phase = source_file_description.copy_header_phase
126
- compiler_flags = source_file_description.compiler_flags
176
+ def copy_files_build_phases
177
+ build_phases.select { |bp| bp.class == PBXCopyFilesBuildPhase }
178
+ end
127
179
 
128
- file = (files + new_files).find { |file| file.path == path.to_s } || @project.files.new('path' => path.to_s)
129
- build_file = file.build_files.new
130
- if (path.extname == '.h' || path.extname == '.hpp' || path.extname == '.hh')
131
- build_file.settings = { 'ATTRIBUTES' => ["Public"] }
132
- # Working around a bug in Xcode 4.2 betas, remove this once the Xcode bug is fixed:
133
- # https://github.com/alloy/cocoapods/issues/13
134
- #phase = copy_header_phase || headers_build_phases.first
135
- phase = copy_header_phase || copy_files_build_phases.first
136
- phase.build_files << build_file
137
- else
138
- build_file.settings = { 'COMPILER_FLAGS' => compiler_flags } if compiler_flags && !compiler_flags.empty?
139
- source_build_phases.first.build_files << build_file
140
- end
141
- new_files << file
142
- end
143
- new_files
180
+ # @return [Array<PBXShellScriptBuildPhase>]
181
+ # the copy files build phases of the target.
182
+ #
183
+ def shell_script_build_phases
184
+ build_phases.select { |bp| bp.class == PBXShellScriptBuildPhase }
144
185
  end
145
186
 
146
- # Struct representing the description needed to add a source file to
147
- # the target.
187
+
188
+ # @!group Creating build phases
189
+
190
+ # Creates a new copy files build phase.
148
191
  #
149
- # @!attribute path
150
- # @return [Pathname] The path of the file.
192
+ # @param [String] name
193
+ # an optional name for the pahse.
151
194
  #
152
- # @!attribute compiler_flags
153
- # @return [String] Any compiler flag.
195
+ # @return [PBXCopyFilesBuildPhase] the new phase.
154
196
  #
155
- # @!attribute copy_header_phase
156
- # @return [PBXCopyFilesBuildPhase].
197
+ def new_copy_files_build_phase(name = nil)
198
+ phase = project.new(PBXCopyFilesBuildPhase)
199
+ phase.name = name
200
+ build_phases << phase
201
+ phase
202
+ end
203
+
204
+ # Creates a new shell script build phase.
205
+ #
206
+ # @param (see #new_copy_files_build_phase)
157
207
  #
158
- SourceFileDescription = Struct.new(:path, :compiler_flags, :copy_header_phase)
208
+ # @return [PBXShellScriptBuildPhase] the new phase.
209
+ #
210
+ def new_shell_script_build_phase(name = nil)
211
+ phase = project.new(PBXShellScriptBuildPhase)
212
+ phase.name = name
213
+ build_phases << phase
214
+ phase
215
+ end
159
216
  end
160
217
  end
161
218
  end