cocoapods-xcremotecache 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 359dfd9fb48e07a331b72fa8577d2405ef314f74da80e70a10ba1b215dce31ca
4
- data.tar.gz: b6fe29ac1c506afdf58a6371f43f6f956b110ee1e5e55e2c489241032e349d8b
3
+ metadata.gz: cec0659df232b506d6211509e65fa1bcdc1c405df1392fba1d846f9d90fe816e
4
+ data.tar.gz: ee6f1445269a3c929015ef1be4666133dc8a3b87921a40961759d4ff4a20937b
5
5
  SHA512:
6
- metadata.gz: 1695e333fc0c7e93513271cd62297579acd0f5f3ced03ff610942969ce631186538b7265e4b29408219974b2ac53f4ca17c514522a9ee7315c6822dfb7d09a62
7
- data.tar.gz: 480b2222e66937897e1a5e9157bde4985a9a9531301d76906553e3c7ac5856b04d417224d428ded3cc4b3cf9bc5a044f461471afaacb14f63ed4f214d73ff543
6
+ metadata.gz: db2b76a94e7dbf545baeb4ac6f581e08a19488a51ed14a23d24a9429938d7052f759f0c1daada0db553691bdaa352ec8b63ace617f66abda238b031d389efae2
7
+ data.tar.gz: d5b9b7bb4bed7da81069522198ca6000754bc056b27bcd756034f67aa46c82bc231bae2ecb40820a63ce455b291973bce74ed97982cf8f92f84dc6af3ea57519
data/README.md CHANGED
@@ -4,6 +4,14 @@ The CocoaPods plugin that integrates XCRemoteCache with the project.
4
4
 
5
5
  ## Installation
6
6
 
7
+ ### Using RubyGems
8
+
9
+ ```bash
10
+ gem install cocoapods-xcremotecache
11
+ ```
12
+
13
+ ### From sources
14
+
7
15
  Build & install the plugin
8
16
 
9
17
  ```bash
@@ -52,3 +60,7 @@ To fully uninstall the plugin, call:
52
60
  ```bash
53
61
  gem uninstall cocoapods-xcremotecache
54
62
  ```
63
+
64
+ ## Limitations
65
+
66
+ * When `generate_multiple_pod_projects` mode is enabled, only first-party targets are cached by XCRemoteCache (all dependencies are compiled locally).
@@ -46,17 +46,17 @@ module CocoapodsXCRemoteCacheModifier
46
46
  @@configuration = c
47
47
  end
48
48
 
49
- def self.set_configuration_default_values(user_proj_directory)
49
+ def self.set_configuration_default_values
50
50
  default_values = {
51
51
  'mode' => 'consumer',
52
52
  'enabled' => true,
53
- 'xcrc_location' => "#{user_proj_directory}/XCRC",
53
+ 'xcrc_location' => "XCRC",
54
54
  'exclude_build_configurations' => [],
55
55
  'check_build_configuration' => 'Debug',
56
56
  'check_platform' => 'iphonesimulator',
57
57
  'modify_lldb_init' => true,
58
- 'xccc_file' => "#{user_proj_directory}/#{BIN_DIR}/xccc",
59
- 'remote_commit_file' => "#{user_proj_directory}/#{BIN_DIR}/arc.rc",
58
+ 'xccc_file' => "#{BIN_DIR}/xccc",
59
+ 'remote_commit_file' => "#{BIN_DIR}/arc.rc",
60
60
  'exclude_targets' => [],
61
61
  }
62
62
  @@configuration.merge! default_values.select { |k, v| !@@configuration.key?(k) }
@@ -89,61 +89,95 @@ module CocoapodsXCRemoteCacheModifier
89
89
  @@configuration.select { |key, value| !CUSTOM_CONFIGURATION_KEYS.include?(key) }
90
90
  end
91
91
 
92
- def self.enable_xcremotecache(target, user_proj_directory, xc_location, xc_cc_path, mode, exclude_build_configurations, check_build_configuration, check_platform, final_target)
93
- target.build_configurations.each do |config|
94
- # apply only for relevant Configurations
95
- next if exclude_build_configurations.include?(config.name)
96
- if mode == 'consumer'
97
- config.build_settings['CC'] = [xc_cc_path]
98
- end
99
- config.build_settings['SWIFT_EXEC'] = ["#{xc_location}/xcswiftc"]
100
- config.build_settings['LIBTOOL'] = ["#{xc_location}/xclibtool"]
101
- config.build_settings['LD'] = ["#{xc_location}/xcld"]
92
+ def self.parent_dir(path, parent_count)
93
+ "../" * parent_count + path
94
+ end
102
95
 
103
- config.build_settings['XCREMOTE_CACHE_FAKE_SRCROOT'] = FAKE_SRCROOT
104
- add_cflags!(config.build_settings, '-fdebug-prefix-map', "#{user_proj_directory}=$(XCREMOTE_CACHE_FAKE_SRCROOT)")
105
- add_swiftflags!(config.build_settings, '-debug-prefix-map', "#{user_proj_directory}=$(XCREMOTE_CACHE_FAKE_SRCROOT)")
106
- end
107
-
96
+ # @param target [Target] target to apply XCRemoteCache
97
+ # @param repo_distance [Integer] distance from the git repo root to the target's $SRCROOT
98
+ # @param xc_location [String] path to the dir with all XCRemoteCache binaries, relative to the repo root
99
+ # @param xc_cc_path [String] path to the XCRemoteCache clang wrapper, relative to the repo root
100
+ # @param mode [String] mode name ('consumer', 'producer' etc.)
101
+ # @param exclude_build_configurations [String[]] list of targets that should have disabled remote cache
102
+ # @param final_target [String] name of target that should trigger marking
103
+ def self.enable_xcremotecache(target, repo_distance, xc_location, xc_cc_path, mode, exclude_build_configurations, final_target)
104
+ srcroot_relative_xc_location = parent_dir(xc_location, repo_distance)
108
105
 
109
- # User project is not generated from scratch (contrary to `Pods`), delete all previous XCRemoteCache phases
110
- target.build_phases.delete_if {|phase|
111
- # Some phases (e.g. PBXSourcesBuildPhase) don't have strict name check respond_to?
112
- if phase.respond_to?(:name)
113
- phase.name != nil && phase.name.start_with?("[XCRC]")
106
+ target.build_configurations.each do |config|
107
+ # apply only for relevant Configurations
108
+ next if exclude_build_configurations.include?(config.name)
109
+ if mode == 'consumer'
110
+ config.build_settings['CC'] = ["$SRCROOT/#{parent_dir(xc_cc_path, repo_distance)}"]
114
111
  end
115
- }
112
+ config.build_settings['SWIFT_EXEC'] = ["$SRCROOT/#{srcroot_relative_xc_location}/xcswiftc"]
113
+ config.build_settings['LIBTOOL'] = ["$SRCROOT/#{srcroot_relative_xc_location}/xclibtool"]
114
+ config.build_settings['LD'] = ["$SRCROOT/#{srcroot_relative_xc_location}/xcld"]
115
+
116
+ config.build_settings['XCREMOTE_CACHE_FAKE_SRCROOT'] = FAKE_SRCROOT
117
+ debug_prefix_map_replacement = '$(SRCROOT' + ':dir:standardizepath' * repo_distance + ')'
118
+ add_cflags!(config.build_settings, '-fdebug-prefix-map', "#{debug_prefix_map_replacement}=$(XCREMOTE_CACHE_FAKE_SRCROOT)")
119
+ add_swiftflags!(config.build_settings, '-debug-prefix-map', "#{debug_prefix_map_replacement}=$(XCREMOTE_CACHE_FAKE_SRCROOT)")
120
+ end
116
121
 
117
122
  # Prebuild
118
123
  if mode == 'consumer'
119
- prebuild_script = target.new_shell_script_build_phase("[XCRC] Prebuild")
124
+ existing_prebuild_script = target.build_phases.detect do |phase|
125
+ if phase.respond_to?(:name)
126
+ phase.name != nil && phase.name.start_with?("[XCRC] Prebuild")
127
+ end
128
+ end
129
+ prebuild_script = existing_prebuild_script || target.new_shell_script_build_phase("[XCRC] Prebuild")
120
130
  prebuild_script.shell_script = "\"$SCRIPT_INPUT_FILE_0\""
121
- prebuild_script.input_paths = ["#{xc_location}/xcprebuild"]
131
+ prebuild_script.input_paths = ["$SRCROOT/#{srcroot_relative_xc_location}/xcprebuild"]
122
132
  prebuild_script.output_paths = [
123
- "$(TARGET_TEMP_DIR)/rc.enabled",
133
+ "$(TARGET_TEMP_DIR)/rc.enabled",
124
134
  "$(DWARF_DSYM_FOLDER_PATH)/$(DWARF_DSYM_FILE_NAME)"
125
135
  ]
126
136
  prebuild_script.dependency_file = "$(TARGET_TEMP_DIR)/prebuild.d"
127
137
 
128
138
  # Move prebuild (last element) to the first position (to make it real 'prebuild')
129
- target.build_phases.rotate!(-1)
139
+ target.build_phases.rotate!(-1) if existing_prebuild_script.nil?
140
+ elsif mode == 'producer'
141
+ # Delete existing prebuild build phase (to support switching between modes)
142
+ target.build_phases.delete_if do |phase|
143
+ if phase.respond_to?(:name)
144
+ phase.name != nil && phase.name.start_with?("[XCRC] Prebuild")
145
+ end
146
+ end
130
147
  end
131
148
 
132
149
  # Postbuild
133
- postbuild_script = target.new_shell_script_build_phase("[XCRC] Postbuild")
150
+ existing_postbuild_script = target.build_phases.detect do |phase|
151
+ if phase.respond_to?(:name)
152
+ phase.name != nil && phase.name.start_with?("[XCRC] Postbuild")
153
+ end
154
+ end
155
+ postbuild_script = existing_postbuild_script || target.new_shell_script_build_phase("[XCRC] Postbuild")
134
156
  postbuild_script.shell_script = "\"$SCRIPT_INPUT_FILE_0\""
135
- postbuild_script.input_paths = ["#{xc_location}/xcpostbuild"]
157
+ postbuild_script.input_paths = ["$SRCROOT/#{srcroot_relative_xc_location}/xcpostbuild"]
136
158
  postbuild_script.output_paths = [
137
- "$(TARGET_BUILD_DIR)/$(MODULES_FOLDER_PATH)/$(PRODUCT_MODULE_NAME).swiftmodule/$(PLATFORM_PREFERRED_ARCH).swiftmodule.md5",
159
+ "$(TARGET_BUILD_DIR)/$(MODULES_FOLDER_PATH)/$(PRODUCT_MODULE_NAME).swiftmodule/$(PLATFORM_PREFERRED_ARCH).swiftmodule.md5",
138
160
  "$(TARGET_BUILD_DIR)/$(MODULES_FOLDER_PATH)/$(PRODUCT_MODULE_NAME).swiftmodule/$(PLATFORM_PREFERRED_ARCH)-$(LLVM_TARGET_TRIPLE_VENDOR)-$(SWIFT_PLATFORM_TARGET_PREFIX)$(LLVM_TARGET_TRIPLE_SUFFIX).swiftmodule.md5"
139
161
  ]
140
162
  postbuild_script.dependency_file = "$(TARGET_TEMP_DIR)/postbuild.d"
141
163
 
142
164
  # Mark a sha as ready for a given platform and configuration when building the final_target
143
165
  if mode == 'producer' && target.name == final_target
144
- mark_script = target.new_shell_script_build_phase("[XCRC] Mark")
166
+ existing_mark_script = target.build_phases.detect do |phase|
167
+ if phase.respond_to?(:name)
168
+ phase.name != nil && phase.name.start_with?("[XCRC] Mark")
169
+ end
170
+ end
171
+ mark_script = existing_mark_script || target.new_shell_script_build_phase("[XCRC] Mark")
145
172
  mark_script.shell_script = "\"$SCRIPT_INPUT_FILE_0\" mark --configuration $CONFIGURATION --platform $PLATFORM_NAME"
146
- mark_script.input_paths = ["#{xc_location}/xcprepare"]
173
+ mark_script.input_paths = ["$SRCROOT/#{srcroot_relative_xc_location}/xcprepare"]
174
+ else
175
+ # Delete existing mark build phase (to support switching between modes or changing the final target)
176
+ target.build_phases.delete_if do |phase|
177
+ if phase.respond_to?(:name)
178
+ phase.name != nil && phase.name.start_with?("[XCRC] Mark")
179
+ end
180
+ end
147
181
  end
148
182
  end
149
183
 
@@ -251,6 +285,7 @@ module CocoapodsXCRemoteCacheModifier
251
285
  # Returns the content (array of lines) of the lldbinit with stripped XCRemoteCache rewrite
252
286
  def self.clean_lldbinit_content(lldbinit_path)
253
287
  all_lines = []
288
+ return all_lines unless File.exist?(lldbinit_path)
254
289
  File.open(lldbinit_path) { |file|
255
290
  while(line = file.gets) != nil
256
291
  line = line.strip
@@ -290,7 +325,7 @@ module CocoapodsXCRemoteCacheModifier
290
325
 
291
326
  begin
292
327
  user_proj_directory = File.dirname(user_project.path)
293
- set_configuration_default_values(user_proj_directory)
328
+ set_configuration_default_values
294
329
 
295
330
  unless @@configuration['enabled']
296
331
  Pod::UI.puts "[XCRC] XCRemoteCache disabled"
@@ -310,8 +345,12 @@ module CocoapodsXCRemoteCacheModifier
310
345
  check_build_configuration = @@configuration['check_build_configuration']
311
346
  check_platform = @@configuration['check_platform']
312
347
 
348
+ xccc_location_absolute = "#{user_proj_directory}/#{xccc_location}"
349
+ xcrc_location_absolute = "#{user_proj_directory}/#{xcrc_location}"
350
+ remote_commit_file_absolute = "#{user_proj_directory}/#{remote_commit_file}"
351
+
313
352
  # Download XCRC
314
- download_xcrc_if_needed(xcrc_location)
353
+ download_xcrc_if_needed(xcrc_location_absolute)
315
354
 
316
355
  # Save .rcinfo
317
356
  save_rcinfo(generate_rcinfo(), user_proj_directory)
@@ -320,12 +359,34 @@ module CocoapodsXCRemoteCacheModifier
320
359
  Dir.mkdir(BIN_DIR) unless File.exist?(BIN_DIR)
321
360
 
322
361
  # Remove previous xccc & arc.rc
323
- File.delete(remote_commit_file) if File.exist?(remote_commit_file)
324
- File.delete(xccc_location) if File.exist?(xccc_location)
362
+ File.delete(remote_commit_file_absolute) if File.exist?(remote_commit_file_absolute)
363
+ File.delete(xccc_location_absolute) if File.exist?(xccc_location_absolute)
325
364
 
326
365
  # Prepare XCRC
366
+
367
+ # Pods projects can be generated only once (if incremental_installation is enabled)
368
+ # Always integrate XCRemoteCache to all Pods, in case it will be needed later
369
+ unless installer_context.pods_project.nil?
370
+ # Attach XCRemoteCache to Pods targets
371
+ installer_context.pods_project.targets.each do |target|
372
+ next if target.name.start_with?("Pods-")
373
+ next if target.name.end_with?("Tests")
374
+ next if exclude_targets.include?(target.name)
375
+ enable_xcremotecache(target, 1, xcrc_location, xccc_location, mode, exclude_build_configurations, final_target)
376
+ end
377
+
378
+ # Create .rcinfo into `Pods` directory as that .xcodeproj reads configuration from .xcodeproj location
379
+ pods_proj_directory = installer_context.sandbox_root
380
+
381
+ # Manual .rcinfo generation (in YAML format)
382
+ save_rcinfo({'extra_configuration_file' => "#{user_proj_directory}/.rcinfo"}, pods_proj_directory)
383
+
384
+ installer_context.pods_project.save()
385
+ end
386
+
387
+ # Enabled/disable XCRemoteCache for the main (user) project
327
388
  begin
328
- prepare_result = YAML.load`#{xcrc_location}/xcprepare --configuration #{check_build_configuration} --platform #{check_platform}`
389
+ prepare_result = YAML.load`#{xcrc_location_absolute}/xcprepare --configuration #{check_build_configuration} --platform #{check_platform}`
329
390
  unless prepare_result['result'] || mode != 'consumer'
330
391
  # Uninstall the XCRemoteCache for the consumer mode
331
392
  disable_xcremotecache(user_project)
@@ -338,26 +399,11 @@ module CocoapodsXCRemoteCacheModifier
338
399
  next
339
400
  end
340
401
 
341
- # Attach XCRemoteCache to Pods targets
342
- installer_context.pods_project.targets.each do |target|
343
- next if target.name.start_with?("Pods-")
344
- next if target.name.end_with?("Tests")
345
- next if exclude_targets.include?(target.name)
346
- enable_xcremotecache(target, user_proj_directory, xcrc_location, xccc_location, mode, exclude_build_configurations, check_build_configuration, check_platform, final_target)
347
- end
348
-
349
- # Create .rcinfo into `Pods` directory as that .xcodeproj reads configuration from .xcodeproj location
350
- pods_proj_directory = installer_context.sandbox_root
351
-
352
- # Manual .rcinfo generation (in YAML format)
353
- save_rcinfo({'extra_configuration_file' => "#{user_proj_directory}/.rcinfo"}, pods_proj_directory)
354
-
355
- installer_context.pods_project.save()
356
402
 
357
403
  # Attach XCRC to the app targets
358
404
  user_project.targets.each do |target|
359
405
  next if exclude_targets.include?(target.name)
360
- enable_xcremotecache(target, user_proj_directory, xcrc_location, xccc_location, mode, exclude_build_configurations, check_build_configuration, check_platform, final_target)
406
+ enable_xcremotecache(target, 0, xcrc_location, xccc_location, mode, exclude_build_configurations, final_target)
361
407
  end
362
408
 
363
409
  # Set Target sourcemap
@@ -13,5 +13,5 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module CocoapodsXcremotecache
16
- VERSION = "0.0.2"
16
+ VERSION = "0.0.3"
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-xcremotecache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartosz Polaczyk
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-11-16 00:00:00.000000000 Z
12
+ date: 2021-12-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: CocoaPods plugin that enables XCRemoteCache with the project.
15
15
  email: