xcodeproj 1.12.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/xcodeproj/command/config_dump.rb +5 -1
- data/lib/xcodeproj/config.rb +2 -0
- data/lib/xcodeproj/constants.rb +6 -1
- data/lib/xcodeproj/gem_version.rb +1 -1
- data/lib/xcodeproj/project/object.rb +1 -1
- data/lib/xcodeproj/project/object/build_configuration.rb +33 -8
- data/lib/xcodeproj/project/object/build_phase.rb +4 -0
- data/lib/xcodeproj/project/object/build_rule.rb +7 -0
- data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +3 -1
- data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +1 -1
- data/lib/xcodeproj/project/object/native_target.rb +7 -3
- data/lib/xcodeproj/project/object/root_object.rb +1 -1
- data/lib/xcodeproj/project/object/target_dependency.rb +5 -0
- data/lib/xcodeproj/scheme/build_action.rb +21 -0
- data/lib/xcodeproj/scheme/launch_action.rb +16 -0
- data/lib/xcodeproj/scheme/test_action.rb +20 -1
- data/lib/xcodeproj/workspace.rb +3 -2
- data/lib/xcodeproj/workspace/file_reference.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '07911f95b24cf5e6d26bbfeca1b8374001ee97c61a94ec53ffabb0967e8303b5'
|
4
|
+
data.tar.gz: a9223334f63670e3385877afb7c097be717604bac8195376d0eafa1c3c9611a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d2d8516fc689a28df9a71f0d5fac7ef4dadb8b8196c162ca3a6faa1746c4d8c12f5567b2b798e85a905c7fe6477179c0b7856c78fc409a1ebeda1dd04a0357c
|
7
|
+
data.tar.gz: 40a40c7b1f908739005ab167e920bbd2299f6db144a7c2c4189a5746f25747db9b7ce61b6ee231dff85d182f45239b176e0c420ac8d632fabe8586f18cd9abb4
|
@@ -76,7 +76,11 @@ module Xcodeproj
|
|
76
76
|
|
77
77
|
def dump_config_to_file(settings, file_path, includes = [])
|
78
78
|
dir = @output_path + file_path + '..'
|
79
|
-
dir.
|
79
|
+
dir.mkpath
|
80
|
+
|
81
|
+
settings = Hash[settings.map do |k, v|
|
82
|
+
[k, Array(v).join(' ')]
|
83
|
+
end]
|
80
84
|
|
81
85
|
config = Config.new(settings)
|
82
86
|
config.includes = includes
|
data/lib/xcodeproj/config.rb
CHANGED
data/lib/xcodeproj/constants.rb
CHANGED
@@ -32,7 +32,7 @@ module Xcodeproj
|
|
32
32
|
|
33
33
|
# @return [String] The last known object version to Xcodeproj.
|
34
34
|
#
|
35
|
-
LAST_KNOWN_OBJECT_VERSION =
|
35
|
+
LAST_KNOWN_OBJECT_VERSION = 54
|
36
36
|
|
37
37
|
# @return [String] The last known object version to Xcodeproj.
|
38
38
|
#
|
@@ -126,6 +126,8 @@ module Xcodeproj
|
|
126
126
|
# @return [Hash] The compatibility version string for different object versions.
|
127
127
|
#
|
128
128
|
COMPATIBILITY_VERSION_BY_OBJECT_VERSION = {
|
129
|
+
54 => 'Xcode 12.0',
|
130
|
+
53 => 'Xcode 11.4',
|
129
131
|
52 => 'Xcode 11.0',
|
130
132
|
51 => 'Xcode 10.0',
|
131
133
|
50 => 'Xcode 9.3',
|
@@ -172,6 +174,9 @@ module Xcodeproj
|
|
172
174
|
:unit_test_bundle => 'xctest',
|
173
175
|
:ui_test_bundle => 'xctest',
|
174
176
|
:app_extension => 'appex',
|
177
|
+
:messages_application => 'app',
|
178
|
+
:messages_extension => 'appex',
|
179
|
+
:sticker_pack => 'appex',
|
175
180
|
:watch2_extension => 'appex',
|
176
181
|
:watch2_app => 'app',
|
177
182
|
:watch2_app_container => 'app',
|
@@ -350,7 +350,7 @@ module Xcodeproj
|
|
350
350
|
unless object = project.objects_by_uuid[uuid] || project.new_from_plist(uuid, objects_by_uuid_plist)
|
351
351
|
UI.warn "`#{inspect}` attempted to initialize an object with " \
|
352
352
|
"an unknown UUID. `#{uuid}` for attribute: " \
|
353
|
-
"`#{attribute.name}`. This can be the result of a merge and
|
353
|
+
"`#{attribute.name}`. This can be the result of a merge and " \
|
354
354
|
'the unknown UUID is being discarded.'
|
355
355
|
end
|
356
356
|
object
|
@@ -6,6 +6,10 @@ module Xcodeproj
|
|
6
6
|
# {PBXProject} or a {PBXNativeTarget}.
|
7
7
|
#
|
8
8
|
class XCBuildConfiguration < AbstractObject
|
9
|
+
MUTUAL_RECURSION_SENTINEL = 'xcodeproj.mutual_recursion_sentinel'.freeze
|
10
|
+
|
11
|
+
private_constant :MUTUAL_RECURSION_SENTINEL
|
12
|
+
|
9
13
|
# @!group Attributes
|
10
14
|
|
11
15
|
# @return [String] the name of the Target.
|
@@ -79,16 +83,19 @@ module Xcodeproj
|
|
79
83
|
# the key of the build setting.
|
80
84
|
#
|
81
85
|
# @param [PBXNativeTarget] root_target
|
82
|
-
# use this to resolve complete recursion between project and targets
|
86
|
+
# use this to resolve complete recursion between project and targets.
|
87
|
+
#
|
88
|
+
# @param [String] previous_key
|
89
|
+
# use this to resolve complete recursion between different build settings.
|
83
90
|
#
|
84
91
|
# @return [String] The value of the build setting
|
85
92
|
#
|
86
|
-
def resolve_build_setting(key, root_target = nil)
|
93
|
+
def resolve_build_setting(key, root_target = nil, previous_key = nil)
|
87
94
|
setting = build_settings[key]
|
88
|
-
setting = resolve_variable_substitution(key, setting, root_target)
|
95
|
+
setting = resolve_variable_substitution(key, setting, root_target, previous_key)
|
89
96
|
|
90
97
|
config_setting = config[key]
|
91
|
-
config_setting = resolve_variable_substitution(key, config_setting, root_target)
|
98
|
+
config_setting = resolve_variable_substitution(key, config_setting, root_target, previous_key)
|
92
99
|
|
93
100
|
project_setting = project.build_configuration_list[name]
|
94
101
|
project_setting = nil if equal?(project_setting)
|
@@ -99,6 +106,12 @@ module Xcodeproj
|
|
99
106
|
'SRCROOT' => project.project_dir.to_s,
|
100
107
|
}
|
101
108
|
|
109
|
+
# if previous_key is nil, it means that we're back at the first call, so we can replace our sentinel string
|
110
|
+
# used to prevent recursion with nil
|
111
|
+
if previous_key.nil? && setting == MUTUAL_RECURSION_SENTINEL
|
112
|
+
setting = nil
|
113
|
+
end
|
114
|
+
|
102
115
|
[defaults[key], project_setting, config_setting, setting, ENV[key]].compact.reduce(nil) do |inherited, value|
|
103
116
|
expand_build_setting(value, inherited)
|
104
117
|
end
|
@@ -142,7 +155,7 @@ module Xcodeproj
|
|
142
155
|
build_setting_value.flat_map { |value| Constants::INHERITED_KEYWORDS.include?(value) ? inherited : value }
|
143
156
|
end
|
144
157
|
|
145
|
-
def resolve_variable_substitution(key, value, root_target)
|
158
|
+
def resolve_variable_substitution(key, value, root_target, previous_key = nil)
|
146
159
|
case value
|
147
160
|
when Array
|
148
161
|
return value.map { |v| resolve_variable_substitution(key, v, root_target) }
|
@@ -168,9 +181,20 @@ module Xcodeproj
|
|
168
181
|
when key
|
169
182
|
# to prevent infinite recursion
|
170
183
|
nil
|
184
|
+
when previous_key
|
185
|
+
# to prevent infinite recursion; we don't return nil as for the self recursion because it needs to be
|
186
|
+
# distinguished outside this method too
|
187
|
+
MUTUAL_RECURSION_SENTINEL
|
171
188
|
else
|
172
189
|
configuration_to_resolve_against = root_target ? root_target.build_configuration_list[name] : self
|
173
|
-
resolved_value_for_variable = configuration_to_resolve_against.resolve_build_setting(variable, root_target) || ''
|
190
|
+
resolved_value_for_variable = configuration_to_resolve_against.resolve_build_setting(variable, root_target, key) || ''
|
191
|
+
|
192
|
+
# we use this sentinel string instead of nil, because, otherwise, it would be swallowed by the default empty
|
193
|
+
# string from the preceding line, and we want to distinguish between mutual recursion and other cases
|
194
|
+
if resolved_value_for_variable == MUTUAL_RECURSION_SENTINEL
|
195
|
+
return MUTUAL_RECURSION_SENTINEL
|
196
|
+
end
|
197
|
+
|
174
198
|
value = value.gsub(variable_reference, resolved_value_for_variable)
|
175
199
|
resolve_variable_substitution(key, value, root_target)
|
176
200
|
end
|
@@ -191,14 +215,15 @@ module Xcodeproj
|
|
191
215
|
|
192
216
|
settings.keys.each do |key|
|
193
217
|
next unless value = settings[key]
|
218
|
+
stripped_key = key.sub(/\[[^\]]+\]$/, '')
|
194
219
|
case value
|
195
220
|
when String
|
196
|
-
next unless array_settings.include?(
|
221
|
+
next unless array_settings.include?(stripped_key)
|
197
222
|
array_value = split_build_setting_array_to_string(value)
|
198
223
|
next unless array_value.size > 1
|
199
224
|
settings[key] = array_value
|
200
225
|
when Array
|
201
|
-
next if value.size > 1 && array_settings.include?(
|
226
|
+
next if value.size > 1 && array_settings.include?(stripped_key)
|
202
227
|
settings[key] = value.join(' ')
|
203
228
|
end
|
204
229
|
end
|
@@ -301,6 +301,10 @@ module Xcodeproj
|
|
301
301
|
#
|
302
302
|
attribute :show_env_vars_in_log, String
|
303
303
|
|
304
|
+
# @return [String] the discovered dependency file to use.
|
305
|
+
#
|
306
|
+
attribute :dependency_file, String
|
307
|
+
|
304
308
|
# @return [Hash{String => Hash}] A hash suitable to display the build
|
305
309
|
# phase to the user.
|
306
310
|
#
|
@@ -56,6 +56,13 @@ module Xcodeproj
|
|
56
56
|
#
|
57
57
|
attribute :output_files_compiler_flags, Array
|
58
58
|
|
59
|
+
# @return [String] whether the rule should be run once per architecture.
|
60
|
+
#
|
61
|
+
# @example
|
62
|
+
# `0`.
|
63
|
+
#
|
64
|
+
attribute :run_once_per_architecture, String
|
65
|
+
|
59
66
|
# @return [String] the content of the script to use for the build rule.
|
60
67
|
#
|
61
68
|
# @note This attribute is present if the #{#compiler_spec} is
|
@@ -52,7 +52,9 @@ module Xcodeproj
|
|
52
52
|
prefix = 'lib'
|
53
53
|
end
|
54
54
|
extension = Constants::PRODUCT_UTI_EXTENSIONS[product_type]
|
55
|
-
|
55
|
+
path = "#{prefix}#{target_name}"
|
56
|
+
path += ".#{extension}" if extension
|
57
|
+
ref = new_reference(group, path, :built_products)
|
56
58
|
ref.include_in_index = '0'
|
57
59
|
ref.set_explicit_file_type
|
58
60
|
ref
|
@@ -148,7 +148,7 @@ module Xcodeproj
|
|
148
148
|
when '<group>'
|
149
149
|
object_parent = parent(object)
|
150
150
|
if object_parent.isa == 'PBXProject'.freeze
|
151
|
-
object.project.project_dir
|
151
|
+
object.project.project_dir + object.project.root_object.project_dir_path
|
152
152
|
else
|
153
153
|
real_path(object_parent)
|
154
154
|
end
|
@@ -42,7 +42,7 @@ module Xcodeproj
|
|
42
42
|
# the key of the build setting.
|
43
43
|
#
|
44
44
|
# @param [Bool] resolve_against_xcconfig
|
45
|
-
#
|
45
|
+
# whether the resolved setting should take in consideration any
|
46
46
|
# configuration file present.
|
47
47
|
#
|
48
48
|
# @return [Hash{String => String}] The value of the build setting
|
@@ -74,6 +74,10 @@ module Xcodeproj
|
|
74
74
|
# @param [String] key
|
75
75
|
# the key of the build setting.
|
76
76
|
#
|
77
|
+
# @param [Boolean] resolve_against_xcconfig
|
78
|
+
# whether the resolved setting should take in consideration any
|
79
|
+
# configuration file present.
|
80
|
+
#
|
77
81
|
# @raise If the build setting has multiple values.
|
78
82
|
#
|
79
83
|
# @note As it is common not to have a setting with no value for
|
@@ -83,8 +87,8 @@ module Xcodeproj
|
|
83
87
|
#
|
84
88
|
# @return [String] The value of the build setting.
|
85
89
|
#
|
86
|
-
def common_resolved_build_setting(key)
|
87
|
-
values = resolved_build_setting(key).values.compact.uniq
|
90
|
+
def common_resolved_build_setting(key, resolve_against_xcconfig: false)
|
91
|
+
values = resolved_build_setting(key, resolve_against_xcconfig).values.compact.uniq
|
88
92
|
if values.count <= 1
|
89
93
|
values.first
|
90
94
|
else
|
@@ -42,7 +42,7 @@ module Xcodeproj
|
|
42
42
|
|
43
43
|
# @return [Array<String>] the list of known regions.
|
44
44
|
#
|
45
|
-
attribute :known_regions, Array,
|
45
|
+
attribute :known_regions, Array, %w(en Base)
|
46
46
|
|
47
47
|
# @return [PBXGroup] the main group of the project. The one displayed
|
48
48
|
# by Xcode in the Project Navigator.
|
@@ -30,6 +30,10 @@ module Xcodeproj
|
|
30
30
|
#
|
31
31
|
attribute :platform_filter, String
|
32
32
|
|
33
|
+
# @return [String] the product reference for this target dependency.
|
34
|
+
#
|
35
|
+
attribute :product_ref, String
|
36
|
+
|
33
37
|
public
|
34
38
|
|
35
39
|
# @!group AbstractObject Hooks
|
@@ -69,6 +73,7 @@ module Xcodeproj
|
|
69
73
|
hash = {}
|
70
74
|
hash['displayName'] = display_name
|
71
75
|
hash['isa'] = isa
|
76
|
+
hash['targetProxy'] = target_proxy.to_tree_hash
|
72
77
|
hash
|
73
78
|
end
|
74
79
|
|
@@ -59,6 +59,20 @@ module Xcodeproj
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
# @param [Array<BuildAction::Entry>] entries
|
63
|
+
# Sets the list of BuildActionEntry nodes associated with this Build Action.
|
64
|
+
#
|
65
|
+
def entries=(entries)
|
66
|
+
@xml_element.delete_element('BuildActionEntries')
|
67
|
+
unless entries.empty?
|
68
|
+
entries_element = @xml_element.add_element('BuildActionEntries')
|
69
|
+
entries.each do |entry_node|
|
70
|
+
entries_element.add_element(entry_node.xml_element)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
entries
|
74
|
+
end
|
75
|
+
|
62
76
|
# @param [BuildAction::Entry] entry
|
63
77
|
# The BuildActionEntry to add to the list of targets to build for the various actions
|
64
78
|
#
|
@@ -185,6 +199,13 @@ module Xcodeproj
|
|
185
199
|
def add_buildable_reference(ref)
|
186
200
|
@xml_element.add_element(ref.xml_element)
|
187
201
|
end
|
202
|
+
|
203
|
+
# @param [BuildableReference] ref
|
204
|
+
# The BuildableReference to remove from the list of targets this entry will build
|
205
|
+
#
|
206
|
+
def remove_buildable_reference(ref)
|
207
|
+
@xml_element.delete_element(ref.xml_element)
|
208
|
+
end
|
188
209
|
end
|
189
210
|
end
|
190
211
|
end
|
@@ -143,6 +143,22 @@ module Xcodeproj
|
|
143
143
|
@xml_element.add_element(arguments.xml_element) if arguments
|
144
144
|
arguments
|
145
145
|
end
|
146
|
+
|
147
|
+
# @return [Array<MacroExpansion>]
|
148
|
+
# The list of MacroExpansion bound with this LaunchAction
|
149
|
+
#
|
150
|
+
def macro_expansions
|
151
|
+
@xml_element.get_elements('MacroExpansion').map do |node|
|
152
|
+
MacroExpansion.new(node)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# @param [MacroExpansion] macro_expansion
|
157
|
+
# Add a MacroExpansion to this LaunchAction
|
158
|
+
#
|
159
|
+
def add_macro_expansion(macro_expansion)
|
160
|
+
@xml_element.add_element(macro_expansion.xml_element)
|
161
|
+
end
|
146
162
|
end
|
147
163
|
end
|
148
164
|
end
|
@@ -58,7 +58,7 @@ module Xcodeproj
|
|
58
58
|
string_to_bool(@xml_element.attributes['codeCoverageEnabled'])
|
59
59
|
end
|
60
60
|
|
61
|
-
# @
|
61
|
+
# @param [Bool] flag
|
62
62
|
# Set whether Clang Code Coverage is enabled ('Gather coverage data' turned ON)
|
63
63
|
#
|
64
64
|
def code_coverage_enabled=(flag)
|
@@ -76,6 +76,18 @@ module Xcodeproj
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
+
# @param [Array<TestableReference>] testables
|
80
|
+
# Sets the list of TestableReference (test bundles) associated with this Test Action
|
81
|
+
#
|
82
|
+
def testables=(testables)
|
83
|
+
@xml_element.delete_element('Testables')
|
84
|
+
testables_element = @xml_element.add_element('Testables')
|
85
|
+
testables.each do |testable|
|
86
|
+
testables_element.add_element(testable.xml_element)
|
87
|
+
end
|
88
|
+
testables
|
89
|
+
end
|
90
|
+
|
79
91
|
# @param [TestableReference] testable
|
80
92
|
# Add a TestableReference (test bundle) to this Test Action
|
81
93
|
#
|
@@ -219,6 +231,13 @@ module Xcodeproj
|
|
219
231
|
@xml_element.add_element(ref.xml_element)
|
220
232
|
end
|
221
233
|
|
234
|
+
# @param [BuildableReference] ref
|
235
|
+
# The BuildableReference to remove from the list of targets this entry will build
|
236
|
+
#
|
237
|
+
def remove_buildable_reference(ref)
|
238
|
+
@xml_element.delete_element(ref.xml_element)
|
239
|
+
end
|
240
|
+
|
222
241
|
# @return [Array<Test>]
|
223
242
|
# The list of SkippedTest this action will skip.
|
224
243
|
#
|
data/lib/xcodeproj/workspace.rb
CHANGED
@@ -107,8 +107,9 @@ module Xcodeproj
|
|
107
107
|
else
|
108
108
|
raise ArgumentError, "Input to the << operator must be a file path or FileReference, got #{path_or_reference.inspect}"
|
109
109
|
end
|
110
|
-
|
111
|
-
|
110
|
+
unless file_references.any? { |ref| project_file_reference.eql? ref }
|
111
|
+
@document.root.add_element(project_file_reference.to_node)
|
112
|
+
end
|
112
113
|
load_schemes_from_project File.expand_path(projpath || project_file_reference.path)
|
113
114
|
end
|
114
115
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcodeproj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eloy Duran
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: atomos
|
@@ -183,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
183
|
- !ruby/object:Gem::Version
|
184
184
|
version: '0'
|
185
185
|
requirements: []
|
186
|
-
rubygems_version: 3.0.
|
186
|
+
rubygems_version: 3.0.4
|
187
187
|
signing_key:
|
188
188
|
specification_version: 3
|
189
189
|
summary: Create and modify Xcode projects from Ruby.
|