xcodeproj 0.10.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/xcodeproj/xcodeproj_ext.c +2 -0
- data/lib/xcodeproj/command.rb +4 -2
- data/lib/xcodeproj/command/show.rb +1 -1
- data/lib/xcodeproj/command/sort.rb +29 -0
- data/lib/xcodeproj/constants.rb +4 -8
- data/lib/xcodeproj/gem_version.rb +1 -1
- data/lib/xcodeproj/project.rb +19 -32
- data/lib/xcodeproj/project/object.rb +28 -1
- data/lib/xcodeproj/project/object/build_configuration.rb +20 -1
- data/lib/xcodeproj/project/object/build_phase.rb +42 -16
- data/lib/xcodeproj/project/object/configuration_list.rb +1 -1
- data/lib/xcodeproj/project/object/file_reference.rb +25 -0
- data/lib/xcodeproj/project/object/group.rb +77 -26
- data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +43 -16
- data/lib/xcodeproj/project/object/native_target.rb +84 -15
- data/lib/xcodeproj/project/object/target_dependency.rb +14 -0
- data/lib/xcodeproj/project/object_attributes.rb +8 -1
- data/lib/xcodeproj/project/object_list.rb +72 -11
- data/lib/xcodeproj/project/project_helper.rb +1 -50
- data/lib/xcodeproj/project/xcproj_helper.rb +1 -1
- data/lib/xcodeproj/workspace.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cf7c67e37553582eac9e119e155558e65ce2438
|
4
|
+
data.tar.gz: dd844950bbe7c28793d938ac2a9926d8721b8755
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79704df4aaa923f2b2938e9291b3acade4b46d60e15c7919626460c697cd814d3b8916860fbfed96338998a6ca94299874aee91a46ebd096506af8acf050d13a
|
7
|
+
data.tar.gz: 2ec745a65f34fdf8a3c103fb75ecc318c0746619e9a545bf05fe6eef4c0d2b1a7bbf836f085aa9f1ec4179397cb17cb4626ed3c4d5cdc12397e2d62ea7dab4a9
|
@@ -256,10 +256,12 @@ write_plist(VALUE self, VALUE hash, VALUE path) {
|
|
256
256
|
if (!success) {
|
257
257
|
CFShow(errorString);
|
258
258
|
}
|
259
|
+
CFWriteStreamClose(stream);
|
259
260
|
} else {
|
260
261
|
printf("Unable to open stream!\n");
|
261
262
|
}
|
262
263
|
|
264
|
+
CFRelease(stream);
|
263
265
|
CFRelease(dict);
|
264
266
|
return success ? Qtrue : Qfalse;
|
265
267
|
}
|
data/lib/xcodeproj/command.rb
CHANGED
@@ -6,6 +6,7 @@ module Xcodeproj
|
|
6
6
|
autoload :TargetDiff, 'xcodeproj/command/target_diff'
|
7
7
|
autoload :ProjectDiff, 'xcodeproj/command/project_diff'
|
8
8
|
autoload :Show, 'xcodeproj/command/show'
|
9
|
+
autoload :Sort, 'xcodeproj/command/sort'
|
9
10
|
|
10
11
|
class Help < StandardError
|
11
12
|
def initialize(command_class, argv, unrecognized_command = nil)
|
@@ -45,7 +46,7 @@ module Xcodeproj
|
|
45
46
|
end
|
46
47
|
|
47
48
|
def self.banner
|
48
|
-
commands = ['target-diff', 'project-diff', 'show']
|
49
|
+
commands = ['target-diff', 'project-diff', 'show', 'sort']
|
49
50
|
banner = "To see help for the available commands run:\n\n"
|
50
51
|
banner + commands.map { |cmd| " * $ xcodeproj #{cmd.green} --help" }.join("\n")
|
51
52
|
end
|
@@ -92,6 +93,7 @@ module Xcodeproj
|
|
92
93
|
when 'target-diff' then TargetDiff
|
93
94
|
when 'project-diff' then ProjectDiff
|
94
95
|
when 'show' then Show
|
96
|
+
when 'sort' then Sort
|
95
97
|
end
|
96
98
|
|
97
99
|
if command_class.nil?
|
@@ -127,7 +129,7 @@ module Xcodeproj
|
|
127
129
|
end
|
128
130
|
|
129
131
|
def xcodeproj
|
130
|
-
@xcodeproj ||= Project.
|
132
|
+
@xcodeproj ||= Project.open(xcodeproj_path)
|
131
133
|
end
|
132
134
|
end
|
133
135
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Xcodeproj
|
2
|
+
class Command
|
3
|
+
class Sort < Command
|
4
|
+
def self.banner
|
5
|
+
%{Sorts the give project
|
6
|
+
|
7
|
+
$ sort [PROJECT]
|
8
|
+
|
9
|
+
If no `PROJECT' is specified then the current work directory is searched
|
10
|
+
for one.}
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(argv)
|
14
|
+
xcodeproj_path = argv.shift_argument
|
15
|
+
@xcodeproj_path = File.expand_path(xcodeproj_path) if xcodeproj_path
|
16
|
+
super unless argv.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
xcodeproj.sort
|
21
|
+
xcodeproj.save
|
22
|
+
puts "The `#{File.basename(xcodeproj_path)}` project was sorted"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
data/lib/xcodeproj/constants.rb
CHANGED
@@ -22,7 +22,7 @@ module Xcodeproj
|
|
22
22
|
|
23
23
|
# @return [String] The last known object version to Xcodeproj.
|
24
24
|
#
|
25
|
-
LAST_UPGRADE_CHECK = '
|
25
|
+
LAST_UPGRADE_CHECK = '0500'
|
26
26
|
|
27
27
|
# @return [Hash] The all the known ISAs grouped by superclass.
|
28
28
|
#
|
@@ -83,6 +83,7 @@ module Xcodeproj
|
|
83
83
|
'sh' => 'text.script.sh',
|
84
84
|
'plist' => 'text.plist.xml',
|
85
85
|
'markdown' => 'text',
|
86
|
+
'xcassets' => 'folder.assetcatalog'
|
86
87
|
}.freeze
|
87
88
|
|
88
89
|
# @return [Hash] The uniform type identifier of various product types.
|
@@ -117,21 +118,17 @@ module Xcodeproj
|
|
117
118
|
'GCC_SYMBOLS_PRIVATE_EXTERN' => 'NO',
|
118
119
|
'GCC_OPTIMIZATION_LEVEL' => '0',
|
119
120
|
'COPY_PHASE_STRIP' => 'NO',
|
120
|
-
# TODO: enable after Xcode 4
|
121
|
-
# 'ONLY_ACTIVE_ARCH' => 'YES',
|
122
121
|
}.freeze,
|
123
122
|
:release => {
|
124
123
|
'OTHER_CFLAGS' => ['-DNS_BLOCK_ASSERTIONS=1', "$(inherited)"],
|
125
124
|
'OTHER_CPLUSPLUSFLAGS' => ['-DNS_BLOCK_ASSERTIONS=1', "$(inherited)"],
|
126
125
|
}.freeze,
|
127
126
|
:ios => {
|
128
|
-
'ARCHS' => "$(ARCHS_STANDARD_32_BIT)",
|
129
127
|
'IPHONEOS_DEPLOYMENT_TARGET' => '4.3',
|
130
128
|
'PUBLIC_HEADERS_FOLDER_PATH' => "$(TARGET_NAME)",
|
131
129
|
'SDKROOT' => 'iphoneos',
|
132
130
|
}.freeze,
|
133
131
|
:osx => {
|
134
|
-
'ARCHS' => "$(ARCHS_STANDARD_64_BIT)",
|
135
132
|
'GCC_ENABLE_OBJC_EXCEPTIONS' => 'YES',
|
136
133
|
'GCC_VERSION' => 'com.apple.compilers.llvm.clang.1_0',
|
137
134
|
'MACOSX_DEPLOYMENT_TARGET' => '10.7',
|
@@ -139,7 +136,7 @@ module Xcodeproj
|
|
139
136
|
'COMBINE_HIDPI_IMAGES' => 'YES',
|
140
137
|
}.freeze,
|
141
138
|
[:osx, :debug] => {
|
142
|
-
|
139
|
+
# Empty?
|
143
140
|
}.freeze,
|
144
141
|
[:osx, :release] => {
|
145
142
|
'DEBUG_INFORMATION_FORMAT' => 'dwarf-with-dsym',
|
@@ -158,8 +155,7 @@ module Xcodeproj
|
|
158
155
|
:release => {
|
159
156
|
}.freeze,
|
160
157
|
:debug => {
|
161
|
-
|
162
|
-
# 'ONLY_ACTIVE_ARCH' => 'YES',
|
158
|
+
'ONLY_ACTIVE_ARCH' => 'YES',
|
163
159
|
}.freeze,
|
164
160
|
}.freeze
|
165
161
|
|
data/lib/xcodeproj/project.rb
CHANGED
@@ -334,11 +334,11 @@ module Xcodeproj
|
|
334
334
|
File.open(filename, 'wb') { |file| file.write(output) }
|
335
335
|
end
|
336
336
|
|
337
|
-
#-------------------------------------------------------------------------#
|
338
337
|
|
339
338
|
public
|
340
339
|
|
341
340
|
# @!group Creating objects
|
341
|
+
#-------------------------------------------------------------------------#
|
342
342
|
|
343
343
|
# Creates a new object with a suitable UUID.
|
344
344
|
#
|
@@ -408,11 +408,11 @@ module Xcodeproj
|
|
408
408
|
@available_uuids += uniques
|
409
409
|
end
|
410
410
|
|
411
|
-
#-------------------------------------------------------------------------#
|
412
411
|
|
413
412
|
public
|
414
413
|
|
415
414
|
# @!group Convenience accessors
|
415
|
+
#-------------------------------------------------------------------------#
|
416
416
|
|
417
417
|
# @return [Array<AbstractObject>] all the objects of the project.
|
418
418
|
#
|
@@ -491,7 +491,7 @@ module Xcodeproj
|
|
491
491
|
# @return [PBXGroup] the `Frameworks` group creating it if necessary.
|
492
492
|
#
|
493
493
|
def frameworks_group
|
494
|
-
main_group['Frameworks'] || new_group('Frameworks')
|
494
|
+
main_group['Frameworks'] || main_group.new_group('Frameworks')
|
495
495
|
end
|
496
496
|
|
497
497
|
# @return [ObjectList<XCBuildConfiguration>] A list of project wide
|
@@ -513,11 +513,11 @@ module Xcodeproj
|
|
513
513
|
root_object.build_configuration_list.build_settings(name)
|
514
514
|
end
|
515
515
|
|
516
|
-
#-------------------------------------------------------------------------#
|
517
516
|
|
518
517
|
public
|
519
518
|
|
520
|
-
# @!group Helpers
|
519
|
+
# @!group Helpers
|
520
|
+
#-------------------------------------------------------------------------#
|
521
521
|
|
522
522
|
# Creates a new file reference in the main group.
|
523
523
|
#
|
@@ -539,32 +539,6 @@ module Xcodeproj
|
|
539
539
|
main_group.new_group(name, path, source_tree)
|
540
540
|
end
|
541
541
|
|
542
|
-
# Adds a file reference for a system framework to the project if needed and
|
543
|
-
# adds it to the {PBXFrameworksBuildPhase} of the given target.
|
544
|
-
#
|
545
|
-
# @example Adding QuartzCore
|
546
|
-
#
|
547
|
-
# framework = project.add_system_framework('QuartzCore', :ios)
|
548
|
-
#
|
549
|
-
# target = project.targets.first
|
550
|
-
# build_phase = target.frameworks_build_phases.first
|
551
|
-
# build_phase.files << framework.buildFiles.new
|
552
|
-
#
|
553
|
-
# @param [String] name
|
554
|
-
# The name of a framework.
|
555
|
-
#
|
556
|
-
# @param [PBXNativeTarget] target
|
557
|
-
# The target to which to add the framework.
|
558
|
-
#
|
559
|
-
# @note This method adds a reference to the highest know SDK for the
|
560
|
-
# given platform.
|
561
|
-
#
|
562
|
-
# @return [PBXFileReference] The file reference of the framework.
|
563
|
-
#
|
564
|
-
def add_system_framework(name, target)
|
565
|
-
ProjectHelper.add_system_framework(self, name, target)
|
566
|
-
end
|
567
|
-
|
568
542
|
# Creates a new target and adds it to the project.
|
569
543
|
#
|
570
544
|
# The target is configured for the given platform and its file reference it
|
@@ -637,7 +611,20 @@ module Xcodeproj
|
|
637
611
|
end
|
638
612
|
end
|
639
613
|
|
614
|
+
# Sorts the project.
|
615
|
+
#
|
616
|
+
# @return [void]
|
617
|
+
#
|
618
|
+
def sort
|
619
|
+
root_object.sort_recursively
|
620
|
+
end
|
621
|
+
|
622
|
+
|
623
|
+
public
|
624
|
+
|
625
|
+
# @!group Helpers
|
640
626
|
#-------------------------------------------------------------------------#
|
627
|
+
|
641
628
|
# Get list of shared schemes in project
|
642
629
|
#
|
643
630
|
# @param [String] path
|
@@ -645,7 +632,7 @@ module Xcodeproj
|
|
645
632
|
#
|
646
633
|
# @return [Array]
|
647
634
|
#
|
648
|
-
def self.schemes
|
635
|
+
def self.schemes(project_path)
|
649
636
|
schemes = Dir[File.join(project_path, 'xcshareddata', 'xcschemes', '*.xcscheme')].map do |scheme|
|
650
637
|
File.basename(scheme, '.xcscheme')
|
651
638
|
end
|
@@ -131,9 +131,36 @@ module Xcodeproj
|
|
131
131
|
isa.gsub(/^(PBX|XC)/, '')
|
132
132
|
end
|
133
133
|
end
|
134
|
-
|
135
134
|
alias :to_s :display_name
|
136
135
|
|
136
|
+
# Sorts the to many attributes of the object according to the display
|
137
|
+
# name.
|
138
|
+
#
|
139
|
+
def sort
|
140
|
+
to_many_attributes.each do |attrb|
|
141
|
+
list = attrb.get_value(self)
|
142
|
+
list.sort! do |x, y|
|
143
|
+
x.display_name <=> y.display_name
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Sorts the object and the objects that it references.
|
149
|
+
#
|
150
|
+
def sort_recursively
|
151
|
+
to_one_attributes.each do |attrb|
|
152
|
+
value = attrb.get_value(self)
|
153
|
+
value.sort_recursively if value
|
154
|
+
end
|
155
|
+
|
156
|
+
to_many_attributes.each do |attrb|
|
157
|
+
list = attrb.get_value(self)
|
158
|
+
list.each(&:sort_recursively)
|
159
|
+
end
|
160
|
+
|
161
|
+
sort
|
162
|
+
end
|
163
|
+
|
137
164
|
# @!group Reference counting
|
138
165
|
|
139
166
|
# @return [Array<ObjectList>] The list of the objects that have a
|
@@ -23,11 +23,11 @@ module Xcodeproj
|
|
23
23
|
#
|
24
24
|
has_one :base_configuration_reference, PBXFileReference
|
25
25
|
|
26
|
-
#---------------------------------------------------------------------#
|
27
26
|
|
28
27
|
public
|
29
28
|
|
30
29
|
# @!group AbstractObject Hooks
|
30
|
+
#---------------------------------------------------------------------#
|
31
31
|
|
32
32
|
# @return [Hash{String => Hash}] A hash suitable to display the object
|
33
33
|
# to the user.
|
@@ -41,6 +41,25 @@ module Xcodeproj
|
|
41
41
|
{ name => data }
|
42
42
|
end
|
43
43
|
|
44
|
+
|
45
|
+
public
|
46
|
+
|
47
|
+
# @!group Helpers
|
48
|
+
# --------------------------------------------------------------------#
|
49
|
+
|
50
|
+
# Sorts the build settings. Valid only in Ruby > 1.9.2 because in
|
51
|
+
# previous versions the hash are not sorted.
|
52
|
+
#
|
53
|
+
# @return [void]
|
54
|
+
#
|
55
|
+
def sort
|
56
|
+
sorted = {}
|
57
|
+
build_settings.keys.sort.each do |key|
|
58
|
+
sorted[key] = build_settings[key]
|
59
|
+
end
|
60
|
+
self.build_settings = sorted
|
61
|
+
end
|
62
|
+
|
44
63
|
#---------------------------------------------------------------------#
|
45
64
|
|
46
65
|
end
|
@@ -48,37 +48,62 @@ module Xcodeproj
|
|
48
48
|
# referenced by this build phase.
|
49
49
|
#
|
50
50
|
def files_references
|
51
|
-
files.map { |bf| bf.file_ref }
|
51
|
+
files.map { |bf| bf.file_ref }
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Array<String>] The display name of the build files.
|
55
|
+
#
|
56
|
+
def file_display_names
|
57
|
+
files.map(&:display_name)
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [PBXBuildFile] the first build file associated with the given
|
61
|
+
# file reference if one exists.
|
62
|
+
#
|
63
|
+
def build_file(file_ref)
|
64
|
+
(file_ref.referrers & files).first
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns whether a build file for the given file reference exists.
|
68
|
+
#
|
69
|
+
# @param [PBXFileReference] file_ref
|
70
|
+
#
|
71
|
+
# @return [Bool] whether the reference is already present.
|
72
|
+
#
|
73
|
+
def include?(file_ref)
|
74
|
+
!build_file(file_ref).nil?
|
52
75
|
end
|
53
76
|
|
54
77
|
# Adds a new build file, initialized with the given file reference, to
|
55
78
|
# the phase.
|
56
79
|
#
|
57
|
-
# @param [PBXFileReference]
|
58
|
-
#
|
80
|
+
# @param [PBXFileReference] file_ref
|
81
|
+
# The file reference that should be added to the build phase.
|
59
82
|
#
|
60
83
|
# @return [PBXBuildFile] the build file generated.
|
61
84
|
#
|
62
|
-
def add_file_reference(
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
85
|
+
def add_file_reference(file_ref, avoid_duplicates = false)
|
86
|
+
if avoid_duplicates && existing = build_file(file_ref)
|
87
|
+
existing
|
88
|
+
else
|
89
|
+
build_file = project.new(PBXBuildFile)
|
90
|
+
build_file.file_ref = file_ref
|
91
|
+
files << build_file
|
92
|
+
build_file
|
93
|
+
end
|
67
94
|
end
|
68
95
|
|
69
96
|
# Removes the build file associated with the given file reference from
|
70
97
|
# the phase.
|
71
98
|
#
|
72
|
-
# @param [PBXFileReference]
|
99
|
+
# @param [PBXFileReference] file_ref
|
100
|
+
# The file to remove
|
73
101
|
#
|
74
102
|
# @return [void]
|
75
103
|
#
|
76
|
-
def remove_file_reference(
|
77
|
-
build_file = files.find { |bf| bf.file_ref ==
|
78
|
-
if build_file
|
79
|
-
build_file.file_ref = nil
|
80
|
-
build_file.remove_from_project
|
81
|
-
end
|
104
|
+
def remove_file_reference(file_ref)
|
105
|
+
build_file = files.find { |bf| bf.file_ref == file_ref }
|
106
|
+
remove_build_file(build_file) if build_file
|
82
107
|
end
|
83
108
|
|
84
109
|
# Removes a build file from the phase and clears its relationship to
|
@@ -98,11 +123,12 @@ module Xcodeproj
|
|
98
123
|
#
|
99
124
|
# @return [void]
|
100
125
|
#
|
101
|
-
def
|
126
|
+
def clear
|
102
127
|
files.objects.each do |bf|
|
103
128
|
remove_build_file(bf)
|
104
129
|
end
|
105
130
|
end
|
131
|
+
alias :clear_build_files :clear
|
106
132
|
|
107
133
|
end
|
108
134
|
|
@@ -26,11 +26,11 @@ module Xcodeproj
|
|
26
26
|
#
|
27
27
|
has_many :build_configurations, XCBuildConfiguration
|
28
28
|
|
29
|
-
#---------------------------------------------------------------------#
|
30
29
|
|
31
30
|
public
|
32
31
|
|
33
32
|
# @!group Helpers
|
33
|
+
# --------------------------------------------------------------------#
|
34
34
|
|
35
35
|
# Returns the build configuration with the given name.
|
36
36
|
#
|
@@ -158,6 +158,31 @@ module Xcodeproj
|
|
158
158
|
GroupableHelper.real_path(self)
|
159
159
|
end
|
160
160
|
|
161
|
+
# Sets the source tree of the reference.
|
162
|
+
#
|
163
|
+
# @param [Symbol, String] source_tree
|
164
|
+
# The source tree, either a string or a symbol.
|
165
|
+
#
|
166
|
+
# @return [void]
|
167
|
+
#
|
168
|
+
def set_source_tree(source_tree)
|
169
|
+
GroupableHelper.set_source_tree(self, source_tree)
|
170
|
+
end
|
171
|
+
|
172
|
+
# Allows to set the path according to the source tree of the reference.
|
173
|
+
#
|
174
|
+
# @param [#to_s] the path for the reference.
|
175
|
+
#
|
176
|
+
# @return [void]
|
177
|
+
#
|
178
|
+
def set_path(path)
|
179
|
+
if path
|
180
|
+
GroupableHelper.set_path_with_source_tree(self, path, source_tree)
|
181
|
+
else
|
182
|
+
self.path = nil
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
161
186
|
# @return [Array<PBXBuildFile>] the build files associated with the
|
162
187
|
# current file reference.
|
163
188
|
#
|
@@ -78,24 +78,11 @@ module Xcodeproj
|
|
78
78
|
#
|
79
79
|
attribute :comments, String
|
80
80
|
|
81
|
-
#---------------------------------------------------------------------#
|
82
81
|
|
83
82
|
public
|
84
83
|
|
85
84
|
# @!group Helpers
|
86
|
-
|
87
|
-
# @return [String] the name of the group taking into account the path
|
88
|
-
# or other factors if needed.
|
89
|
-
#
|
90
|
-
def display_name
|
91
|
-
if name
|
92
|
-
name
|
93
|
-
elsif path
|
94
|
-
File.basename(path)
|
95
|
-
elsif self.equal?(project.main_group)
|
96
|
-
'Main Group'
|
97
|
-
end
|
98
|
-
end
|
85
|
+
#---------------------------------------------------------------------#
|
99
86
|
|
100
87
|
# @return [PBXGroup, PBXProject] The parent of the group.
|
101
88
|
#
|
@@ -127,13 +114,47 @@ module Xcodeproj
|
|
127
114
|
GroupableHelper.real_path(self)
|
128
115
|
end
|
129
116
|
|
130
|
-
#
|
117
|
+
# Sets the source tree of the group.
|
118
|
+
#
|
119
|
+
# @param [Symbol, String] source_tree
|
120
|
+
# The source tree, either a string or a symbol.
|
121
|
+
#
|
122
|
+
# @return [void]
|
123
|
+
#
|
124
|
+
def set_source_tree(source_tree)
|
125
|
+
GroupableHelper.set_source_tree(self, source_tree)
|
126
|
+
end
|
127
|
+
|
128
|
+
# Allows to set the path according to the source tree of the group.
|
129
|
+
#
|
130
|
+
# @param [#to_s] the path for the group.
|
131
|
+
#
|
132
|
+
# @return [void]
|
133
|
+
#
|
134
|
+
def set_path(path)
|
135
|
+
if path
|
136
|
+
source_tree
|
137
|
+
GroupableHelper.set_path_with_source_tree(self, path, source_tree)
|
138
|
+
else
|
139
|
+
self.path = nil
|
140
|
+
self.source_tree = '<group>'
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# @return [Array<PBXFileReference>] the file references in the group
|
131
145
|
# children.
|
132
146
|
#
|
133
147
|
def files
|
134
148
|
children.select { |obj| obj.class == PBXFileReference }
|
135
149
|
end
|
136
150
|
|
151
|
+
# @return [PBXFileReference] The file references whose path (regardless
|
152
|
+
# of the source tree) matches the give path.
|
153
|
+
#
|
154
|
+
def find_file_by_path(path)
|
155
|
+
files.find { |ref| ref.path == path }
|
156
|
+
end
|
157
|
+
|
137
158
|
# @return [Array<PBXGroup>] the groups in the group children.
|
138
159
|
#
|
139
160
|
def groups
|
@@ -219,11 +240,8 @@ module Xcodeproj
|
|
219
240
|
group = project.new(PBXGroup)
|
220
241
|
children << group
|
221
242
|
group.name = name
|
222
|
-
|
223
|
-
|
224
|
-
else
|
225
|
-
group.source_tree = '<group>'
|
226
|
-
end
|
243
|
+
group.set_source_tree(source_tree)
|
244
|
+
group.set_path(path)
|
227
245
|
group
|
228
246
|
end
|
229
247
|
|
@@ -238,11 +256,10 @@ module Xcodeproj
|
|
238
256
|
|
239
257
|
# Removes children files and groups under this group.
|
240
258
|
#
|
241
|
-
|
242
|
-
#
|
243
|
-
def remove_children_recursively
|
259
|
+
def clear
|
244
260
|
children.objects.each(&:remove_from_project)
|
245
261
|
end
|
262
|
+
alias :remove_children_recursively :clear
|
246
263
|
|
247
264
|
# Traverses the children groups and finds the children with the given
|
248
265
|
# path, optionally, creating any needed group. If the given path is
|
@@ -303,12 +320,20 @@ module Xcodeproj
|
|
303
320
|
#
|
304
321
|
def sort_by_type
|
305
322
|
children.sort! do |x, y|
|
306
|
-
if x.
|
323
|
+
if x.isa == 'PBXGroup' && !(y.isa == 'PBXGroup')
|
307
324
|
-1
|
308
|
-
elsif x.
|
325
|
+
elsif !(x.isa == 'PBXGroup') && y.isa == 'PBXGroup'
|
309
326
|
1
|
327
|
+
elsif x.display_name && y.display_name
|
328
|
+
extname_x = File.extname(x.display_name)
|
329
|
+
extname_y = File.extname(y.display_name)
|
330
|
+
if extname_x != extname_y
|
331
|
+
extname_x <=> extname_y
|
332
|
+
else
|
333
|
+
File.basename(x.display_name, ".*" ) <=> File.basename(y.display_name, ".*" )
|
334
|
+
end
|
310
335
|
else
|
311
|
-
|
336
|
+
0
|
312
337
|
end
|
313
338
|
end
|
314
339
|
end
|
@@ -321,6 +346,32 @@ module Xcodeproj
|
|
321
346
|
groups.each { |group| group.recursively_sort_by_type }
|
322
347
|
sort_by_type
|
323
348
|
end
|
349
|
+
|
350
|
+
|
351
|
+
public
|
352
|
+
|
353
|
+
# @!group AbstractObject Hooks
|
354
|
+
#---------------------------------------------------------------------#
|
355
|
+
|
356
|
+
# @return [String] the name of the group taking into account the path
|
357
|
+
# or other factors if needed.
|
358
|
+
#
|
359
|
+
def display_name
|
360
|
+
if name
|
361
|
+
name
|
362
|
+
elsif path
|
363
|
+
File.basename(path)
|
364
|
+
elsif self.equal?(project.main_group)
|
365
|
+
'Main Group'
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
# Sorts the to many attributes of the object according to the display
|
370
|
+
# name.
|
371
|
+
#
|
372
|
+
def sort
|
373
|
+
sort_by_type
|
374
|
+
end
|
324
375
|
end
|
325
376
|
|
326
377
|
#-----------------------------------------------------------------------#
|
@@ -108,11 +108,10 @@ module Xcodeproj
|
|
108
108
|
end
|
109
109
|
when 'SOURCE_ROOT'
|
110
110
|
object.project.path.dirname
|
111
|
-
when '<absolute>'
|
111
|
+
when '<absolute>'
|
112
112
|
nil
|
113
113
|
else
|
114
|
-
|
115
|
-
" `#{object.display_name}`: `#{object.source_tree}`"
|
114
|
+
Pathname.new("${#{object.source_tree}}")
|
116
115
|
end
|
117
116
|
end
|
118
117
|
|
@@ -128,6 +127,19 @@ module Xcodeproj
|
|
128
127
|
:sdk_root => 'SDKROOT',
|
129
128
|
}.freeze
|
130
129
|
|
130
|
+
# Sets the source tree of the given object.
|
131
|
+
#
|
132
|
+
# @param [Symbol, String] source_tree
|
133
|
+
# The source tree, either a string or a key for
|
134
|
+
# {SOURCE_TREES_BY_KEY}.
|
135
|
+
#
|
136
|
+
# @return [void]
|
137
|
+
#
|
138
|
+
def set_source_tree(object, source_tree)
|
139
|
+
source_tree = normalize_source_tree(source_tree)
|
140
|
+
object.source_tree = source_tree
|
141
|
+
end
|
142
|
+
|
131
143
|
# Sets the path of the given object according to the provided source
|
132
144
|
# tree key. The path is converted to relative according to the real
|
133
145
|
# path of the source tree for group and project source trees, if both
|
@@ -140,28 +152,24 @@ module Xcodeproj
|
|
140
152
|
# @param [#to_s] path
|
141
153
|
# The path.
|
142
154
|
#
|
143
|
-
# @param [Symbol]
|
144
|
-
# The source tree
|
145
|
-
#
|
155
|
+
# @param [Symbol, String] source_tree
|
156
|
+
# The source tree, either a string or a key for
|
157
|
+
# {SOURCE_TREES_BY_KEY}.
|
146
158
|
#
|
147
159
|
# @return [void]
|
148
160
|
#
|
149
|
-
def set_path_with_source_tree(object, path,
|
161
|
+
def set_path_with_source_tree(object, path, source_tree)
|
150
162
|
path = Pathname.new(path)
|
151
|
-
source_tree =
|
163
|
+
source_tree = normalize_source_tree(source_tree)
|
152
164
|
object.source_tree = source_tree
|
153
165
|
|
154
|
-
|
155
|
-
raise "[Xcodeproj] Unrecognized source tree option `#{source_tree_key}` for path `#{path}`"
|
156
|
-
end
|
157
|
-
|
158
|
-
if source_tree_key == :absolute
|
166
|
+
if source_tree == SOURCE_TREES_BY_KEY[:absolute]
|
159
167
|
unless path.absolute?
|
160
168
|
raise "[Xcodeproj] Attempt to set a relative path with an " \
|
161
169
|
"absolute source tree: `#{path}`"
|
162
170
|
end
|
163
171
|
object.path = path.to_s
|
164
|
-
elsif
|
172
|
+
elsif source_tree == SOURCE_TREES_BY_KEY[:group] || source_tree == SOURCE_TREES_BY_KEY[:project]
|
165
173
|
source_tree_real_path = GroupableHelper.source_tree_real_path(object)
|
166
174
|
if source_tree_real_path && source_tree_real_path.absolute? == path.absolute?
|
167
175
|
relative_path = path.relative_path_from(source_tree_real_path)
|
@@ -185,7 +193,7 @@ module Xcodeproj
|
|
185
193
|
# @return [void]
|
186
194
|
#
|
187
195
|
def check_parents_integrity(object)
|
188
|
-
referrers_count = object.referrers.count
|
196
|
+
referrers_count = object.referrers.uniq.count
|
189
197
|
if referrers_count > 1
|
190
198
|
referrers_count = object.referrers.select{ |obj| obj.isa == 'PBXGroup' }.count
|
191
199
|
end
|
@@ -193,7 +201,7 @@ module Xcodeproj
|
|
193
201
|
if referrers_count == 0
|
194
202
|
raise "[Xcodeproj] Consistency issue: no parent " \
|
195
203
|
"for object `#{object.display_name}`: "\
|
196
|
-
"
|
204
|
+
"`#{object.referrers.join('`, `')}`"
|
197
205
|
elsif referrers_count > 1
|
198
206
|
raise "[Xcodeproj] Consistency issue: unexpected multiple parents " \
|
199
207
|
"for object `#{object.display_name}`: "\
|
@@ -201,6 +209,25 @@ module Xcodeproj
|
|
201
209
|
end
|
202
210
|
end
|
203
211
|
|
212
|
+
# Converts the given source tree to its string value.
|
213
|
+
#
|
214
|
+
# @param [Symbol, String] source_tree
|
215
|
+
# The source tree, either a string or a key for
|
216
|
+
# {SOURCE_TREES_BY_KEY}.
|
217
|
+
#
|
218
|
+
# @return [String] the string value of the source tree.
|
219
|
+
#
|
220
|
+
def normalize_source_tree(source_tree)
|
221
|
+
if source_tree.is_a?(Symbol)
|
222
|
+
source_tree = SOURCE_TREES_BY_KEY[source_tree]
|
223
|
+
end
|
224
|
+
|
225
|
+
unless SOURCE_TREES_BY_KEY.values.include?(source_tree)
|
226
|
+
raise "[Xcodeproj] Unrecognized source tree option `#{source_tree}`"
|
227
|
+
end
|
228
|
+
source_tree
|
229
|
+
end
|
230
|
+
|
204
231
|
#-------------------------------------------------------------------#
|
205
232
|
|
206
233
|
end
|
@@ -26,15 +26,16 @@ module Xcodeproj
|
|
26
26
|
#
|
27
27
|
has_one :build_configuration_list, XCConfigurationList
|
28
28
|
|
29
|
-
# @return [
|
29
|
+
# @return [ObjectList<PBXTargetDependency>] the targets necessary to
|
30
|
+
# build this target.
|
30
31
|
#
|
31
32
|
has_many :dependencies, PBXTargetDependency
|
32
33
|
|
33
|
-
#--------------------------------------#
|
34
34
|
|
35
35
|
public
|
36
36
|
|
37
37
|
# @!group Helpers
|
38
|
+
#--------------------------------------#
|
38
39
|
|
39
40
|
# @return [String] the SDK that the target should use.
|
40
41
|
#
|
@@ -137,17 +138,19 @@ module Xcodeproj
|
|
137
138
|
# @return [void]
|
138
139
|
#
|
139
140
|
def add_dependency(target)
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
141
|
+
unless dependencies.map(&:target).include?(target)
|
142
|
+
container_proxy = project.new(Xcodeproj::Project::PBXContainerItemProxy)
|
143
|
+
container_proxy.container_portal = project.root_object.uuid
|
144
|
+
container_proxy.proxy_type = '1'
|
145
|
+
container_proxy.remote_global_id_string = target.uuid
|
146
|
+
container_proxy.remote_info = target.name
|
147
|
+
|
148
|
+
dependency = project.new(Xcodeproj::Project::PBXTargetDependency)
|
149
|
+
dependency.target = target
|
150
|
+
dependency.target_proxy = container_proxy
|
151
|
+
|
152
|
+
dependencies << dependency
|
153
|
+
end
|
151
154
|
end
|
152
155
|
|
153
156
|
# Creates a new copy files build phase.
|
@@ -177,11 +180,56 @@ module Xcodeproj
|
|
177
180
|
phase
|
178
181
|
end
|
179
182
|
|
183
|
+
|
184
|
+
public
|
185
|
+
|
186
|
+
# @!group System frameworks
|
180
187
|
#--------------------------------------#
|
181
188
|
|
189
|
+
# Adds a file reference for one or more system framework to the project
|
190
|
+
# if needed and adds them to the Frameworks build phases.
|
191
|
+
#
|
192
|
+
# @param [Array<String>, String] name
|
193
|
+
# The name or the list of the names of the framework.
|
194
|
+
#
|
195
|
+
# @return [void]
|
196
|
+
#
|
197
|
+
def add_system_framework(names)
|
198
|
+
Array(names).each do |name|
|
199
|
+
path = "System/Library/Frameworks/#{name}.framework"
|
200
|
+
unless ref = project.frameworks_group.find_file_by_path(path)
|
201
|
+
ref = project.frameworks_group.new_file(path, :sdk_root)
|
202
|
+
end
|
203
|
+
frameworks_build_phase.add_file_reference(ref, true)
|
204
|
+
ref
|
205
|
+
end
|
206
|
+
end
|
207
|
+
alias :add_system_frameworks :add_system_framework
|
208
|
+
|
209
|
+
# Adds a file reference for one or more system libraries to the project
|
210
|
+
# if needed and adds them to the Frameworks build phases.
|
211
|
+
#
|
212
|
+
# @param [Array<String>, String] name
|
213
|
+
# The name or the list of the names of the libraries.
|
214
|
+
#
|
215
|
+
# @return [void]
|
216
|
+
#
|
217
|
+
def add_system_library(names)
|
218
|
+
Array(names).each do |name|
|
219
|
+
path = "usr/lib/lib#{name}.dylib"
|
220
|
+
unless ref = project.frameworks_group.files.find { |ref| ref.path == path }
|
221
|
+
ref = project.frameworks_group.new_file(path, :sdk_root)
|
222
|
+
end
|
223
|
+
frameworks_build_phase.add_file_reference(ref, true)
|
224
|
+
ref
|
225
|
+
end
|
226
|
+
end
|
227
|
+
alias :add_system_libraries :add_system_library
|
228
|
+
|
182
229
|
public
|
183
230
|
|
184
231
|
# @!group AbstractObject Hooks
|
232
|
+
#--------------------------------------#
|
185
233
|
|
186
234
|
# @return [Hash{String => Hash}] A hash suitable to display the object
|
187
235
|
# to the user.
|
@@ -221,7 +269,8 @@ module Xcodeproj
|
|
221
269
|
#
|
222
270
|
attribute :product_install_path, String
|
223
271
|
|
224
|
-
# @return [
|
272
|
+
# @return [ObjectList<AbstractBuildPhase>] the build phases of the
|
273
|
+
# target.
|
225
274
|
#
|
226
275
|
# @note Apparently only PBXCopyFilesBuildPhase and
|
227
276
|
# PBXShellScriptBuildPhase can appear multiple times in a
|
@@ -229,11 +278,11 @@ module Xcodeproj
|
|
229
278
|
#
|
230
279
|
has_many :build_phases, AbstractBuildPhase
|
231
280
|
|
232
|
-
#--------------------------------------#
|
233
281
|
|
234
282
|
public
|
235
283
|
|
236
284
|
# @!group Helpers
|
285
|
+
#--------------------------------------#
|
237
286
|
|
238
287
|
# Adds source files to the target.
|
239
288
|
#
|
@@ -349,6 +398,26 @@ module Xcodeproj
|
|
349
398
|
phase
|
350
399
|
end
|
351
400
|
|
401
|
+
|
402
|
+
public
|
403
|
+
|
404
|
+
# @!group AbstractObject Hooks
|
405
|
+
#--------------------------------------#
|
406
|
+
|
407
|
+
# Sorts the to many attributes of the object according to the display
|
408
|
+
# name.
|
409
|
+
#
|
410
|
+
# Build phases are not sorted as they order is relevant.
|
411
|
+
#
|
412
|
+
def sort
|
413
|
+
attributes_to_sort = to_many_attributes.reject { |attr| attr.name == :build_phases }
|
414
|
+
attributes_to_sort.each do |attrb|
|
415
|
+
list = attrb.get_value(self)
|
416
|
+
list.sort! do |x, y|
|
417
|
+
x.display_name <=> y.display_name
|
418
|
+
end
|
419
|
+
end
|
420
|
+
end
|
352
421
|
end
|
353
422
|
|
354
423
|
#-----------------------------------------------------------------------#
|
@@ -27,6 +27,20 @@ module Xcodeproj
|
|
27
27
|
# target from a nested Xcode project.
|
28
28
|
#
|
29
29
|
attribute :name, String
|
30
|
+
|
31
|
+
|
32
|
+
public
|
33
|
+
|
34
|
+
# @!group AbstractObject Hooks
|
35
|
+
#--------------------------------------#
|
36
|
+
|
37
|
+
# @return [String] The name of the dependency.
|
38
|
+
#
|
39
|
+
def display_name
|
40
|
+
return name if name
|
41
|
+
return target.name if target
|
42
|
+
return target_proxy.remote_info if target_proxy
|
43
|
+
end
|
30
44
|
end
|
31
45
|
end
|
32
46
|
end
|
@@ -61,10 +61,17 @@ module Xcodeproj
|
|
61
61
|
# `_id_` would become `Id`
|
62
62
|
'remoteGlobalIDString'
|
63
63
|
else
|
64
|
-
name.to_s.camelize(:lower)
|
64
|
+
self.class.plist_name_store[name] ||= name.to_s.camelize(:lower)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
# @return [Hash] a shared store which cahces the plist name of the
|
69
|
+
# attributes.
|
70
|
+
#
|
71
|
+
def self.plist_name_store
|
72
|
+
@plist_name_store ||= {}
|
73
|
+
end
|
74
|
+
|
68
75
|
# @return [Array<Class>] the list of the classes accepted by the
|
69
76
|
# attribute.
|
70
77
|
#
|
@@ -34,10 +34,6 @@ module Xcodeproj
|
|
34
34
|
#
|
35
35
|
attr_reader :owner
|
36
36
|
|
37
|
-
#------------------------------------------------------------------------#
|
38
|
-
|
39
|
-
# @!group ObjectList
|
40
|
-
|
41
37
|
# @return [Array<String>]
|
42
38
|
# the UUIDs of all the objects referenced by this list.
|
43
39
|
#
|
@@ -52,9 +48,11 @@ module Xcodeproj
|
|
52
48
|
to_a
|
53
49
|
end
|
54
50
|
|
55
|
-
|
51
|
+
|
52
|
+
public
|
56
53
|
|
57
54
|
# @!group Notification enabled methods
|
55
|
+
#------------------------------------------------------------------------#
|
58
56
|
|
59
57
|
# TODO: the overridden methods are incomplete.
|
60
58
|
|
@@ -66,11 +64,11 @@ module Xcodeproj
|
|
66
64
|
# @return [void]
|
67
65
|
#
|
68
66
|
def +(objects)
|
69
|
-
super
|
70
67
|
perform_additions_operations(objects)
|
68
|
+
super
|
71
69
|
end
|
72
70
|
|
73
|
-
#
|
71
|
+
# Appends an object to list the and updates its references count.
|
74
72
|
#
|
75
73
|
# @param [AbstractObject, ObjectDictionary] object
|
76
74
|
# The object to add to the list.
|
@@ -78,8 +76,21 @@ module Xcodeproj
|
|
78
76
|
# @return [void]
|
79
77
|
#
|
80
78
|
def <<(object)
|
79
|
+
perform_additions_operations(object)
|
81
80
|
super
|
81
|
+
end
|
82
|
+
|
83
|
+
# Adds an object to the given index of the list the and updates its
|
84
|
+
# references count.
|
85
|
+
#
|
86
|
+
# @param [AbstractObject, ObjectDictionary] object
|
87
|
+
# The object to add to the list.
|
88
|
+
#
|
89
|
+
# @return [void]
|
90
|
+
#
|
91
|
+
def insert(index, object)
|
82
92
|
perform_additions_operations(object)
|
93
|
+
super
|
83
94
|
end
|
84
95
|
|
85
96
|
# Prepends an object to the list and updates its references count.
|
@@ -90,8 +101,8 @@ module Xcodeproj
|
|
90
101
|
# @return [void]
|
91
102
|
#
|
92
103
|
def unshift(object)
|
93
|
-
super
|
94
104
|
perform_additions_operations(object)
|
105
|
+
super
|
95
106
|
end
|
96
107
|
|
97
108
|
# Removes an object to list and updates its references count.
|
@@ -99,11 +110,25 @@ module Xcodeproj
|
|
99
110
|
# @param [AbstractObject, ObjectDictionary] object
|
100
111
|
# the object to delete from the list.
|
101
112
|
#
|
102
|
-
# @return [
|
113
|
+
# @return [AbstractObject, ObjectDictionary, Nil] the object if found.
|
103
114
|
#
|
104
115
|
def delete(object)
|
116
|
+
perform_deletion_operations(object)
|
105
117
|
super
|
118
|
+
end
|
119
|
+
|
120
|
+
# Removes the object at the given index from the list and updates its
|
121
|
+
# references count.
|
122
|
+
#
|
123
|
+
# @param [Fixnum] from
|
124
|
+
# The index of the object.
|
125
|
+
#
|
126
|
+
# @return [AbstractObject, ObjectDictionary, Nil] the object if found.
|
127
|
+
#
|
128
|
+
def delete_at(index)
|
129
|
+
object = at(index)
|
106
130
|
perform_deletion_operations(object)
|
131
|
+
super
|
107
132
|
end
|
108
133
|
|
109
134
|
# Removes all the objects contained in the list and updates their
|
@@ -118,12 +143,48 @@ module Xcodeproj
|
|
118
143
|
super
|
119
144
|
end
|
120
145
|
|
121
|
-
|
146
|
+
# Moves the object at the given given index to the given position.
|
147
|
+
#
|
148
|
+
# @param [Fixnum] from
|
149
|
+
# The current index of the object.
|
150
|
+
#
|
151
|
+
# @param [Fixnum] to
|
152
|
+
# The new index for the object.
|
153
|
+
#
|
154
|
+
# @return [void]
|
155
|
+
#
|
156
|
+
def move(object, new_index)
|
157
|
+
if obj = delete(object)
|
158
|
+
insert(new_index, obj)
|
159
|
+
else
|
160
|
+
raise "Attempt to move object `#{object}` not present in the list `#{self.inspect}`"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# Moves the object at the given given index to the given position.
|
165
|
+
#
|
166
|
+
# @param [Fixnum] from
|
167
|
+
# The current index of the object.
|
168
|
+
#
|
169
|
+
# @param [Fixnum] to
|
170
|
+
# The new index for the object.
|
171
|
+
#
|
172
|
+
# @return [void]
|
173
|
+
#
|
174
|
+
def move_from(current_index, new_index)
|
175
|
+
if obj = delete_at(current_index)
|
176
|
+
insert(new_index, obj)
|
177
|
+
else
|
178
|
+
raise "Attempt to move object from index `#{current_index}` which is beyond bounds of the list `#{self.inspect}`"
|
179
|
+
end
|
180
|
+
end
|
122
181
|
|
123
|
-
# @!group Notification Methods
|
124
182
|
|
125
183
|
private
|
126
184
|
|
185
|
+
# @!group Notification Methods
|
186
|
+
#------------------------------------------------------------------------#
|
187
|
+
|
127
188
|
# Informs an object that it was added to the list. In practice it adds
|
128
189
|
# the owner of the list as referrer to the objects. It also validates the
|
129
190
|
# value.
|
@@ -55,7 +55,7 @@ module Xcodeproj
|
|
55
55
|
|
56
56
|
# Frameworks
|
57
57
|
framework_name = (platform == :ios) ? 'Foundation' : 'Cocoa'
|
58
|
-
framework_ref =
|
58
|
+
framework_ref = target.add_system_framework(framework_name)
|
59
59
|
|
60
60
|
target
|
61
61
|
end
|
@@ -115,55 +115,6 @@ module Xcodeproj
|
|
115
115
|
target
|
116
116
|
end
|
117
117
|
|
118
|
-
# @!group System Frameworks
|
119
|
-
|
120
|
-
#-----------------------------------------------------------------------#
|
121
|
-
|
122
|
-
# Adds a file reference for a system framework to the project if needed
|
123
|
-
# and adds it to the {PBXFrameworksBuildPhase} of the given target.
|
124
|
-
#
|
125
|
-
# @param [Project] project
|
126
|
-
# the project to which the configuration list should be added.
|
127
|
-
#
|
128
|
-
# @param [String] name
|
129
|
-
# The name of a framework.
|
130
|
-
#
|
131
|
-
# @param [PBXNativeTarget] target
|
132
|
-
# The target to which to add the framework.
|
133
|
-
#
|
134
|
-
# @note This method adds a reference to the highest know SDK for the
|
135
|
-
# given platform.
|
136
|
-
#
|
137
|
-
# @return [PBXFileReference] The file reference of the framework.
|
138
|
-
#
|
139
|
-
def self.add_system_framework(project, name, target)
|
140
|
-
sdk = target.sdk
|
141
|
-
raise "Unable to find and SDK for the target `#{target.name}`" unless sdk
|
142
|
-
if sdk.include?('iphoneos')
|
143
|
-
if sdk == 'iphoneos'
|
144
|
-
version = XcodebuildHelper.instance.last_ios_sdk || Constants::LAST_KNOWN_IOS_SDK
|
145
|
-
base_dir = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS#{version}.sdk/"
|
146
|
-
else
|
147
|
-
base_dir = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS#{sdk.gsub('iphoneos', '')}.sdk/"
|
148
|
-
end
|
149
|
-
elsif sdk.include?('macosx')
|
150
|
-
if sdk == 'macosx'
|
151
|
-
version = XcodebuildHelper.instance.last_osx_sdk || Constants::LAST_KNOWN_OSX_SDK
|
152
|
-
base_dir = "Platforms/MacOSX.platform/Developer/SDKs/MacOSX#{version}.sdk/"
|
153
|
-
else
|
154
|
-
base_dir = "Platforms/MacOSX.platform/Developer/SDKs/MacOSX#{sdk.gsub('macosx', '')}.sdk/"
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
path = base_dir + "System/Library/Frameworks/#{name}.framework"
|
159
|
-
ref = project.frameworks_group.files.find { |f| f.path == path }
|
160
|
-
unless ref
|
161
|
-
ref = project.frameworks_group.new_file(path, :developer_dir)
|
162
|
-
end
|
163
|
-
|
164
|
-
target.frameworks_build_phase.add_file_reference(ref)
|
165
|
-
ref
|
166
|
-
end
|
167
118
|
|
168
119
|
# @!group Private Helpers
|
169
120
|
|
@@ -18,7 +18,7 @@ module Xcodeproj
|
|
18
18
|
#
|
19
19
|
def touch(path)
|
20
20
|
if available?
|
21
|
-
command = "xcproj --project #{path} touch"
|
21
|
+
command = "xcproj --project \"#{path}\" touch"
|
22
22
|
success, output = execute(command)
|
23
23
|
unless success
|
24
24
|
message = "xcproj failed to touch the project. Check whether you installation of xcproj is functional.\n\n"
|
data/lib/xcodeproj/workspace.rb
CHANGED
@@ -51,7 +51,7 @@ module Xcodeproj
|
|
51
51
|
def self.from_s(xml, workspace_path='')
|
52
52
|
document = REXML::Document.new(xml)
|
53
53
|
projpaths = document.get_elements("/Workspace/FileRef").map do |node|
|
54
|
-
node.attribute("location").
|
54
|
+
node.attribute("location").value.sub(/^group:/, '')
|
55
55
|
end
|
56
56
|
instance = new(projpaths)
|
57
57
|
instance.load_schemes(workspace_path)
|
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: 0.
|
4
|
+
version: 0.11.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: 2013-09-
|
11
|
+
date: 2013-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -50,6 +50,7 @@ extra_rdoc_files: []
|
|
50
50
|
files:
|
51
51
|
- lib/xcodeproj/command/project_diff.rb
|
52
52
|
- lib/xcodeproj/command/show.rb
|
53
|
+
- lib/xcodeproj/command/sort.rb
|
53
54
|
- lib/xcodeproj/command/target_diff.rb
|
54
55
|
- lib/xcodeproj/command.rb
|
55
56
|
- lib/xcodeproj/config.rb
|