cocoapods-bazel 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85537880f86a7c5c9b15a1db278672ae4b1f27c3ead44e3498b653267e66db77
4
- data.tar.gz: 07f5bc07ca05a3fd382588ca0be1d85218b3ff8232e60a1cb477953480c3403b
3
+ metadata.gz: 3286b561998f4b34e299da4b3d8214ff2fe4d81446c1fc7ec71752a2c992052d
4
+ data.tar.gz: 969cb842bba28405f2d0c9450eaccf6e7914925754ccb6e5b40e55ee890f28a8
5
5
  SHA512:
6
- metadata.gz: 48e0089179b162707d5219cadde68f2e98b80c38acbc48a94be25605d3532e5174b6b2c4d8b05da03597c76df46b17ccc8a91e4fe682678257b7662892ba4c5b
7
- data.tar.gz: 141015e3c549842a5a72ef8ed391351230fc163d99d26072df2e1748c97b0002857628e760bc646833fceb6a57cca1ddd736e85c85ec2125ff0b91552f104db0
6
+ metadata.gz: 4b004b7b58351034111a546e53f0884257511de7ba3506c7e711000ea860e0e16d95bfd85b5091fc369eed434c7d32e102e4216b65fdaca6c17bae54da226795
7
+ data.tar.gz: 90bc0315f257f0157c17c0f1da74edea822e8593a81f4ef786adef96c2059f78f5e2e91525a79a488029791d614838a83062f4eb083509e5e784108b44074eb0
data/.gitignore CHANGED
@@ -13,3 +13,4 @@ Gemfile.lock
13
13
  .rspec_status
14
14
 
15
15
  .DS_Store
16
+ .idea
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ 0.1.4
2
+
3
+ * Fix issues with glob evaluation (#64, #65)
4
+ * Get specs running on M1 hardware (#73)
5
+ * Expose CocoaPods environment variables PODS_ROOT and PODS_TARGET_SRCROOT (#67)
6
+ * Mark app specs with public visibility for usage as test apps (#77)
7
+ * README updates for buildifier option and link fixing (#69, #78)
8
+ * Remove non-existent globs to support using --incompatible_disallow_empty_glob (#80, #79)
9
+
1
10
  0.1.3
2
11
 
3
12
  * Add ability to insert a docstring at top of generated build files (#58)
@@ -9,4 +18,4 @@
9
18
 
10
19
  0.1.1
11
20
 
12
- * Raise error and offer suggestion if pod path is outside of current workspace
21
+ * Raise error and offer suggestion if pod path is outside of current workspace
data/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
  ![](https://github.com/ob/cocoapods-bazel/workflows/master/badge.svg)
3
3
 
4
4
 
5
- Cocoapods::Bazel is a Cocoapods plugin that makes it easy to use [Bazel](https://bazel.build) instead of Xcode to build your iOS project. It automatically generates Bazel's `BUILD.bazel` files. It uses [`rules_ios`](https://github.com/ob/rules_ios) so you need to set up the `WORKSPACE` file following the instructions in the [`README`](https://github.com/ob/rules_ios/blob/master/README.md).
5
+ Cocoapods::Bazel is a Cocoapods plugin that makes it easy to use [Bazel](https://bazel.build) instead of Xcode to build your iOS project. It automatically generates Bazel's `BUILD` files.
6
+
7
+ `cocoapods-bazel` can be setup to translate CocoaPod targets to provided Bazel rules. For example, you can use `cocaopods-bazel` to load framework targets using [rules_ios](https://github.com/bazel-ios/rules_ios). It's also flexible enough to allow users to use their own custom rules if needed.
6
8
 
7
9
  > :warning: **This is alpha software.** We are developing this plugin in the open so you should only use it if you know what you are doing and are willing to help develop it.
8
10
 
@@ -16,19 +18,23 @@ gem 'cocoapods-bazel'
16
18
 
17
19
  And then execute:
18
20
 
19
- $ bundle
21
+ ```sh
22
+ bundle install
23
+ ```
20
24
 
21
25
  Or install it yourself as:
22
26
 
23
- $ gem install cocoapods-bazel
27
+ ```sh
28
+ gem install cocoapods-bazel
29
+ ```
24
30
 
25
31
  ## Usage
26
32
 
27
- This plugin will run extra steps after post_install to generate BUILD.bazel files for Bazel.
33
+ This plugin will run extra steps after post_install to generate `BUILD` files for Bazel.
28
34
 
29
- To enable the plugin, simply add the following section to your `Podfile`
35
+ To enable the plugin, you can add something like the following section to your `Podfile`:
30
36
 
31
- ```
37
+ ```ruby
32
38
  plugin 'cocoapods-bazel', {
33
39
  rules: {
34
40
  'apple_framework' => { load: '@build_bazel_rules_ios//rules:framework.bzl', rule: 'apple_framework' }.freeze,
@@ -50,9 +56,19 @@ There are some experimental features that are opt-in and can be enabled adding t
50
56
 
51
57
  Note that tests for the experimental features are located under `spec/integration/experimental_features` and these should mostly replicate the tests under `spec/integration/monorepo` but with the features on. Also it's a place to create tests specific to a experimental feature that not necessarily will affect the default usage of `cocoapods-bazel`.
52
58
 
59
+ ## BUILD file formatting
60
+
61
+ When the `BUILD.bazel` files are generated you may choose to have `cocoapods-bazel` format the files using [buildifier](https://github.com/bazelbuild/buildtools/blob/master/buildifier/README.md). This formatting is enabled by default if a `buildifier` executable is found using `which buildifier`.
62
+
63
+ You can disable buildifier formatting with `buildifier: false` in the options of the `cocoapods-bazel` plugin.
64
+
65
+ Additionally, if you'd like to use a custom `buildifier` executable you can provide the `cocoapods-bazel` plugin options with an array of arguments to execute to format files.
66
+
67
+ For example, if you have `buildifier` runnable target you've defined in Bazel with the name `buildifier` you can run this specific version with: `buildifier: ['bazel', 'run', 'buildifier', '--']`. (Note the `--` allows bazel to forward arguments to the buildifier target).
68
+
53
69
  ## Contributing
54
70
 
55
- Bug reports and pull requests are welcome on GitHub at https://github.com/ob/cocoapods-bazel.
71
+ Bug reports and pull requests are welcome on GitHub [here](https://github.com/bazel-ios/cocoapods-bazel).
56
72
 
57
73
  ## License
58
74
 
@@ -23,4 +23,4 @@ ARGV.replace %w[install]
23
23
 
24
24
  load Gem.bin_path('cocoapods', 'pod')
25
25
 
26
- exec 'bazelisk', '--ignore_all_rc_files', 'build', '--verbose_failures', '...'
26
+ exec 'bazelisk', '--ignore_all_rc_files', 'build', '--verbose_failures', '--cpu=ios_x86_64', '--experimental_worker_allow_json_protocol', '...'
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'set'
4
+
3
5
  require_relative 'xcconfig_resolver'
4
6
 
5
7
  module Pod
@@ -27,8 +29,8 @@ module Pod
27
29
 
28
30
  include XCConfigResolver
29
31
 
30
- attr_reader :installer, :pod_target, :file_accessors, :non_library_spec, :label, :package, :default_xcconfigs, :resolved_xconfig_by_config
31
- private :installer, :pod_target, :file_accessors, :non_library_spec, :label, :package, :default_xcconfigs, :resolved_xconfig_by_config
32
+ attr_reader :installer, :pod_target, :file_accessors, :non_library_spec, :label, :package, :default_xcconfigs, :resolved_xconfig_by_config, :relative_sandbox_root
33
+ private :installer, :pod_target, :file_accessors, :non_library_spec, :label, :package, :default_xcconfigs, :resolved_xconfig_by_config, :relative_sandbox_root
32
34
 
33
35
  def initialize(installer, pod_target, non_library_spec = nil, default_xcconfigs = {}, experimental_deps_debug_and_release = false)
34
36
  @installer = installer
@@ -41,6 +43,7 @@ module Pod
41
43
  @default_xcconfigs = default_xcconfigs
42
44
  @resolved_xconfig_by_config = {}
43
45
  @experimental_deps_debug_and_release = experimental_deps_debug_and_release
46
+ @relative_sandbox_root = installer.sandbox.root.relative_path_from(installer.config.installation_root).to_s
44
47
  end
45
48
 
46
49
  def bazel_label(relative_to: nil)
@@ -55,7 +58,6 @@ module Pod
55
58
  end
56
59
 
57
60
  def build_settings_label(config)
58
- relative_sandbox_root = @installer.sandbox.root.relative_path_from(@installer.config.installation_root).to_s
59
61
  cocoapods_bazel_path = File.join(relative_sandbox_root, 'cocoapods-bazel')
60
62
 
61
63
  "//#{cocoapods_bazel_path}:#{config}"
@@ -342,7 +344,7 @@ module Pod
342
344
  fa.spec_consumer.resource_bundles.each do |name, file_patterns|
343
345
  bundle = bundles[name] ||= {}
344
346
  patterns_by_exclude = bundle[fa.spec_consumer.exclude_files] ||= []
345
- patterns_by_exclude.concat(file_patterns.flat_map { |g| expand_glob(g, expand_directories: false) })
347
+ patterns_by_exclude.concat(file_patterns.flat_map { |g| expand_glob(g, expand_directories: true) })
346
348
  end
347
349
  end.tap do |bundles|
348
350
  kwargs[:resource_bundles] = bundles.map do |bundle_name, patterns_by_excludes|
@@ -521,34 +523,53 @@ module Pod
521
523
  def expand_glob(glob, extensions: nil, expand_directories: false)
522
524
  if (m = glob.match(/\{([^\{\}]+)\}/))
523
525
  m[1].split(',').flat_map do |alt|
524
- expand_glob("#{m.pre_match}#{alt}#{m.post_match}")
526
+ expand_glob("#{m.pre_match}#{alt.strip}#{m.post_match}", extensions: extensions, expand_directories: expand_directories)
525
527
  end.uniq
526
528
  elsif (m = glob.match(/\[([^\[\]]+)\]/))
527
529
  m[1].each_char.flat_map do |alt|
528
- expand_glob("#{m.pre_match}#{alt}#{m.post_match}")
530
+ expand_glob("#{m.pre_match}#{alt.strip}#{m.post_match}", extensions: extensions, expand_directories: expand_directories)
529
531
  end.uniq
530
532
  elsif extensions && File.extname(glob).empty?
531
533
  glob = glob.chomp('**/*') # If we reach here and the glob ends with **/*, we need to avoid duplicating it (we do not want to end up with **/*/**/*)
532
534
  if File.basename(glob) == '*'
533
- extensions.map { |ext| "#{glob}.#{ext}" }
535
+ extensions.map do |ext|
536
+ combined = "#{glob}.#{ext}"
537
+ combined if Dir.glob(File.join(@package_dir, combined)).any?
538
+ end.compact
534
539
  else
535
540
  extensions.map do |ext|
536
- File.join(glob, '**', "*.#{ext}")
537
- end
541
+ combined = File.join(glob, '**', "*.#{ext}")
542
+ combined if Dir.glob(File.join(@package_dir, combined)).any?
543
+ end.compact
538
544
  end
539
545
  elsif expand_directories
540
546
  if glob.end_with?('/**/*')
541
- [glob]
547
+ glob_with_valid_matches(glob)
542
548
  elsif glob.end_with?('/*')
543
549
  [glob.sub(%r{/\*$}, '/**/*')]
550
+ elsif should_skip_directory_expansion(glob)
551
+ glob_with_valid_matches(glob)
544
552
  else
545
- [glob, glob.chomp('/') + '/**/*']
553
+ [glob.chomp('/') + '/**/*']
546
554
  end
547
555
  else
548
- [glob]
556
+ glob_with_valid_matches(glob)
549
557
  end
550
558
  end
551
559
 
560
+ # Returns `[glob]` if the given pattern has at least 1 match on disk, otherwise returns an empty array
561
+ def glob_with_valid_matches(glob)
562
+ Dir.glob(File.join(@package_dir, glob)).any? ? [glob] : []
563
+ end
564
+
565
+ # We should expand only folder globs, not expand file globs.
566
+ # E.g., xib files glob "*.xib" should not be expanded to "*.xib/**/*", otherise nothing will be matched
567
+ def should_skip_directory_expansion(glob)
568
+ extension = File.extname(glob)
569
+ expansion_extentions = Set['.xcassets', '.xcdatamodeld', '.lproj']
570
+ !expansion_extentions.include?(extension)
571
+ end
572
+
552
573
  def rules_ios_platform_name(platform)
553
574
  name = platform.string_name.downcase
554
575
  return 'macos' if name == 'osx'
@@ -570,7 +591,7 @@ module Pod
570
591
  def test_kwargs
571
592
  {
572
593
  bundle_id: resolved_value_by_build_setting('PRODUCT_BUNDLE_IDENTIFIER'),
573
- env: pod_target.scheme_for_spec(non_library_spec).fetch(:environment_variables, {}),
594
+ env: resolve_env(pod_target.scheme_for_spec(non_library_spec).fetch(:environment_variables, {})),
574
595
  infoplists_by_build_setting: pod_target_infoplists_by_build_setting,
575
596
  infoplists: common_pod_target_infoplists(additional_plist: nil_if_empty(non_library_spec.consumer(pod_target.platform).info_plist)),
576
597
  minimum_os_version: build_os_version || pod_target.deployment_target_for_non_library_spec(non_library_spec),
@@ -578,6 +599,25 @@ module Pod
578
599
  }
579
600
  end
580
601
 
602
+ # Resolves the given environment by resolving CocoaPod specific environment variables.
603
+ # Given an environment with unresolved env values, this function resolves them and returns the new env.
604
+ def resolve_env(env)
605
+ # These environment variables are resolved by CocoaPods, they tend to be used in tests and other
606
+ # scripts, as such we must resolve them before translating the targets environment.
607
+ resolved_cocoapods_env = {
608
+ 'PODS_ROOT' => "//#{relative_sandbox_root}",
609
+ 'PODS_TARGET_SRCROOT' => ':'
610
+ }.freeze
611
+
612
+ # Removes the : bazel prefix for current directory.
613
+ sub_prefix = ->(s) { s.sub(%r{\A:/}, '') }
614
+
615
+ env.each_with_object({}) do |(k, v), resolved_env|
616
+ resolved_val = Pod::Bazel::Util.resolve_value(v, resolved_values: resolved_cocoapods_env)
617
+ resolved_env[k] = sub_prefix[resolved_val]
618
+ end
619
+ end
620
+
581
621
  def build_os_version
582
622
  # If there's a SWIFT_DEPLOYMENT_TARGET version set, use that for the
583
623
  # minimum version. It's not currently supported or desirable in rules_ios to have
@@ -621,7 +661,8 @@ module Pod
621
661
  settings_bundle: [],
622
662
  strings: [],
623
663
  version: [],
624
- watch_application: []
664
+ watch_application: [],
665
+ visibility: ['//visibility:public']
625
666
  }
626
667
 
627
668
  # If the user has set a different build os set that here
@@ -10,6 +10,18 @@ module Pod
10
10
  sort_keys.sort_by { |k| [k.phase, k.split, k.value, k.original_index] }.map(&:value)
11
11
  end
12
12
 
13
+ # Recursively resolves the variables in string with the given resolved values.
14
+ #
15
+ # Example: Given string = "${PODS_ROOT}/Foo", resolved_values = {"PODS_ROOT": "//Pods"}
16
+ # this function returns "//Pods/Foo".
17
+ def resolve_value(string, resolved_values:)
18
+ return string unless string =~ /\$(?:\{([_a-zA-Z0-0]+?)\}|\(([_a-zA-Z0-0]+?)\))/
19
+
20
+ match, key = Regexp.last_match.values_at(0, 1, 2).compact
21
+ sub = resolved_values.fetch(key, '')
22
+ resolve_value(string.gsub(match, sub), resolved_values: resolved_values)
23
+ end
24
+
13
25
  class SortKey
14
26
  attr_reader :phase, :split, :value, :original_index
15
27
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Pod
4
4
  module Bazel
5
- VERSION = '0.1.3'
5
+ VERSION = '0.1.4'
6
6
  end
7
7
  end
@@ -8,8 +8,10 @@ module Pod
8
8
  def resolved_build_setting_value(setting, settings:)
9
9
  return unless (value = settings[setting])
10
10
 
11
+ # Removes the : bazel prefix for current directory.
11
12
  sub_prefix = ->(s) { s.sub(%r{\A:/}, '') }
12
- resolved = resolve_string_with_build_settings(value, settings: settings)
13
+
14
+ resolved = Pod::Bazel::Util.resolve_value(value, resolved_values: settings)
13
15
  if Pod::Target::BuildSettings::PLURAL_SETTINGS.include?(setting)
14
16
  resolved.shellsplit.reject(&:empty?).map(&sub_prefix)
15
17
  else
@@ -17,20 +19,13 @@ module Pod
17
19
  end
18
20
  end
19
21
 
20
- def resolve_string_with_build_settings(string, settings:)
21
- return string unless string =~ /\$(?:\{([_a-zA-Z0-0]+?)\}|\(([_a-zA-Z0-0]+?)\))/
22
-
23
- match, key = Regexp.last_match.values_at(0, 1, 2).compact
24
- sub = settings.fetch(key, '')
25
- resolve_string_with_build_settings(string.gsub(match, sub), settings: settings)
26
- end
27
-
28
22
  UNRESOLVED_SETTINGS = [
29
23
  'CONFIGURATION', # not needed, only used to help resolve other settings that may use it in substitutions
30
24
  'HEADER_SEARCH_PATHS', # serialized into copts, handled natively by Xcode instead of via xcspecs
31
25
  'OTHER_CFLAGS', # serialized separately as objc_copts
32
26
  'OTHER_SWIFT_FLAGS', # serialized separately as swift_copts
33
27
  'OTHER_LDFLAGS', # serialized separately as linkopts
28
+ 'PODS_ROOT', # not needed, used to help resolve the Pods root path relative to the current package
34
29
  'PODS_TARGET_SRCROOT', # not needed, used to help resolve file references relative to the current package
35
30
  'SDKROOT', # not needed since the SDKROOT gets propagated via the apple configuration transition
36
31
  'SRCROOT', # not needed, used to help resolve file references relative to the current workspace
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-bazel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shawn Chen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-01-26 00:00:00.000000000 Z
12
+ date: 2022-11-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  requirements: []
96
- rubygems_version: 3.1.4
96
+ rubygems_version: 3.1.6
97
97
  signing_key:
98
98
  specification_version: 4
99
99
  summary: A plugin for CocoaPods that generates Bazel build files for pods