xcode-archive-cache 0.0.10.pre.2 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/build/product_extractor.rb +75 -4
- data/lib/build_graph/builder.rb +5 -1
- data/lib/build_graph/native_target_finder.rb +7 -6
- data/lib/build_graph/node.rb +19 -7
- data/lib/build_graph/sha_calculator.rb +20 -2
- data/lib/injection/build_flags_changer.rb +103 -45
- data/lib/injection/headers_mover.rb +13 -2
- data/lib/injection/injector.rb +28 -6
- data/lib/injection/storage.rb +9 -14
- 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 +31 -16
- data/lib/xcode-archive-cache.rb +4 -1
- metadata +12 -10
- data/lib/injection/modulemap_fixer.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff86c853bc7b50f265964695cd55edd14821c821f5d27a1f916dcc23ccc1c4b4
|
4
|
+
data.tar.gz: a11e6dd9c98f59526f6f5329aab00acdcc58b5d7e2b65d83b6a1348d647a2323
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a71f194f4af63d93ee4f256977eb98525065599a36f270215c5c0f3a18cb8742957bb8f2e407497a7629f05ba18b9532d093d02b1dec305fcf4f82f815473431
|
7
|
+
data.tar.gz: ba25058d81d37e12594422d9a765d07fb8af192b53fe980ca3b4da3e1eac61f5a0bc69454f406be92094742e7809dbe8f4887d33e48b305c869733e5c581a4d8
|
@@ -2,6 +2,8 @@ module XcodeArchiveCache
|
|
2
2
|
module Build
|
3
3
|
class ProductExtractor
|
4
4
|
|
5
|
+
include XcodeArchiveCache::Logs
|
6
|
+
|
5
7
|
# @param [String] configuration
|
6
8
|
# @param [String] derived_data_path
|
7
9
|
#
|
@@ -17,7 +19,9 @@ module XcodeArchiveCache
|
|
17
19
|
#
|
18
20
|
def list_product_contents(built_node)
|
19
21
|
file_paths = list_products(built_node)
|
20
|
-
file_paths
|
22
|
+
file_paths
|
23
|
+
.select { |path| File.exist?(path) }
|
24
|
+
.map { |path| File.realpath(path) }
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
@@ -83,8 +87,32 @@ module XcodeArchiveCache
|
|
83
87
|
# this one is generated during Swift compilation
|
84
88
|
# so we need to cache it as well
|
85
89
|
#
|
86
|
-
|
87
|
-
|
90
|
+
swift_objc_interface_header_glob = get_swift_objc_interface_header_glob(built_node)
|
91
|
+
swift_objc_interface_header_path = Dir.glob(swift_objc_interface_header_glob).first
|
92
|
+
if swift_objc_interface_header_path
|
93
|
+
debug("using Swift-ObjC interface header #{swift_objc_interface_header_path}")
|
94
|
+
paths << swift_objc_interface_header_path
|
95
|
+
end
|
96
|
+
|
97
|
+
swiftmodule_glob = get_swiftmodule_glob(built_node)
|
98
|
+
if swiftmodule_glob
|
99
|
+
swiftmodule_path = Dir.glob(swiftmodule_glob).first
|
100
|
+
|
101
|
+
if swiftmodule_path
|
102
|
+
debug("using swiftmodule #{swiftmodule_path}")
|
103
|
+
paths << swiftmodule_path
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
modulemap_glob = get_modulemap_glob(built_node)
|
108
|
+
if modulemap_glob
|
109
|
+
modulemap_path = Dir.glob(modulemap_glob).first
|
110
|
+
|
111
|
+
if modulemap_path
|
112
|
+
debug("using modulemap #{modulemap_path}")
|
113
|
+
paths << modulemap_path
|
114
|
+
end
|
115
|
+
end
|
88
116
|
|
89
117
|
paths
|
90
118
|
end
|
@@ -97,9 +125,52 @@ module XcodeArchiveCache
|
|
97
125
|
product_name = built_node.native_target.product_reference.name ?
|
98
126
|
built_node.native_target.product_reference.name :
|
99
127
|
built_node.native_target.product_reference.path
|
128
|
+
get_product_glob(File.basename(product_name))
|
129
|
+
end
|
130
|
+
|
131
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] built_node
|
132
|
+
#
|
133
|
+
# @return [String]
|
134
|
+
#
|
135
|
+
def get_swift_objc_interface_header_glob(built_node)
|
136
|
+
get_product_glob(File.basename(built_node.swift_objc_interface_header_file))
|
137
|
+
end
|
138
|
+
|
139
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] built_node
|
140
|
+
#
|
141
|
+
# @return [String]
|
142
|
+
#
|
143
|
+
def get_swiftmodule_glob(built_node)
|
144
|
+
if built_node.module_name
|
145
|
+
get_product_glob(built_node.module_name + ".swiftmodule")
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] built_node
|
150
|
+
#
|
151
|
+
# @return [String]
|
152
|
+
#
|
153
|
+
def get_modulemap_glob(built_node)
|
154
|
+
resulting_modulemap_file_name = built_node.resulting_modulemap_file_name
|
155
|
+
if resulting_modulemap_file_name
|
156
|
+
get_product_glob(resulting_modulemap_file_name)
|
157
|
+
else
|
158
|
+
modulemap_file_path = built_node.original_modulemap_file_path
|
159
|
+
if modulemap_file_path && File.exist?(modulemap_file_path)
|
160
|
+
modulemap_file_name = File.basename(modulemap_file_path)
|
161
|
+
get_product_glob(modulemap_file_name)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# @param [String] file_name
|
167
|
+
#
|
168
|
+
# @return [String]
|
169
|
+
#
|
170
|
+
def get_product_glob(file_name)
|
100
171
|
File.join(derived_data_path,
|
101
172
|
"**",
|
102
|
-
|
173
|
+
file_name)
|
103
174
|
end
|
104
175
|
|
105
176
|
# @param [String] framework_path
|
data/lib/build_graph/builder.rb
CHANGED
@@ -67,7 +67,11 @@ module XcodeArchiveCache
|
|
67
67
|
node = ALL_NODES.select {|node| node.native_target.uuid == target.uuid && node.native_target.project == target.project}.first
|
68
68
|
if node
|
69
69
|
debug("already traversed this one")
|
70
|
-
|
70
|
+
unless graph.nodes.include?(node)
|
71
|
+
nodes_to_add = node.subgraph.select {|subgraph_node| !graph.nodes.include?(subgraph_node)}
|
72
|
+
graph.add_multiple_nodes(nodes_to_add)
|
73
|
+
end
|
74
|
+
|
71
75
|
return node
|
72
76
|
else
|
73
77
|
debug("adding new node")
|
@@ -14,12 +14,13 @@ module XcodeArchiveCache
|
|
14
14
|
#
|
15
15
|
def extract_targets(projects)
|
16
16
|
projects
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
.map {|project| unnest(project)}
|
18
|
+
.flatten
|
19
|
+
.sort_by(&:path)
|
20
|
+
.inject([]) {|unique, current| unique.last && unique.last.path == current.path ? unique : unique + [current]}
|
21
|
+
.map(&:native_targets)
|
22
|
+
.flatten
|
23
|
+
.select {|target| !target.test_target_type?}
|
23
24
|
end
|
24
25
|
|
25
26
|
# @param [String] platform_name
|
data/lib/build_graph/node.rb
CHANGED
@@ -34,6 +34,10 @@ module XcodeArchiveCache
|
|
34
34
|
#
|
35
35
|
attr_accessor :build_settings
|
36
36
|
|
37
|
+
# @return [Array<Xcodeproj::Project::Object::PBXNativeTarget>]
|
38
|
+
#
|
39
|
+
attr_reader :targets_injected_to
|
40
|
+
|
37
41
|
# @param [String] name
|
38
42
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] native_target
|
39
43
|
# @param [Boolean] is_root
|
@@ -44,6 +48,7 @@ module XcodeArchiveCache
|
|
44
48
|
@is_root = is_root
|
45
49
|
@dependent = []
|
46
50
|
@dependencies = []
|
51
|
+
@targets_injected_to = []
|
47
52
|
@state = :unknown
|
48
53
|
end
|
49
54
|
|
@@ -91,8 +96,8 @@ module XcodeArchiveCache
|
|
91
96
|
|
92
97
|
# @return [String]
|
93
98
|
#
|
94
|
-
def
|
95
|
-
modulemap_file =
|
99
|
+
def original_modulemap_file_path
|
100
|
+
modulemap_file = modulemap_file_name
|
96
101
|
return unless modulemap_file
|
97
102
|
|
98
103
|
Pathname.new(modulemap_file).absolute? ? modulemap_file : File.join(File.dirname(native_target.project.path), modulemap_file)
|
@@ -100,11 +105,12 @@ module XcodeArchiveCache
|
|
100
105
|
|
101
106
|
# @return [String]
|
102
107
|
#
|
103
|
-
def
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
+
def resulting_modulemap_file_name
|
109
|
+
if module_name
|
110
|
+
module_name + ".modulemap"
|
111
|
+
else
|
112
|
+
File.basename(modulemap_file_name)
|
113
|
+
end
|
108
114
|
end
|
109
115
|
|
110
116
|
# @return [String]
|
@@ -127,6 +133,12 @@ module XcodeArchiveCache
|
|
127
133
|
build_settings[XcodeArchiveCache::BuildSettings::PRODUCT_MODULE_NAME_KEY]
|
128
134
|
end
|
129
135
|
|
136
|
+
# @return [String]
|
137
|
+
#
|
138
|
+
def modulemap_file_name
|
139
|
+
build_settings[XcodeArchiveCache::BuildSettings::MODULEMAP_FILE_KEY]
|
140
|
+
end
|
141
|
+
|
130
142
|
# @return [Array<Node>]
|
131
143
|
# Direct + transitive dependents
|
132
144
|
#
|
@@ -2,6 +2,10 @@ module XcodeArchiveCache
|
|
2
2
|
module BuildGraph
|
3
3
|
class NodeShaCalculator
|
4
4
|
|
5
|
+
def initialize
|
6
|
+
@own_sha = calculate_own_sources_sha
|
7
|
+
end
|
8
|
+
|
5
9
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
6
10
|
#
|
7
11
|
def calculate(node)
|
@@ -24,6 +28,20 @@ module XcodeArchiveCache
|
|
24
28
|
|
25
29
|
private
|
26
30
|
|
31
|
+
# @return [String]
|
32
|
+
#
|
33
|
+
attr_reader :own_sha
|
34
|
+
|
35
|
+
# @return [String]
|
36
|
+
#
|
37
|
+
def calculate_own_sources_sha
|
38
|
+
root = Pathname.new(File.expand_path('../', File.dirname(__FILE__)))
|
39
|
+
source_file_glob = File.join(root.realpath.to_s, "**", "*.rb")
|
40
|
+
source_file_paths = Dir.glob(source_file_glob)
|
41
|
+
|
42
|
+
calculate_sha(source_file_paths)
|
43
|
+
end
|
44
|
+
|
27
45
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
28
46
|
#
|
29
47
|
# @return [Array<String>]
|
@@ -36,7 +54,7 @@ module XcodeArchiveCache
|
|
36
54
|
inputs << list_build_phase_inputs(build_phase)
|
37
55
|
end
|
38
56
|
|
39
|
-
modulemap_file_path = node.
|
57
|
+
modulemap_file_path = node.original_modulemap_file_path
|
40
58
|
inputs << modulemap_file_path if modulemap_file_path
|
41
59
|
|
42
60
|
# file path order should not affect evaluation result
|
@@ -74,7 +92,7 @@ module XcodeArchiveCache
|
|
74
92
|
# @param [Array<String>] dependency_shas
|
75
93
|
#
|
76
94
|
def save_auxiliary_data(build_settings, dependency_shas, tempfile)
|
77
|
-
file_contents = build_settings + dependency_shas.join("\n")
|
95
|
+
file_contents = build_settings + dependency_shas.join("\n") + "\nXCODE-ARCHIVE-CACHE: #{own_sha}\n"
|
78
96
|
tempfile << file_contents
|
79
97
|
tempfile.flush
|
80
98
|
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
|
@@ -44,8 +44,17 @@ module XcodeArchiveCache
|
|
44
44
|
add_libtool_flag(build_configuration, flag)
|
45
45
|
end
|
46
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
|
47
55
|
|
48
56
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
57
|
+
# @param [String] artifact_location
|
49
58
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
50
59
|
#
|
51
60
|
def add_framework_headers_iquote(build_configuration, artifact_location, node)
|
@@ -57,9 +66,9 @@ module XcodeArchiveCache
|
|
57
66
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
58
67
|
# @param [String] path
|
59
68
|
#
|
60
|
-
def
|
69
|
+
def replace_or_add_library_search_path(build_configuration, target_name, path)
|
61
70
|
debug("using library search path #{path}")
|
62
|
-
|
71
|
+
replace_or_add_flag(build_configuration, [LIBRARY_SEARCH_PATHS_KEY], nil, [target_name], path_to_search_path(path), true)
|
63
72
|
end
|
64
73
|
|
65
74
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
@@ -87,24 +96,14 @@ module XcodeArchiveCache
|
|
87
96
|
end
|
88
97
|
|
89
98
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
99
|
+
# @param [Array<String>] old_modulemap_names
|
90
100
|
# @param [String] path
|
91
101
|
#
|
92
102
|
def fix_module_map_path(build_configuration, old_modulemap_names, path)
|
93
|
-
|
94
|
-
replace_module_map_flag(build_configuration.build_settings, OTHER_CPLUSPLUSFLAGS_KEY, old_modulemap_names, path)
|
95
|
-
replace_module_map_flag(build_configuration.build_settings, OTHER_SWIFT_FLAGS_KEY, old_modulemap_names, path)
|
103
|
+
debug("using #{path}")
|
96
104
|
|
97
|
-
|
98
|
-
|
99
|
-
return unless File.exist?(xcconfig_path)
|
100
|
-
xcconfig = Xcodeproj::Config.new(xcconfig_path)
|
101
|
-
|
102
|
-
replace_module_map_flag(xcconfig.attributes, OTHER_CFLAGS_KEY, old_modulemap_names, path)
|
103
|
-
replace_module_map_flag(xcconfig.attributes, OTHER_CPLUSPLUSFLAGS_KEY, old_modulemap_names, path)
|
104
|
-
replace_module_map_flag(xcconfig.attributes, OTHER_SWIFT_FLAGS_KEY, old_modulemap_names, path)
|
105
|
-
|
106
|
-
xcconfig.save_as(Pathname.new(xcconfig_path))
|
107
|
-
end
|
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)
|
108
107
|
end
|
109
108
|
|
110
109
|
private
|
@@ -117,8 +116,11 @@ module XcodeArchiveCache
|
|
117
116
|
OTHER_LDFLAGS_KEY = "OTHER_LDFLAGS"
|
118
117
|
OTHER_LIBTOOLFLAGS_KEY = "OTHER_LIBTOOLFLAGS"
|
119
118
|
OTHER_SWIFT_FLAGS_KEY = "OTHER_SWIFT_FLAGS"
|
119
|
+
SWIFT_INCLUDE_PATHS_KEY = "SWIFT_INCLUDE_PATHS"
|
120
120
|
INHERITED_SETTINGS_VALUE = "$(inherited)"
|
121
121
|
|
122
|
+
MODULE_MAP_FLAG = "-fmodule-map-file="
|
123
|
+
|
122
124
|
# @param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration
|
123
125
|
# @param [String] flag
|
124
126
|
#
|
@@ -233,50 +235,106 @@ module XcodeArchiveCache
|
|
233
235
|
node.product_file_name.gsub(/^lib/, "-l").gsub(/\.a$/, "")
|
234
236
|
end
|
235
237
|
|
236
|
-
# @param [
|
237
|
-
# @param [String]
|
238
|
-
# @param [
|
239
|
-
# @param [String]
|
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
|
240
243
|
#
|
241
|
-
def
|
242
|
-
|
243
|
-
|
244
|
-
|
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
|
245
249
|
end
|
246
|
-
end
|
247
250
|
|
248
|
-
|
251
|
+
if build_configuration.base_configuration_reference
|
252
|
+
xcconfig_path = build_configuration.base_configuration_reference.real_path
|
253
|
+
project_dir = File.dirname(build_configuration.project.path)
|
249
254
|
|
250
|
-
|
251
|
-
|
252
|
-
|
255
|
+
replaced = replace_flag_value_in_xcconfig_recursively(xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value) || replaced
|
256
|
+
end
|
257
|
+
|
258
|
+
if !replaced && add_if_missing
|
259
|
+
full_value = get_full_flag_value(flag_name, new_value)
|
260
|
+
|
261
|
+
setting_keys.each do |setting|
|
262
|
+
add_flag_to_configuration(build_configuration, setting, full_value)
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
# @param [String] xcconfig_path
|
268
|
+
# @param [String] project_dir
|
269
|
+
# @param [Array<String>] setting_keys
|
270
|
+
# @param [String] flag_name
|
271
|
+
# @param [Array<String>] possible_old_values
|
272
|
+
# @param [String] new_value
|
253
273
|
#
|
254
|
-
|
274
|
+
def replace_flag_value_in_xcconfig_recursively(xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value)
|
275
|
+
debug("changing #{possible_old_values} to #{new_value} in #{File.basename(xcconfig_path)}")
|
276
|
+
return unless File.exist?(xcconfig_path)
|
277
|
+
|
278
|
+
replaced = false
|
279
|
+
xcconfig = Xcodeproj::Config.new(xcconfig_path)
|
280
|
+
|
281
|
+
setting_keys.each do |key|
|
282
|
+
replaced = replace_flag_value(xcconfig.attributes, key, flag_name, possible_old_values, new_value) || replaced
|
283
|
+
end
|
284
|
+
|
285
|
+
xcconfig.save_as(Pathname.new(xcconfig_path))
|
286
|
+
|
287
|
+
xcconfig.includes.each do |included_xcconfig|
|
288
|
+
included_xcconfig_path = File.join(project_dir, included_xcconfig)
|
289
|
+
replaced = replace_flag_value_in_xcconfig_recursively(included_xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value) || replaced
|
290
|
+
end
|
291
|
+
|
292
|
+
replaced
|
293
|
+
end
|
294
|
+
|
295
|
+
# @param [Hash] attributes
|
296
|
+
# @param [String] setting_key
|
297
|
+
# @param [String] flag_name
|
298
|
+
# @param [Array<String>] possible_old_values
|
299
|
+
# @param [String] new_value
|
255
300
|
#
|
256
|
-
def
|
257
|
-
|
301
|
+
def replace_flag_value(attributes, setting_key, flag_name, possible_old_values, new_value)
|
302
|
+
build_settings = attributes[setting_key]
|
303
|
+
return unless build_settings
|
258
304
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
305
|
+
replaced = false
|
306
|
+
is_string = build_settings.is_a?(String)
|
307
|
+
build_settings = build_settings.split(" ") if is_string
|
308
|
+
full_value = get_full_flag_value(flag_name, new_value)
|
309
|
+
old_value_regexps = possible_old_values.map { |value| Regexp.new("#{value}\"*$") }
|
310
|
+
|
311
|
+
updated_settings = build_settings
|
312
|
+
.map { |line| line.split(" ") }
|
263
313
|
.flatten
|
264
314
|
.map do |line|
|
315
|
+
if flag_name
|
316
|
+
next line unless line.include?(flag_name)
|
317
|
+
end
|
318
|
+
|
265
319
|
updated_line = line
|
266
320
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
end
|
321
|
+
old_value_regexps.each do |regexp|
|
322
|
+
if regexp.match?(line)
|
323
|
+
replaced = true
|
324
|
+
updated_line = full_value
|
325
|
+
break
|
273
326
|
end
|
274
327
|
end
|
275
328
|
|
276
329
|
updated_line
|
277
330
|
end
|
278
331
|
|
279
|
-
|
332
|
+
attributes[setting_key] = is_string ? updated_settings.join(" ") : updated_settings
|
333
|
+
replaced
|
334
|
+
end
|
335
|
+
|
336
|
+
def get_full_flag_value(flag_name, value)
|
337
|
+
"#{flag_name}#{value}"
|
280
338
|
end
|
281
339
|
end
|
282
340
|
end
|
@@ -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
|
@@ -33,16 +34,22 @@ module XcodeArchiveCache
|
|
33
34
|
headers_file_paths = node.native_target
|
34
35
|
.headers_build_phase
|
35
36
|
.files
|
37
|
+
.select { |file| file.settings && file.settings["ATTRIBUTES"].include?("Public") }
|
36
38
|
.map { |header| get_real_path(header) }
|
37
39
|
.uniq
|
38
40
|
storage.store_default_headers(node, headers_file_paths)
|
39
41
|
|
40
42
|
header_count += headers_file_paths.length
|
43
|
+
end
|
41
44
|
|
42
|
-
|
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
|
43
50
|
end
|
44
51
|
|
45
|
-
debug("found #{header_count}
|
52
|
+
debug("found #{header_count} header(s)")
|
46
53
|
end
|
47
54
|
|
48
55
|
private
|
@@ -55,6 +62,10 @@ module XcodeArchiveCache
|
|
55
62
|
#
|
56
63
|
attr_reader :build_settings_interpolator
|
57
64
|
|
65
|
+
# @return [XcodeArchiveCache::Modulemap::HeaderPathExtractor]
|
66
|
+
#
|
67
|
+
attr_reader :modulemap_header_path_extractor
|
68
|
+
|
58
69
|
# @param [Xcodeproj::Project::Object::PBXBuildFile] build_file
|
59
70
|
#
|
60
71
|
# @return [String]
|
data/lib/injection/injector.rb
CHANGED
@@ -14,14 +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 =
|
17
|
+
@modulemap_fixer = XcodeArchiveCache::Modulemap::HeaderPathFixer.new(storage)
|
18
18
|
@framework_embedder = FrameworkEmbedder.new
|
19
19
|
end
|
20
20
|
|
21
21
|
# @param [XcodeArchiveCache::BuildGraph::Graph] graph
|
22
22
|
#
|
23
23
|
def perform_internal_injection(graph)
|
24
|
-
|
24
|
+
inject_unpacked_and_rebuilt(graph.nodes)
|
25
25
|
add_header_paths(graph.nodes)
|
26
26
|
save_graph_projects(graph)
|
27
27
|
end
|
@@ -103,13 +103,18 @@ module XcodeArchiveCache
|
|
103
103
|
|
104
104
|
# @param [Array<XcodeArchiveCache::BuildGraph::Node>] nodes
|
105
105
|
#
|
106
|
-
def
|
106
|
+
def inject_unpacked_and_rebuilt(nodes)
|
107
107
|
cached_nodes = nodes.select { |node| node.state == :unpacked }
|
108
108
|
cached_nodes.each do |node|
|
109
109
|
headers_mover.prepare_headers_for_injection(node)
|
110
110
|
modulemap_fixer.fix_modulemap(node)
|
111
111
|
add_as_prebuilt_to_dependents(node)
|
112
112
|
end
|
113
|
+
|
114
|
+
built_nodes = nodes.select { |node| node.state == :rebuilt_and_cached }
|
115
|
+
built_nodes.each do |node|
|
116
|
+
add_as_prebuilt_to_dependents(node)
|
117
|
+
end
|
113
118
|
end
|
114
119
|
|
115
120
|
# @param [Array<XcodeArchiveCache::BuildGraph::Node>] nodes
|
@@ -164,6 +169,9 @@ module XcodeArchiveCache
|
|
164
169
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target
|
165
170
|
#
|
166
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
|
+
|
167
175
|
debug("adding #{prebuilt_node.name} as prebuilt to #{dependent_target.display_name}")
|
168
176
|
|
169
177
|
unless prebuilt_node.has_acceptable_product?
|
@@ -176,6 +184,8 @@ module XcodeArchiveCache
|
|
176
184
|
add_as_prebuilt_static_lib(prebuilt_node, dependent_target)
|
177
185
|
end
|
178
186
|
|
187
|
+
prebuilt_node.targets_injected_to.push(target_identifier)
|
188
|
+
|
179
189
|
debug("done with #{prebuilt_node.name} for #{dependent_target.display_name}")
|
180
190
|
end
|
181
191
|
|
@@ -186,7 +196,7 @@ module XcodeArchiveCache
|
|
186
196
|
build_configuration = find_build_configuration(dependent_target)
|
187
197
|
|
188
198
|
artifact_location = storage.get_storage_path(prebuilt_node)
|
189
|
-
build_flags_changer.
|
199
|
+
build_flags_changer.replace_or_add_framework_search_path(build_configuration, prebuilt_node.native_target.name, artifact_location)
|
190
200
|
build_flags_changer.add_framework_headers_iquote(build_configuration, artifact_location, prebuilt_node)
|
191
201
|
|
192
202
|
if dependency_remover.is_linked(prebuilt_node, dependent_target)
|
@@ -204,12 +214,16 @@ module XcodeArchiveCache
|
|
204
214
|
|
205
215
|
injected_modulemap_file_path = storage.get_modulemap_path(prebuilt_node)
|
206
216
|
if injected_modulemap_file_path
|
207
|
-
modulemap_file_names = [
|
217
|
+
modulemap_file_names = [prebuilt_node.resulting_modulemap_file_name]
|
208
218
|
build_flags_changer.fix_module_map_path(build_configuration, modulemap_file_names, injected_modulemap_file_path)
|
219
|
+
|
220
|
+
original_modulemap_path = prebuilt_node.original_modulemap_file_path
|
221
|
+
add_header_paths_to_target(dependent_target, [File.dirname(original_modulemap_path)])
|
209
222
|
end
|
210
223
|
|
211
224
|
artifact_location = storage.get_storage_path(prebuilt_node)
|
212
|
-
build_flags_changer.
|
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)
|
213
227
|
|
214
228
|
if dependency_remover.is_linked(prebuilt_node, dependent_target)
|
215
229
|
if dependent_target.product_type == Xcodeproj::Constants::PRODUCT_TYPE_UTI[:static_library]
|
@@ -250,6 +264,14 @@ module XcodeArchiveCache
|
|
250
264
|
debug("deleting #{node.name} target")
|
251
265
|
node.native_target.project.targets.delete(node.native_target)
|
252
266
|
end
|
267
|
+
|
268
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
269
|
+
#
|
270
|
+
# @return [String]
|
271
|
+
#
|
272
|
+
def get_target_identifier(target)
|
273
|
+
target.uuid + target.project.path.realpath.to_s
|
274
|
+
end
|
253
275
|
end
|
254
276
|
end
|
255
277
|
end
|
data/lib/injection/storage.rb
CHANGED
@@ -23,8 +23,8 @@ module XcodeArchiveCache
|
|
23
23
|
# @param [String] path
|
24
24
|
# @param [Array<String>] file_paths
|
25
25
|
#
|
26
|
-
def store_headers(node, path, file_paths)
|
27
|
-
storage_path = get_full_header_storage_path(path)
|
26
|
+
def store_headers(node, path, file_paths, save_path = true)
|
27
|
+
storage_path = Pathname.new(path).absolute? ? path : get_full_header_storage_path(path)
|
28
28
|
|
29
29
|
unless File.exist?(storage_path)
|
30
30
|
FileUtils.mkdir_p(storage_path)
|
@@ -34,7 +34,7 @@ module XcodeArchiveCache
|
|
34
34
|
FileUtils.cp(file_path, get_stored_file_path(storage_path, file_path))
|
35
35
|
end
|
36
36
|
|
37
|
-
save_header_storage_path(storage_path, node)
|
37
|
+
save_header_storage_path(storage_path, node) if save_path
|
38
38
|
end
|
39
39
|
|
40
40
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
@@ -44,13 +44,8 @@ module XcodeArchiveCache
|
|
44
44
|
store_headers(node, get_default_headers_storage_path(node), file_paths)
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
def store_modulemap(node)
|
50
|
-
modulemap_file_path = node.modulemap_file_path
|
51
|
-
if modulemap_file_path && File.exist?(modulemap_file_path)
|
52
|
-
store_headers(node, get_default_headers_storage_path(node), [modulemap_file_path])
|
53
|
-
end
|
47
|
+
def store_modulemap_headers(node, file_paths)
|
48
|
+
store_headers(node, get_storage_path(node), file_paths, false)
|
54
49
|
end
|
55
50
|
|
56
51
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
@@ -58,11 +53,11 @@ module XcodeArchiveCache
|
|
58
53
|
# @return [String]
|
59
54
|
#
|
60
55
|
def get_modulemap_path(node)
|
61
|
-
|
62
|
-
return if
|
56
|
+
modulemap_file_name = node.resulting_modulemap_file_name
|
57
|
+
return if modulemap_file_name == nil
|
63
58
|
|
64
|
-
storage_path =
|
65
|
-
stored_modulemap_file_path = get_stored_file_path(storage_path,
|
59
|
+
storage_path = get_storage_path(node)
|
60
|
+
stored_modulemap_file_path = get_stored_file_path(storage_path, modulemap_file_name)
|
66
61
|
File.exist?(stored_modulemap_file_path) ? stored_modulemap_file_path : nil
|
67
62
|
end
|
68
63
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module XcodeArchiveCache
|
2
|
+
module Modulemap
|
3
|
+
class FileHandler
|
4
|
+
# @param [String] modulemap_path
|
5
|
+
#
|
6
|
+
# @return [Array<String>]
|
7
|
+
#
|
8
|
+
def read_modulemap_lines(modulemap_path)
|
9
|
+
File.read(modulemap_path).split("\n")
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [Array<String>] lines
|
13
|
+
# @param [String] modulemap_path
|
14
|
+
#
|
15
|
+
def write_modulemap_lines(lines, modulemap_path)
|
16
|
+
File.open(modulemap_path, "w") { |file| file.puts lines.join("\n") }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module XcodeArchiveCache
|
2
|
+
module Modulemap
|
3
|
+
class HeaderPathDeclaration
|
4
|
+
# @return [String]
|
5
|
+
#
|
6
|
+
attr_reader :type
|
7
|
+
|
8
|
+
# @return [String]
|
9
|
+
#
|
10
|
+
attr_reader :path
|
11
|
+
|
12
|
+
# @param [String] type
|
13
|
+
# @param [String] path
|
14
|
+
#
|
15
|
+
def initialize(type, path)
|
16
|
+
@type = type
|
17
|
+
@path = path
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class HeaderPathExtractor
|
22
|
+
|
23
|
+
include XcodeArchiveCache::Logs
|
24
|
+
|
25
|
+
# @param [String] modulemap_path
|
26
|
+
#
|
27
|
+
# @return [Array<String>]
|
28
|
+
#
|
29
|
+
def extract_all_paths(modulemap_path)
|
30
|
+
modulemap_dir = File.dirname(modulemap_path)
|
31
|
+
modulemap_lines = FileHandler.new.read_modulemap_lines(modulemap_path)
|
32
|
+
header_paths = []
|
33
|
+
|
34
|
+
modulemap_lines.each do |line|
|
35
|
+
header_declaration = extract_header_declaration(line)
|
36
|
+
if header_declaration
|
37
|
+
header_paths << get_full_header_path(modulemap_dir, header_declaration.path)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
debug("modulemap header paths: #{header_paths}")
|
42
|
+
|
43
|
+
header_paths
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param [String] modulemap_dir
|
47
|
+
# @param [String] path
|
48
|
+
#
|
49
|
+
# @return [String]
|
50
|
+
#
|
51
|
+
def get_full_header_path(modulemap_dir, path)
|
52
|
+
Pathname.new(path).absolute? ? path : File.join(modulemap_dir, path)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param [String] line
|
56
|
+
#
|
57
|
+
# @return [XcodeArchiveCache::Modulemap::HeaderPathDeclaration]
|
58
|
+
#
|
59
|
+
def extract_header_declaration(line)
|
60
|
+
if line.include?("header") && !line.include?("exclude")
|
61
|
+
components = line.split("\"")
|
62
|
+
HeaderPathDeclaration.new(components[0], components[1])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module XcodeArchiveCache
|
2
|
+
module Modulemap
|
3
|
+
class HeaderPathFixer
|
4
|
+
|
5
|
+
include XcodeArchiveCache::Logs
|
6
|
+
|
7
|
+
# @param [Storage] storage
|
8
|
+
#
|
9
|
+
def initialize(storage)
|
10
|
+
@storage = storage
|
11
|
+
@header_path_extractor = HeaderPathExtractor.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
15
|
+
#
|
16
|
+
def fix_modulemap(node)
|
17
|
+
return unless node.has_static_library_product?
|
18
|
+
|
19
|
+
injected_modulemap_file_path = storage.get_modulemap_path(node)
|
20
|
+
return if injected_modulemap_file_path == nil
|
21
|
+
|
22
|
+
file_handler = FileHandler.new
|
23
|
+
|
24
|
+
modulemap_dir = File.dirname(injected_modulemap_file_path)
|
25
|
+
modulemap_lines = file_handler.read_modulemap_lines(injected_modulemap_file_path)
|
26
|
+
|
27
|
+
updated_lines = modulemap_lines.map do |line|
|
28
|
+
declaration = header_path_extractor.extract_header_declaration(line)
|
29
|
+
next line unless declaration
|
30
|
+
|
31
|
+
# absolute paths depend on machine and derived data dir
|
32
|
+
#
|
33
|
+
full_header_path = header_path_extractor.get_full_header_path(modulemap_dir, declaration.path)
|
34
|
+
should_replace = Pathname.new(declaration.path).absolute? || !File.exist?(full_header_path)
|
35
|
+
next line unless should_replace
|
36
|
+
|
37
|
+
header_file_name = File.basename(declaration.path)
|
38
|
+
injected_header_path = File.join(modulemap_dir, header_file_name)
|
39
|
+
next line if injected_header_path == declaration.path
|
40
|
+
|
41
|
+
if File.exist?(injected_header_path)
|
42
|
+
debug("substituting #{declaration.path} with #{injected_header_path} in #{File.basename(injected_modulemap_file_path)}")
|
43
|
+
"#{declaration.type}\"#{injected_header_path}\""
|
44
|
+
else
|
45
|
+
error("failed to substitute missing header #{declaration.path} with another missing header in #{File.basename(injected_modulemap_file_path)}")
|
46
|
+
error("leaving the path as it is")
|
47
|
+
line
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
file_handler.write_modulemap_lines(updated_lines, injected_modulemap_file_path)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# @return [Storage]
|
57
|
+
#
|
58
|
+
attr_accessor :storage
|
59
|
+
|
60
|
+
# @return [XcodeArchiveCache::Modulemap::HeaderPathExtractor]
|
61
|
+
#
|
62
|
+
attr_accessor :header_path_extractor
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/runner/runner.rb
CHANGED
@@ -68,34 +68,49 @@ module XcodeArchiveCache
|
|
68
68
|
raise Informative, "Target not found for #{target_config.name}"
|
69
69
|
end
|
70
70
|
|
71
|
+
xcodebuild_executor = XcodeArchiveCache::Xcodebuild::Executor.new(config.active_configuration.build_configuration,
|
72
|
+
target.platform_name,
|
73
|
+
config.settings.destination,
|
74
|
+
config.active_configuration.action,
|
75
|
+
config.active_configuration.xcodebuild_args)
|
76
|
+
graph_builder = XcodeArchiveCache::BuildGraph::Builder.new(@native_target_finder, xcodebuild_executor)
|
77
|
+
|
78
|
+
dependency_targets = Hash.new
|
79
|
+
build_graphs = Hash.new
|
80
|
+
|
71
81
|
target_config.dependencies.each do |dependency_name|
|
72
|
-
|
82
|
+
info("creating build graph for #{dependency_name}")
|
83
|
+
|
84
|
+
dependency_target = find_dependency_target(target, dependency_name)
|
85
|
+
dependency_targets[dependency_name] = dependency_target
|
86
|
+
build_graphs[dependency_name] = graph_builder.build_graph(target, dependency_target)
|
87
|
+
end
|
88
|
+
|
89
|
+
target_config.dependencies.each do |dependency_name|
|
90
|
+
info("processing #{dependency_name}")
|
91
|
+
|
92
|
+
dependency_target = dependency_targets[dependency_name]
|
93
|
+
build_graph = build_graphs[dependency_name]
|
94
|
+
|
95
|
+
@rebuild_evaluator.evaluate_build_graph(build_graph)
|
96
|
+
unpack_cached_artifacts(build_graph)
|
97
|
+
rebuild_if_needed(xcodebuild_executor, dependency_target, build_graph)
|
98
|
+
@injector.perform_outgoing_injection(build_graph, target)
|
73
99
|
end
|
74
100
|
end
|
75
101
|
|
76
102
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
77
103
|
# @param [String] dependency_name
|
78
104
|
#
|
79
|
-
|
80
|
-
|
81
|
-
|
105
|
+
# @return [Xcodeproj::Project::Object::PBXNativeTarget]
|
106
|
+
#
|
107
|
+
def find_dependency_target(target, dependency_name)
|
82
108
|
dependency_target = @native_target_finder.find_for_product_name(dependency_name)
|
83
109
|
unless dependency_target
|
84
110
|
raise Informative, "Target not found for #{dependency_name} of #{target.display_name}"
|
85
111
|
end
|
86
112
|
|
87
|
-
|
88
|
-
dependency_target.platform_name,
|
89
|
-
config.settings.destination,
|
90
|
-
config.active_configuration.action,
|
91
|
-
config.active_configuration.xcodebuild_args)
|
92
|
-
graph_builder = XcodeArchiveCache::BuildGraph::Builder.new(@native_target_finder, xcodebuild_executor)
|
93
|
-
graph = graph_builder.build_graph(target, dependency_target)
|
94
|
-
|
95
|
-
@rebuild_evaluator.evaluate_build_graph(graph)
|
96
|
-
unpack_cached_artifacts(graph)
|
97
|
-
rebuild_if_needed(xcodebuild_executor, dependency_target, graph)
|
98
|
-
@injector.perform_outgoing_injection(graph, target)
|
113
|
+
dependency_target
|
99
114
|
end
|
100
115
|
|
101
116
|
# @param [XcodeArchiveCache::BuildGraph::Graph] graph
|
data/lib/xcode-archive-cache.rb
CHANGED
@@ -40,13 +40,16 @@ require 'build_settings/parser'
|
|
40
40
|
|
41
41
|
require 'injection/injector'
|
42
42
|
require 'injection/pods_script_fixer'
|
43
|
-
require 'injection/modulemap_fixer'
|
44
43
|
require 'injection/build_flags_changer'
|
45
44
|
require 'injection/dependency_remover'
|
46
45
|
require 'injection/headers_mover'
|
47
46
|
require 'injection/storage'
|
48
47
|
require 'injection/framework_embedder'
|
49
48
|
|
49
|
+
require 'modulemap/file_handler'
|
50
|
+
require 'modulemap/header_path_extractor'
|
51
|
+
require 'modulemap/header_path_fixer'
|
52
|
+
|
50
53
|
require 'runner/runner'
|
51
54
|
|
52
55
|
require 'shell/executor'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcode-archive-cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.10
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilya Dyakonov
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xcodeproj
|
@@ -78,8 +78,8 @@ dependencies:
|
|
78
78
|
- - "~>"
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: '1.0'
|
81
|
-
description:
|
82
|
-
email:
|
81
|
+
description:
|
82
|
+
email:
|
83
83
|
executables:
|
84
84
|
- xcode-archive-cache
|
85
85
|
extensions: []
|
@@ -112,10 +112,12 @@ files:
|
|
112
112
|
- lib/injection/framework_embedder.rb
|
113
113
|
- lib/injection/headers_mover.rb
|
114
114
|
- lib/injection/injector.rb
|
115
|
-
- lib/injection/modulemap_fixer.rb
|
116
115
|
- lib/injection/pods_script_fixer.rb
|
117
116
|
- lib/injection/storage.rb
|
118
117
|
- lib/logs/logs.rb
|
118
|
+
- lib/modulemap/file_handler.rb
|
119
|
+
- lib/modulemap/header_path_extractor.rb
|
120
|
+
- lib/modulemap/header_path_fixer.rb
|
119
121
|
- lib/runner/runner.rb
|
120
122
|
- lib/shell/executor.rb
|
121
123
|
- lib/xcode-archive-cache.rb
|
@@ -124,7 +126,7 @@ homepage: https://github.com/sweatco/xcode-archive-cache
|
|
124
126
|
licenses:
|
125
127
|
- MIT
|
126
128
|
metadata: {}
|
127
|
-
post_install_message:
|
129
|
+
post_install_message:
|
128
130
|
rdoc_options: []
|
129
131
|
require_paths:
|
130
132
|
- lib
|
@@ -135,12 +137,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
137
|
version: 2.0.0
|
136
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
139
|
requirements:
|
138
|
-
- - "
|
140
|
+
- - ">="
|
139
141
|
- !ruby/object:Gem::Version
|
140
|
-
version:
|
142
|
+
version: '0'
|
141
143
|
requirements: []
|
142
144
|
rubygems_version: 3.0.4
|
143
|
-
signing_key:
|
145
|
+
signing_key:
|
144
146
|
specification_version: 4
|
145
147
|
summary: Native targets cache for Xcode archive builds.
|
146
148
|
test_files: []
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module XcodeArchiveCache
|
2
|
-
module Injection
|
3
|
-
|
4
|
-
class ModulemapFixer
|
5
|
-
|
6
|
-
# @param [Storage] storage
|
7
|
-
#
|
8
|
-
def initialize(storage)
|
9
|
-
@storage = storage
|
10
|
-
end
|
11
|
-
|
12
|
-
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
13
|
-
#
|
14
|
-
def fix_modulemap(node)
|
15
|
-
return unless node.has_static_library_product?
|
16
|
-
|
17
|
-
modulemap_file_path = node.modulemap_file_path
|
18
|
-
return if modulemap_file_path == nil
|
19
|
-
|
20
|
-
injected_modulemap_file_path = storage.get_modulemap_path(node)
|
21
|
-
return if injected_modulemap_file_path == nil
|
22
|
-
|
23
|
-
swift_objc_interface_header_file_name = node.swift_objc_interface_header_file
|
24
|
-
return if swift_objc_interface_header_file_name == nil
|
25
|
-
|
26
|
-
# add generated header to modulemap to make Swift stuff available module users
|
27
|
-
#
|
28
|
-
storage_path = storage.get_storage_path(node)
|
29
|
-
header_path = File.join(storage_path, swift_objc_interface_header_file_name)
|
30
|
-
return unless File.exist?(header_path)
|
31
|
-
|
32
|
-
File.open(injected_modulemap_file_path, "a") do |modulemap_file|
|
33
|
-
modulemap_file.puts "\nmodule #{node.module_name}.Swift {\n"
|
34
|
-
modulemap_file.puts " header \"#{header_path}\"\n"
|
35
|
-
modulemap_file.puts " requires objc\n"
|
36
|
-
modulemap_file.puts "}\n"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
# @return [Storage]
|
43
|
-
#
|
44
|
-
attr_accessor :storage
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|