xcode-archive-cache 0.0.9 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/artifact_cache/archiver.rb +2 -1
- data/lib/artifact_cache/local_storage.rb +2 -1
- data/lib/build/performer.rb +1 -1
- data/lib/build/product_extractor.rb +92 -9
- data/lib/build_graph/builder.rb +10 -10
- data/lib/build_graph/native_target_finder.rb +123 -13
- data/lib/build_graph/node.rb +50 -2
- data/lib/build_graph/rebuild_evaluator.rb +30 -4
- data/lib/build_graph/sha_calculator.rb +22 -1
- data/lib/build_settings/extractor.rb +23 -1
- data/lib/build_settings/filter.rb +7 -3
- data/lib/build_settings/loader.rb +10 -1
- data/lib/build_settings/parser.rb +29 -6
- data/lib/build_settings/string_interpolator.rb +21 -5
- data/lib/config/config.rb +2 -2
- data/lib/extensions/build_configuration.rb +26 -0
- data/lib/extensions/target.rb +58 -0
- data/lib/injection/build_flags_changer.rb +176 -4
- data/lib/injection/dependency_remover.rb +22 -1
- data/lib/injection/headers_mover.rb +27 -3
- data/lib/injection/injector.rb +70 -33
- data/lib/injection/pods_script_fixer.rb +2 -20
- data/lib/injection/pods_xcframework_fixer.rb +126 -0
- data/lib/injection/storage.rb +47 -6
- data/lib/modulemap/file_handler.rb +20 -0
- data/lib/modulemap/header_path_extractor.rb +67 -0
- data/lib/modulemap/header_path_fixer.rb +65 -0
- data/lib/runner/runner.rb +39 -28
- data/lib/shell/executor.rb +15 -3
- data/lib/xcode-archive-cache.rb +8 -0
- data/lib/xcodebuild/executor.rb +5 -1
- metadata +18 -12
@@ -0,0 +1,58 @@
|
|
1
|
+
module TargetEqualityCheck
|
2
|
+
# @return [String]
|
3
|
+
#
|
4
|
+
def equatable_identifier
|
5
|
+
uuid + display_name
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module BuildConfigurationSearch
|
10
|
+
# @param [String] configuration_name
|
11
|
+
#
|
12
|
+
# @return [Xcodeproj::Project::Object::XCBuildConfiguration]
|
13
|
+
#
|
14
|
+
def find_build_configuration(configuration_name, raise_if_not_found: true)
|
15
|
+
build_configuration = build_configurations
|
16
|
+
.select { |configuration| configuration.name == configuration_name }
|
17
|
+
.first
|
18
|
+
if raise_if_not_found && build_configuration == nil
|
19
|
+
raise XcodeArchiveCache::Informative, "#{configuration_name} build configuration not found on target #{display_name} #{project.path}"
|
20
|
+
end
|
21
|
+
|
22
|
+
build_configuration
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module SchellScriptBuildPhaseSearch
|
27
|
+
# @param [XcodeArchiveCache::BuildSettings::StringInterpolator] build_settings_interpolator
|
28
|
+
# @param [XcodeArchiveCache::BuildSettings::Container] build_settings
|
29
|
+
# @param [String] script_name
|
30
|
+
#
|
31
|
+
# @return [String]
|
32
|
+
#
|
33
|
+
def find_script(build_settings_interpolator, build_settings, script_name)
|
34
|
+
shell_script_build_phases.each do |phase|
|
35
|
+
if phase.display_name == script_name
|
36
|
+
return build_settings_interpolator.interpolate(phase.shell_script, build_settings)
|
37
|
+
.gsub(/^"|"$/, "")
|
38
|
+
.strip
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class Xcodeproj::Project::Object::PBXAggregateTarget
|
47
|
+
include XcodeArchiveCache::Logs
|
48
|
+
include TargetEqualityCheck
|
49
|
+
include BuildConfigurationSearch
|
50
|
+
include SchellScriptBuildPhaseSearch
|
51
|
+
end
|
52
|
+
|
53
|
+
class Xcodeproj::Project::Object::PBXNativeTarget
|
54
|
+
include XcodeArchiveCache::Logs
|
55
|
+
include TargetEqualityCheck
|
56
|
+
include BuildConfigurationSearch
|
57
|
+
include SchellScriptBuildPhaseSearch
|
58
|
+
end
|
@@ -7,9 +7,9 @@ module XcodeArchiveCache
|
|
7
7
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
8
8
|
# @param [String] path
|
9
9
|
#
|
10
|
-
def
|
10
|
+
def replace_or_add_framework_search_path(build_configuration, target_name, path)
|
11
11
|
debug("using framework search path #{path}")
|
12
|
-
|
12
|
+
replace_or_add_flag(build_configuration, [FRAMEWORK_SEARCH_PATHS_KEY], nil, [target_name], path_to_search_path(path), true)
|
13
13
|
end
|
14
14
|
|
15
15
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
@@ -26,6 +26,37 @@ module XcodeArchiveCache
|
|
26
26
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
27
27
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
28
28
|
#
|
29
|
+
def add_static_lib_linker_flag(build_configuration, node)
|
30
|
+
flag = get_linker_flag(node)
|
31
|
+
if flag
|
32
|
+
debug("using ld flag #{flag}")
|
33
|
+
add_linker_flag(build_configuration, flag)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
38
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
39
|
+
#
|
40
|
+
def add_static_lib_libtool_flag(build_configuration, node)
|
41
|
+
flag = get_linker_flag(node)
|
42
|
+
if flag
|
43
|
+
debug("using libtool flag #{flag}")
|
44
|
+
add_libtool_flag(build_configuration, flag)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
49
|
+
# @param [String] path
|
50
|
+
#
|
51
|
+
def add_swift_include_path(build_configuration, path)
|
52
|
+
debug("adding #{path} to SWIFT_INCLUDE_PATHS")
|
53
|
+
add_flag_to_configuration(build_configuration, SWIFT_INCLUDE_PATHS_KEY, path_to_search_path(path))
|
54
|
+
end
|
55
|
+
|
56
|
+
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
57
|
+
# @param [String] artifact_location
|
58
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
59
|
+
#
|
29
60
|
def add_framework_headers_iquote(build_configuration, artifact_location, node)
|
30
61
|
headers_search_path = get_framework_headers_iquote(artifact_location, node)
|
31
62
|
debug("using -iquote path #{headers_search_path}")
|
@@ -35,9 +66,9 @@ module XcodeArchiveCache
|
|
35
66
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
36
67
|
# @param [String] path
|
37
68
|
#
|
38
|
-
def
|
69
|
+
def replace_or_add_library_search_path(build_configuration, target_name, path)
|
39
70
|
debug("using library search path #{path}")
|
40
|
-
|
71
|
+
replace_or_add_flag(build_configuration, [LIBRARY_SEARCH_PATHS_KEY], nil, [target_name], path_to_search_path(path), true)
|
41
72
|
end
|
42
73
|
|
43
74
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
@@ -64,15 +95,32 @@ module XcodeArchiveCache
|
|
64
95
|
add_cflag(build_configuration, path_to_capital_i(path))
|
65
96
|
end
|
66
97
|
|
98
|
+
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
99
|
+
# @param [Array<String>] old_modulemap_names
|
100
|
+
# @param [String] path
|
101
|
+
#
|
102
|
+
def fix_module_map_path(build_configuration, old_modulemap_names, path)
|
103
|
+
debug("using #{path}")
|
104
|
+
|
105
|
+
settings_with_modulemaps = [OTHER_CFLAGS_KEY, OTHER_CPLUSPLUSFLAGS_KEY, OTHER_SWIFT_FLAGS_KEY]
|
106
|
+
replace_or_add_flag(build_configuration, settings_with_modulemaps, MODULE_MAP_FLAG, old_modulemap_names, path_to_search_path(path), false)
|
107
|
+
end
|
108
|
+
|
67
109
|
private
|
68
110
|
|
69
111
|
FRAMEWORK_SEARCH_PATHS_KEY = "FRAMEWORK_SEARCH_PATHS"
|
70
112
|
LIBRARY_SEARCH_PATHS_KEY = "LIBRARY_SEARCH_PATHS"
|
71
113
|
HEADER_SEARCH_PATHS_KEY = "HEADER_SEARCH_PATHS"
|
72
114
|
OTHER_CFLAGS_KEY = "OTHER_CFLAGS"
|
115
|
+
OTHER_CPLUSPLUSFLAGS_KEY = "OTHER_CPLUSPLUSFLAGS"
|
73
116
|
OTHER_LDFLAGS_KEY = "OTHER_LDFLAGS"
|
117
|
+
OTHER_LIBTOOLFLAGS_KEY = "OTHER_LIBTOOLFLAGS"
|
118
|
+
OTHER_SWIFT_FLAGS_KEY = "OTHER_SWIFT_FLAGS"
|
119
|
+
SWIFT_INCLUDE_PATHS_KEY = "SWIFT_INCLUDE_PATHS"
|
74
120
|
INHERITED_SETTINGS_VALUE = "$(inherited)"
|
75
121
|
|
122
|
+
MODULE_MAP_FLAG = "-fmodule-map-file="
|
123
|
+
|
76
124
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
77
125
|
# @param [String] flag
|
78
126
|
#
|
@@ -80,6 +128,13 @@ module XcodeArchiveCache
|
|
80
128
|
add_flag_to_configuration(build_configuration, OTHER_LDFLAGS_KEY, flag)
|
81
129
|
end
|
82
130
|
|
131
|
+
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
132
|
+
# @param [String] flag
|
133
|
+
#
|
134
|
+
def add_libtool_flag(build_configuration, flag)
|
135
|
+
add_flag_to_configuration(build_configuration, OTHER_LIBTOOLFLAGS_KEY, flag)
|
136
|
+
end
|
137
|
+
|
83
138
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
84
139
|
# @param [String] flag
|
85
140
|
#
|
@@ -167,6 +222,123 @@ module XcodeArchiveCache
|
|
167
222
|
|
168
223
|
"-framework \"#{framework_name}\""
|
169
224
|
end
|
225
|
+
|
226
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
227
|
+
#
|
228
|
+
# @return [String]
|
229
|
+
#
|
230
|
+
# libSomething.a -> -lSomething
|
231
|
+
#
|
232
|
+
def get_linker_flag(node)
|
233
|
+
return unless node.product_file_name
|
234
|
+
|
235
|
+
node.product_file_name.gsub(/^lib/, "-l").gsub(/\.a$/, "")
|
236
|
+
end
|
237
|
+
|
238
|
+
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
239
|
+
# @param [Array<String>] setting_keys
|
240
|
+
# @param [String] flag_name
|
241
|
+
# @param [Array<String>] possible_old_values
|
242
|
+
# @param [String] new_value
|
243
|
+
#
|
244
|
+
def replace_or_add_flag(build_configuration, setting_keys, flag_name, possible_old_values, new_value, add_if_missing)
|
245
|
+
replaced = false
|
246
|
+
|
247
|
+
setting_keys.each do |setting|
|
248
|
+
replaced = replace_flag_value(build_configuration.build_settings, setting, flag_name, possible_old_values, new_value) || replaced
|
249
|
+
end
|
250
|
+
|
251
|
+
if build_configuration.has_xcconfig?
|
252
|
+
replaced = replace_flag_value_in_xcconfig_recursively(
|
253
|
+
build_configuration.get_xcconfig_path,
|
254
|
+
build_configuration.get_project_dir,
|
255
|
+
setting_keys,
|
256
|
+
flag_name,
|
257
|
+
possible_old_values,
|
258
|
+
new_value) || replaced
|
259
|
+
end
|
260
|
+
|
261
|
+
if !replaced && add_if_missing
|
262
|
+
full_value = get_full_flag_value(flag_name, new_value)
|
263
|
+
|
264
|
+
setting_keys.each do |setting|
|
265
|
+
add_flag_to_configuration(build_configuration, setting, full_value)
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
# @param [String] xcconfig_path
|
271
|
+
# @param [String] project_dir
|
272
|
+
# @param [Array<String>] setting_keys
|
273
|
+
# @param [String] flag_name
|
274
|
+
# @param [Array<String>] possible_old_values
|
275
|
+
# @param [String] new_value
|
276
|
+
#
|
277
|
+
def replace_flag_value_in_xcconfig_recursively(xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value)
|
278
|
+
debug("changing #{possible_old_values} to #{new_value} in #{File.basename(xcconfig_path)}")
|
279
|
+
return unless File.exist?(xcconfig_path)
|
280
|
+
|
281
|
+
replaced = false
|
282
|
+
xcconfig = Xcodeproj::Config.new(xcconfig_path)
|
283
|
+
|
284
|
+
setting_keys.each do |key|
|
285
|
+
replaced = replace_flag_value(xcconfig.attributes, key, flag_name, possible_old_values, new_value) || replaced
|
286
|
+
end
|
287
|
+
|
288
|
+
xcconfig.save_as(Pathname.new(xcconfig_path))
|
289
|
+
|
290
|
+
xcconfig.includes.each do |included_xcconfig|
|
291
|
+
included_xcconfig_path = File.join(project_dir, included_xcconfig)
|
292
|
+
replaced = replace_flag_value_in_xcconfig_recursively(included_xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value) || replaced
|
293
|
+
end
|
294
|
+
|
295
|
+
replaced
|
296
|
+
end
|
297
|
+
|
298
|
+
# @param [Hash] attributes
|
299
|
+
# @param [String] setting_key
|
300
|
+
# @param [String] flag_name
|
301
|
+
# @param [Array<String>] possible_old_values
|
302
|
+
# @param [String] new_value
|
303
|
+
#
|
304
|
+
def replace_flag_value(attributes, setting_key, flag_name, possible_old_values, new_value)
|
305
|
+
build_settings = attributes[setting_key]
|
306
|
+
return unless build_settings
|
307
|
+
|
308
|
+
replaced = false
|
309
|
+
is_string = build_settings.is_a?(String)
|
310
|
+
build_settings = build_settings.split(" ") if is_string
|
311
|
+
full_value = get_full_flag_value(flag_name, new_value)
|
312
|
+
old_value_regexps = possible_old_values.map { |value| Regexp.new("/#{value}\"*$") }
|
313
|
+
|
314
|
+
updated_settings = build_settings
|
315
|
+
.map { |line| line.split(" ") }
|
316
|
+
.flatten
|
317
|
+
.map do |line|
|
318
|
+
if flag_name
|
319
|
+
next line unless line.include?(flag_name)
|
320
|
+
end
|
321
|
+
|
322
|
+
updated_line = line
|
323
|
+
|
324
|
+
old_value_regexps.each do |regexp|
|
325
|
+
if regexp.match?(line)
|
326
|
+
replaced = true
|
327
|
+
updated_line = full_value
|
328
|
+
break
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
updated_line
|
333
|
+
end
|
334
|
+
|
335
|
+
attributes[setting_key] = is_string ? updated_settings.join(" ") : updated_settings
|
336
|
+
replaced
|
337
|
+
end
|
338
|
+
|
339
|
+
def get_full_flag_value(flag_name, value)
|
340
|
+
"#{flag_name}#{value}"
|
341
|
+
end
|
170
342
|
end
|
171
343
|
end
|
172
344
|
end
|
@@ -12,11 +12,21 @@ module XcodeArchiveCache
|
|
12
12
|
debug("removing #{prebuilt_target.name} from #{dependent_target.display_name}")
|
13
13
|
|
14
14
|
remove_from_dependencies(prebuilt_target, dependent_target)
|
15
|
+
remove_from_linking(prebuilt_node, dependent_target)
|
15
16
|
remove_from_schemes(prebuilt_target, dependent_target)
|
16
17
|
|
17
18
|
debug("finished removing #{prebuilt_target.name} from #{dependent_target.display_name}")
|
18
19
|
end
|
19
20
|
|
21
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] prebuilt_node
|
22
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target
|
23
|
+
#
|
24
|
+
# @return [Boolean]
|
25
|
+
#
|
26
|
+
def is_linked(prebuilt_node, dependent_target)
|
27
|
+
!find_linked(prebuilt_node, dependent_target).empty?
|
28
|
+
end
|
29
|
+
|
20
30
|
private
|
21
31
|
|
22
32
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] prebuilt_target
|
@@ -46,7 +56,7 @@ module XcodeArchiveCache
|
|
46
56
|
#
|
47
57
|
def remove_from_linking(prebuilt_node, dependent_target)
|
48
58
|
debug("product name is #{prebuilt_node.product_file_name}")
|
49
|
-
frameworks = dependent_target
|
59
|
+
frameworks = find_linked(prebuilt_node, dependent_target)
|
50
60
|
debug("found #{frameworks.length} linked products")
|
51
61
|
|
52
62
|
frameworks.each do |framework|
|
@@ -67,6 +77,17 @@ module XcodeArchiveCache
|
|
67
77
|
end
|
68
78
|
end
|
69
79
|
|
80
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target
|
81
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] prebuilt_node
|
82
|
+
#
|
83
|
+
# @return [Array<PBXBuildFile>]
|
84
|
+
#
|
85
|
+
def find_linked(prebuilt_node, dependent_target)
|
86
|
+
return [] unless dependent_target.frameworks_build_phase
|
87
|
+
|
88
|
+
dependent_target.frameworks_build_phase.files.select {|file| file.display_name == prebuilt_node.product_file_name}
|
89
|
+
end
|
90
|
+
|
70
91
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
71
92
|
#
|
72
93
|
# @return [Array<Xcodeproj::XCScheme>]
|
@@ -9,6 +9,7 @@ module XcodeArchiveCache
|
|
9
9
|
def initialize(storage)
|
10
10
|
@storage = storage
|
11
11
|
@build_settings_interpolator = XcodeArchiveCache::BuildSettings::StringInterpolator.new
|
12
|
+
@modulemap_header_path_extractor = XcodeArchiveCache::Modulemap::HeaderPathExtractor.new
|
12
13
|
end
|
13
14
|
|
14
15
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
@@ -19,17 +20,36 @@ module XcodeArchiveCache
|
|
19
20
|
|
20
21
|
node.native_target.copy_files_build_phases.each do |build_phase|
|
21
22
|
file_paths = build_phase.files
|
22
|
-
.map {|build_file| get_real_path(build_file)}
|
23
|
+
.map { |build_file| get_real_path(build_file) }
|
23
24
|
.compact
|
24
25
|
.uniq
|
25
|
-
.select {|path| File.extname(path) == ".h"}
|
26
|
+
.select { |path| File.extname(path) == ".h" }
|
26
27
|
destination_path = get_destination_dir_path(node, build_phase)
|
27
28
|
storage.store_headers(node, destination_path, file_paths)
|
28
29
|
|
29
30
|
header_count += file_paths.length
|
30
31
|
end
|
31
32
|
|
32
|
-
|
33
|
+
if node.has_static_library_product?
|
34
|
+
headers_file_paths = node.native_target
|
35
|
+
.headers_build_phase
|
36
|
+
.files
|
37
|
+
.select { |file| file.settings && file.settings["ATTRIBUTES"].include?("Public") }
|
38
|
+
.map { |header| get_real_path(header) }
|
39
|
+
.uniq
|
40
|
+
storage.store_default_headers(node, headers_file_paths)
|
41
|
+
|
42
|
+
header_count += headers_file_paths.length
|
43
|
+
end
|
44
|
+
|
45
|
+
modulemap_file_path = node.original_modulemap_file_path
|
46
|
+
if modulemap_file_path && File.exist?(modulemap_file_path)
|
47
|
+
header_file_paths = modulemap_header_path_extractor.extract_all_paths(modulemap_file_path)
|
48
|
+
storage.store_modulemap_headers(node, header_file_paths)
|
49
|
+
header_count += header_file_paths.length
|
50
|
+
end
|
51
|
+
|
52
|
+
debug("found #{header_count} header(s)")
|
33
53
|
end
|
34
54
|
|
35
55
|
private
|
@@ -42,6 +62,10 @@ module XcodeArchiveCache
|
|
42
62
|
#
|
43
63
|
attr_reader :build_settings_interpolator
|
44
64
|
|
65
|
+
# @return [XcodeArchiveCache::Modulemap::HeaderPathExtractor]
|
66
|
+
#
|
67
|
+
attr_reader :modulemap_header_path_extractor
|
68
|
+
|
45
69
|
# @param [Xcodeproj::Project::Object::PBXBuildFile] build_file
|
46
70
|
#
|
47
71
|
# @return [String]
|
data/lib/injection/injector.rb
CHANGED
@@ -14,13 +14,14 @@ module XcodeArchiveCache
|
|
14
14
|
@dependency_remover = DependencyRemover.new
|
15
15
|
@build_flags_changer = BuildFlagsChanger.new
|
16
16
|
@pods_fixer = PodsScriptFixer.new
|
17
|
+
@modulemap_fixer = XcodeArchiveCache::Modulemap::HeaderPathFixer.new(storage)
|
17
18
|
@framework_embedder = FrameworkEmbedder.new
|
18
19
|
end
|
19
20
|
|
20
21
|
# @param [XcodeArchiveCache::BuildGraph::Graph] graph
|
21
22
|
#
|
22
23
|
def perform_internal_injection(graph)
|
23
|
-
|
24
|
+
inject_unpacked_and_rebuilt(graph.nodes)
|
24
25
|
add_header_paths(graph.nodes)
|
25
26
|
save_graph_projects(graph)
|
26
27
|
end
|
@@ -34,9 +35,15 @@ module XcodeArchiveCache
|
|
34
35
|
return
|
35
36
|
end
|
36
37
|
|
38
|
+
no_rebuild_performed = root_node.state == :unpacked
|
39
|
+
|
37
40
|
graph.nodes.each do |node|
|
38
|
-
|
39
|
-
|
41
|
+
if no_rebuild_performed || node.state == :rebuilt_and_cached
|
42
|
+
headers_mover.prepare_headers_for_injection(node)
|
43
|
+
modulemap_fixer.fix_modulemap(node)
|
44
|
+
end
|
45
|
+
|
46
|
+
add_as_prebuilt_dependency(node, target)
|
40
47
|
remove_native_target_from_project(node)
|
41
48
|
end
|
42
49
|
|
@@ -51,8 +58,8 @@ module XcodeArchiveCache
|
|
51
58
|
pods_fixer.fix_embed_frameworks_script(target, graph, storage.container_dir_path)
|
52
59
|
pods_fixer.fix_copy_resources_script(target, graph, storage.container_dir_path)
|
53
60
|
else
|
54
|
-
framework_nodes = graph.nodes.select {|node| node.has_framework_product?}
|
55
|
-
framework_file_paths = framework_nodes.map {|node| File.join(storage.get_storage_path(node), node.product_file_name)}
|
61
|
+
framework_nodes = graph.nodes.select { |node| node.has_framework_product? }
|
62
|
+
framework_file_paths = framework_nodes.map { |node| File.join(storage.get_storage_path(node), node.product_file_name) }
|
56
63
|
framework_embedder.embed(framework_file_paths, target)
|
57
64
|
end
|
58
65
|
|
@@ -86,16 +93,26 @@ module XcodeArchiveCache
|
|
86
93
|
#
|
87
94
|
attr_reader :pods_fixer
|
88
95
|
|
96
|
+
# @return [ModulemapFixer]
|
97
|
+
#
|
98
|
+
attr_reader :modulemap_fixer
|
99
|
+
|
89
100
|
# @return [FrameworkEmbedder]
|
90
101
|
#
|
91
102
|
attr_reader :framework_embedder
|
92
103
|
|
93
104
|
# @param [Array<XcodeArchiveCache::BuildGraph::Node>] nodes
|
94
105
|
#
|
95
|
-
def
|
96
|
-
cached_nodes = nodes.select {|node| node.state == :unpacked}
|
106
|
+
def inject_unpacked_and_rebuilt(nodes)
|
107
|
+
cached_nodes = nodes.select { |node| node.state == :unpacked }
|
97
108
|
cached_nodes.each do |node|
|
98
109
|
headers_mover.prepare_headers_for_injection(node)
|
110
|
+
modulemap_fixer.fix_modulemap(node)
|
111
|
+
add_as_prebuilt_to_dependents(node)
|
112
|
+
end
|
113
|
+
|
114
|
+
built_nodes = nodes.select { |node| node.state == :rebuilt_and_cached }
|
115
|
+
built_nodes.each do |node|
|
99
116
|
add_as_prebuilt_to_dependents(node)
|
100
117
|
end
|
101
118
|
end
|
@@ -108,7 +125,7 @@ module XcodeArchiveCache
|
|
108
125
|
|
109
126
|
nodes
|
110
127
|
.select(&:waiting_for_rebuild)
|
111
|
-
.each {|node| add_header_paths_to_target(node.native_target, header_storage_paths)}
|
128
|
+
.each { |node| add_header_paths_to_target(node.native_target, header_storage_paths) }
|
112
129
|
end
|
113
130
|
|
114
131
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
@@ -119,7 +136,7 @@ module XcodeArchiveCache
|
|
119
136
|
|
120
137
|
debug("adding #{paths} to #{target.display_name}")
|
121
138
|
|
122
|
-
build_configuration = find_build_configuration(
|
139
|
+
build_configuration = target.find_build_configuration(configuration_name)
|
123
140
|
paths.each do |path|
|
124
141
|
build_flags_changer.add_headers_search_path(build_configuration, path)
|
125
142
|
build_flags_changer.add_iquote_path(build_configuration, path)
|
@@ -134,8 +151,7 @@ module XcodeArchiveCache
|
|
134
151
|
.all_dependent_nodes
|
135
152
|
.select(&:waiting_for_rebuild)
|
136
153
|
dependent_to_rebuild.each do |dependent_node|
|
137
|
-
|
138
|
-
add_as_prebuilt_dependency(prebuilt_node, dependent_node.native_target, should_link)
|
154
|
+
add_as_prebuilt_dependency(prebuilt_node, dependent_node.native_target)
|
139
155
|
end
|
140
156
|
|
141
157
|
remove_native_target_from_project(prebuilt_node)
|
@@ -146,25 +162,30 @@ module XcodeArchiveCache
|
|
146
162
|
def save_graph_projects(graph)
|
147
163
|
projects = graph.nodes.map(&:native_target).map(&:project).uniq
|
148
164
|
debug("updating #{projects.length} projects")
|
149
|
-
projects.each {|project| project.save}
|
165
|
+
projects.each { |project| project.save }
|
150
166
|
end
|
151
167
|
|
152
168
|
# @param [XcodeArchiveCache::BuildGraph::Node] prebuilt_node
|
153
169
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target
|
154
170
|
#
|
155
|
-
def add_as_prebuilt_dependency(prebuilt_node, dependent_target
|
171
|
+
def add_as_prebuilt_dependency(prebuilt_node, dependent_target)
|
172
|
+
target_identifier = get_target_identifier(dependent_target)
|
173
|
+
return if prebuilt_node.targets_injected_to.include?(target_identifier)
|
174
|
+
|
156
175
|
debug("adding #{prebuilt_node.name} as prebuilt to #{dependent_target.display_name}")
|
157
176
|
|
158
177
|
unless prebuilt_node.has_acceptable_product?
|
159
|
-
raise Informative, "#{prebuilt_node.name} has unsupported product type: #{prebuilt_node.native_target.product_type}"
|
178
|
+
raise XcodeArchiveCache::Informative, "#{prebuilt_node.name} has unsupported product type: #{prebuilt_node.native_target.product_type}"
|
160
179
|
end
|
161
180
|
|
162
181
|
if prebuilt_node.has_framework_product?
|
163
182
|
add_as_prebuilt_framework(prebuilt_node, dependent_target)
|
164
183
|
elsif prebuilt_node.has_static_library_product?
|
165
|
-
add_as_prebuilt_static_lib(prebuilt_node, dependent_target
|
184
|
+
add_as_prebuilt_static_lib(prebuilt_node, dependent_target)
|
166
185
|
end
|
167
186
|
|
187
|
+
prebuilt_node.targets_injected_to.push(target_identifier)
|
188
|
+
|
168
189
|
debug("done with #{prebuilt_node.name} for #{dependent_target.display_name}")
|
169
190
|
end
|
170
191
|
|
@@ -172,39 +193,47 @@ module XcodeArchiveCache
|
|
172
193
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target
|
173
194
|
#
|
174
195
|
def add_as_prebuilt_framework(prebuilt_node, dependent_target)
|
175
|
-
build_configuration = find_build_configuration(
|
196
|
+
build_configuration = dependent_target.find_build_configuration(configuration_name)
|
176
197
|
|
177
198
|
artifact_location = storage.get_storage_path(prebuilt_node)
|
178
|
-
build_flags_changer.
|
199
|
+
build_flags_changer.replace_or_add_framework_search_path(build_configuration, prebuilt_node.native_target.name, artifact_location)
|
179
200
|
build_flags_changer.add_framework_headers_iquote(build_configuration, artifact_location, prebuilt_node)
|
180
201
|
|
202
|
+
if dependency_remover.is_linked(prebuilt_node, dependent_target)
|
203
|
+
build_flags_changer.add_framework_linker_flag(build_configuration, prebuilt_node)
|
204
|
+
end
|
205
|
+
|
181
206
|
dependency_remover.remove_dependency(prebuilt_node, dependent_target)
|
182
207
|
end
|
183
208
|
|
184
209
|
# @param [XcodeArchiveCache::BuildGraph::Node] prebuilt_node
|
185
210
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target
|
186
|
-
# @param [Boolean] should_link
|
187
211
|
#
|
188
|
-
def add_as_prebuilt_static_lib(prebuilt_node, dependent_target
|
189
|
-
build_configuration = find_build_configuration(
|
212
|
+
def add_as_prebuilt_static_lib(prebuilt_node, dependent_target)
|
213
|
+
build_configuration = dependent_target.find_build_configuration(configuration_name)
|
190
214
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
215
|
+
injected_modulemap_file_path = storage.get_modulemap_path(prebuilt_node)
|
216
|
+
if injected_modulemap_file_path
|
217
|
+
modulemap_file_names = [prebuilt_node.resulting_modulemap_file_name]
|
218
|
+
build_flags_changer.fix_module_map_path(build_configuration, modulemap_file_names, injected_modulemap_file_path)
|
195
219
|
|
196
|
-
|
197
|
-
|
220
|
+
original_modulemap_path = prebuilt_node.original_modulemap_file_path
|
221
|
+
add_header_paths_to_target(dependent_target, [File.dirname(original_modulemap_path)])
|
222
|
+
end
|
198
223
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
224
|
+
artifact_location = storage.get_storage_path(prebuilt_node)
|
225
|
+
build_flags_changer.replace_or_add_library_search_path(build_configuration, prebuilt_node.native_target.name, artifact_location)
|
226
|
+
build_flags_changer.add_swift_include_path(build_configuration, artifact_location)
|
227
|
+
|
228
|
+
if dependency_remover.is_linked(prebuilt_node, dependent_target)
|
229
|
+
if dependent_target.product_type == Xcodeproj::Constants::PRODUCT_TYPE_UTI[:static_library]
|
230
|
+
build_flags_changer.add_static_lib_libtool_flag(build_configuration, prebuilt_node)
|
231
|
+
else
|
232
|
+
build_flags_changer.add_static_lib_linker_flag(build_configuration, prebuilt_node)
|
233
|
+
end
|
205
234
|
end
|
206
235
|
|
207
|
-
|
236
|
+
dependency_remover.remove_dependency(prebuilt_node, dependent_target)
|
208
237
|
end
|
209
238
|
|
210
239
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
@@ -224,6 +253,14 @@ module XcodeArchiveCache
|
|
224
253
|
debug("deleting #{node.name} target")
|
225
254
|
node.native_target.project.targets.delete(node.native_target)
|
226
255
|
end
|
256
|
+
|
257
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
258
|
+
#
|
259
|
+
# @return [String]
|
260
|
+
#
|
261
|
+
def get_target_identifier(target)
|
262
|
+
target.uuid + target.project.path.realpath.to_s
|
263
|
+
end
|
227
264
|
end
|
228
265
|
end
|
229
266
|
end
|