cocoapods-spm 0.1.3 → 0.1.5

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cocoapods-spm/command/clean.rb +31 -0
  3. data/lib/cocoapods-spm/command/macro/deprecated.rb +35 -0
  4. data/lib/cocoapods-spm/command/macro/fetch.rb +33 -0
  5. data/lib/cocoapods-spm/command/macro/prebuild.rb +37 -0
  6. data/lib/cocoapods-spm/command/macro.rb +14 -0
  7. data/lib/cocoapods-spm/command/spm.rb +2 -2
  8. data/lib/cocoapods-spm/config/spm.rb +11 -3
  9. data/lib/cocoapods-spm/def/podfile.rb +9 -5
  10. data/lib/cocoapods-spm/def/spm_dependency.rb +3 -1
  11. data/lib/cocoapods-spm/def/spm_package.rb +3 -1
  12. data/lib/cocoapods-spm/helpers/io.rb +13 -0
  13. data/lib/cocoapods-spm/helpers/patch.rb +14 -0
  14. data/lib/cocoapods-spm/hooks/helpers/update_script.rb +61 -0
  15. data/lib/cocoapods-spm/hooks/post_integrate/5.update_settings.rb +24 -35
  16. data/lib/cocoapods-spm/hooks/post_integrate/6.update_embed_frameworks_script.rb +14 -36
  17. data/lib/cocoapods-spm/hooks/post_integrate/7.update_copy_resources_script.rb +33 -0
  18. data/lib/cocoapods-spm/macro/metadata.rb +11 -0
  19. data/lib/cocoapods-spm/macro/prebuilder.rb +7 -6
  20. data/lib/cocoapods-spm/main.rb +2 -1
  21. data/lib/cocoapods-spm/patch/aggregate_target.rb +15 -3
  22. data/lib/cocoapods-spm/patch/installer.rb +6 -7
  23. data/lib/cocoapods-spm/resolver/recursive_target_resolver.rb +37 -0
  24. data/lib/cocoapods-spm/resolver/result.rb +27 -23
  25. data/lib/cocoapods-spm/resolver/umbrella_package.rb +9 -4
  26. data/lib/cocoapods-spm/resolver.rb +6 -8
  27. data/lib/cocoapods-spm/swift/package/base.rb +54 -0
  28. data/lib/cocoapods-spm/swift/package/dependency.rb +27 -0
  29. data/lib/cocoapods-spm/swift/package/description.rb +76 -0
  30. data/lib/cocoapods-spm/swift/package/product.rb +17 -0
  31. data/lib/cocoapods-spm/swift/package/project_packages.rb +58 -0
  32. data/lib/cocoapods-spm/swift/package/resources.rb +17 -0
  33. data/lib/cocoapods-spm/swift/package/target.rb +154 -0
  34. metadata +20 -7
  35. data/lib/cocoapods-spm/command/fetch.rb +0 -31
  36. data/lib/cocoapods-spm/command/prebuild.rb +0 -35
  37. data/lib/cocoapods-spm/metadata.rb +0 -50
  38. data/lib/cocoapods-spm/resolver/product.rb +0 -31
  39. data/lib/cocoapods-spm/resolver/product_dep_resolver.rb +0 -134
@@ -1,13 +1,25 @@
1
+ require "cocoapods-spm/helpers/patch"
2
+
1
3
  module Pod
2
4
  class AggregateTarget
3
- alias origin_includes_frameworks? includes_frameworks?
5
+ include Mixin::PatchingBehavior
6
+
7
+ private
4
8
 
5
- def includes_frameworks?
9
+ patch_method :includes_frameworks? do
6
10
  origin_includes_frameworks? || includes_dynamic_spm_dependencies?
7
11
  end
8
12
 
13
+ patch_method :includes_resources? do
14
+ origin_includes_resources? || includes_spm_resouces?
15
+ end
16
+
9
17
  def includes_dynamic_spm_dependencies?
10
- podfile.spm_resolver.result.spm_products_for(self).any?(&:dynamic?)
18
+ podfile.spm_resolver.result.spm_targets_for(self).any?(&:dynamic?)
19
+ end
20
+
21
+ def includes_spm_resouces?
22
+ !podfile.spm_resolver.result.spm_targets_for(self).all? { |t| t.resources.empty? }
11
23
  end
12
24
  end
13
25
  end
@@ -1,19 +1,19 @@
1
+ require "cocoapods-spm/helpers/patch"
1
2
  require "cocoapods-spm/resolver"
2
3
  require "cocoapods-spm/macro/pod_installer"
3
4
  require "cocoapods-spm/hooks/base"
4
5
 
5
6
  module Pod
6
7
  class Installer
8
+ include Mixin::PatchingBehavior
7
9
  include SPM::Config::Mixin
8
10
 
9
- alias origin_resolve_dependencies resolve_dependencies
10
- def resolve_dependencies
11
+ patch_method :resolve_dependencies do
11
12
  origin_resolve_dependencies
12
13
  resolve_spm_dependencies
13
14
  end
14
15
 
15
- alias origin_create_pod_installer create_pod_installer
16
- def create_pod_installer(pod_name)
16
+ patch_method :create_pod_installer do |pod_name|
17
17
  if macro_pods.include?(pod_name)
18
18
  macro_pod_installer = MacroPodInstaller.new(
19
19
  sandbox,
@@ -28,8 +28,7 @@ module Pod
28
28
  end
29
29
  end
30
30
 
31
- alias origin_integrate integrate
32
- def integrate
31
+ patch_method :integrate do
33
32
  run_spm_pre_integrate_hooks
34
33
  origin_integrate
35
34
  run_spm_post_integrate_hooks
@@ -40,7 +39,7 @@ module Pod
40
39
  def hook_options
41
40
  {
42
41
  :spm_resolver => @spm_resolver,
43
- :analysis_result => @analysis_result
42
+ :analysis_result => @analysis_result,
44
43
  }
45
44
  end
46
45
 
@@ -0,0 +1,37 @@
1
+ module Pod
2
+ module SPM
3
+ class Resolver
4
+ class RecursiveTargetResolver
5
+ require "cocoapods-spm/swift/package/project_packages"
6
+
7
+ include Config::Mixin
8
+
9
+ def initialize(podfile, result)
10
+ @podfile = podfile
11
+ @result = result
12
+ end
13
+
14
+ def resolve
15
+ resolve_recursive_targets
16
+ end
17
+
18
+ private
19
+
20
+ def project_pkgs
21
+ @result.project_pkgs ||= Swift::ProjectPackages.new(
22
+ src_dir: spm_config.pkg_checkouts_dir,
23
+ write_json_to_dir: spm_config.pkg_metadata_dir
24
+ )
25
+ end
26
+
27
+ def resolve_recursive_targets
28
+ @result.spm_dependencies_by_target.values.flatten.uniq(&:product).each do |dep|
29
+ next if dep.pkg.use_default_xcode_linking?
30
+
31
+ project_pkgs.resolve_recursive_targets_of(dep.pkg.name, dep.product)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -2,48 +2,52 @@ module Pod
2
2
  module SPM
3
3
  class Resolver
4
4
  class Result
5
+ include Config::Mixin
6
+
7
+ ATTRS = {
8
+ :spm_pkgs => [],
9
+ :spm_dependencies_by_target => {},
10
+ :project_pkgs => nil,
11
+ }.freeze
12
+
5
13
  class WritableResult < Result
6
- attr_accessor :spm_pkgs, :spm_dependencies_by_target, :spm_products, :metadata_cache
14
+ ATTRS.each_key { |x| attr_accessor x }
7
15
 
8
16
  def to_read_only
9
- Result.new(
10
- spm_pkgs: spm_pkgs,
11
- spm_dependencies_by_target: spm_dependencies_by_target,
12
- spm_products: spm_products,
13
- metadata_cache: metadata_cache
14
- )
17
+ Result.new(ATTRS.to_h { |x| [x, instance_variable_get("@#{x}")] })
15
18
  end
16
19
  end
17
20
 
18
- attr_reader :spm_pkgs, :spm_dependencies_by_target, :spm_products, :metadata_cache
21
+ ATTRS.each_key { |x| attr_reader x }
19
22
 
20
23
  def initialize(options = {})
21
- @spm_pkgs = options[:spm_pkgs] || []
22
- @spm_dependencies_by_target = options[:spm_dependencies_by_target] || {}
23
- @spm_products = options[:spm_products] || {}
24
- @metadata_cache = options[:metadata_cache] || {}
24
+ ATTRS.each do |k, v|
25
+ instance_variable_set("@#{k}", options[k] || v)
26
+ end
25
27
  end
26
28
 
27
- def metadata_of(name)
28
- return @metadata_cache[name] if @metadata_cache.key?(name)
29
-
30
- raise Informative, "Metadata of `#{name}` does not exist"
29
+ def spm_pkgs_for(target)
30
+ spm_dependencies_for(target).map(&:pkg).uniq(&:name)
31
31
  end
32
32
 
33
33
  def spm_dependencies_for(target)
34
34
  @spm_dependencies_by_target[target.to_s].to_a
35
35
  end
36
36
 
37
- def spm_products_for(target)
38
- spm_dependencies_for(target).flat_map { |d| @spm_products[d.product].to_a }.uniq(&:name)
37
+ def spm_targets_for(target, exclude_default_xcode_linking: true)
38
+ targets = spm_dependencies_for(target).flat_map do |d|
39
+ project_pkgs.resolve_recursive_targets_of(d.pkg.name, d.product)
40
+ end.uniq(&:name)
41
+ return targets.reject(&:use_default_xcode_linking?) if exclude_default_xcode_linking
42
+
43
+ targets
39
44
  end
40
45
 
41
46
  def linker_flags_for(target)
42
- flags = spm_dependencies_for(target).flat_map { |d| d.pkg.linker_flags }
43
- flags += spm_products_for(target).map do |p|
44
- p.linked_as_framework? ? "-framework \"#{p.name}\"" : "-l\"#{p.name}.o\""
45
- end
46
- flags.uniq
47
+ (
48
+ spm_targets_for(target).flat_map(&:linker_flags) +
49
+ spm_pkgs_for(target).flat_map(&:linker_flags)
50
+ ).uniq
47
51
  end
48
52
  end
49
53
  end
@@ -56,10 +56,15 @@ module Pod
56
56
  end
57
57
 
58
58
  def create_symlinks_to_local_pkgs
59
- @spm_pkgs.select(&:local?).each do |pkg|
60
- dst_dir = spm_config.pkg_checkouts_dir / pkg.slug
61
- dst_dir.delete if dst_dir.exist?
62
- File.symlink(pkg.absolute_path, dst_dir)
59
+ local_spm_pkgs = @spm_pkgs.select(&:local?)
60
+ symlinks = local_spm_pkgs.to_h { |p| [p.slug, p.absolute_path] }
61
+ local_spm_pkgs.each do |pkg|
62
+ pkg_desc = Swift::PackageDescription.from_dir(pkg.absolute_path)
63
+ pkg_desc.dependencies.select(&:local?).each { |d| symlinks[d.slug] = d.path }
64
+ end
65
+
66
+ symlinks.each do |slug, src_dir|
67
+ IOUtils.symlink(src_dir, spm_config.pkg_checkouts_dir / slug)
63
68
  end
64
69
  end
65
70
  end
@@ -6,20 +6,22 @@ module Pod
6
6
  class Resolver
7
7
  require "cocoapods-spm/resolver/result"
8
8
  require "cocoapods-spm/resolver/target_dep_resolver"
9
- require "cocoapods-spm/resolver/product_dep_resolver"
9
+ require "cocoapods-spm/resolver/recursive_target_resolver"
10
10
 
11
11
  def initialize(podfile, aggregate_targets)
12
12
  @_result = Result::WritableResult.new
13
13
  @podfile = podfile
14
14
  @aggregate_targets = aggregate_targets
15
15
  @umbrella_pkg = nil
16
- @target_dep_resolver = TargetDependencyResolver.new(podfile, aggregate_targets, @_result)
17
- @product_dep_resolver = ProductDependencyResolver.new(podfile, @_result)
16
+ @resolvers = [
17
+ TargetDependencyResolver.new(podfile, aggregate_targets, @_result),
18
+ RecursiveTargetResolver.new(podfile, @_result),
19
+ ]
18
20
  end
19
21
 
20
22
  def resolve
21
23
  generate_umbrella_pkg
22
- resolvers.each(&:resolve)
24
+ @resolvers.each(&:resolve)
23
25
  validate!
24
26
  end
25
27
 
@@ -29,10 +31,6 @@ module Pod
29
31
 
30
32
  private
31
33
 
32
- def resolvers
33
- [@target_dep_resolver, @product_dep_resolver]
34
- end
35
-
36
34
  def generate_umbrella_pkg
37
35
  @umbrella_pkg = Pod::SPM::UmbrellaPackage.new(@podfile).prepare
38
36
  end
@@ -0,0 +1,54 @@
1
+ require "json"
2
+
3
+ module Pod
4
+ module Swift
5
+ class PackageDescriptionBaseObject
6
+ attr_reader :raw, :parent
7
+
8
+ def initialize(raw, parent: nil)
9
+ @raw = raw
10
+ @parent = parent
11
+ end
12
+
13
+ def root
14
+ @root ||= begin
15
+ node = self
16
+ node = node.parent until node.parent.nil?
17
+ node
18
+ end
19
+ end
20
+
21
+ def pkg_name
22
+ root.name
23
+ end
24
+
25
+ def self.from_s(str)
26
+ new(JSON.parse(str))
27
+ end
28
+
29
+ def self.from_file(path)
30
+ from_s(File.read(path))
31
+ end
32
+
33
+ def inspect
34
+ "#<#{self.class} #{name}>"
35
+ end
36
+
37
+ alias to_s inspect
38
+
39
+ def [](key)
40
+ raw[key]
41
+ end
42
+
43
+ def name
44
+ raw["name"]
45
+ end
46
+
47
+ def dup_with_attrs(options = {})
48
+ copy = dup
49
+ options.each { |key, value| copy.instance_variable_set("@#{key}", value) }
50
+ copy
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,27 @@
1
+ require "cocoapods-spm/swift/package/base"
2
+
3
+ module Pod
4
+ module Swift
5
+ class PackageDescription
6
+ class Dependency < PackageDescriptionBaseObject
7
+ def local?
8
+ raw.key?("fileSystem")
9
+ end
10
+
11
+ def slug
12
+ hash["identity"]
13
+ end
14
+
15
+ def path
16
+ hash["path"]
17
+ end
18
+
19
+ private
20
+
21
+ def hash
22
+ raw.values.flatten[0] || {}
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,76 @@
1
+ require "cocoapods-spm/swift/package/base"
2
+
3
+ module Pod
4
+ module Swift
5
+ class PackageDescription < PackageDescriptionBaseObject
6
+ include SPM::Config::Mixin
7
+ autoload :Dependency, "cocoapods-spm/swift/package/dependency"
8
+ autoload :Target, "cocoapods-spm/swift/package/target"
9
+ autoload :Product, "cocoapods-spm/swift/package/product"
10
+
11
+ def self.from_dir(dir)
12
+ raw = `swift package dump-package --package-path #{dir.shellescape}`
13
+ from_s(raw)
14
+ end
15
+
16
+ def src_dir
17
+ @src_dir ||= begin
18
+ path = raw.fetch("packageKind", {}).fetch("root", [])[0]
19
+ Pathname.new(path) unless path.nil?
20
+ end
21
+ end
22
+
23
+ def checkouts_dir
24
+ src_dir.parent
25
+ end
26
+
27
+ def artifacts_dir
28
+ spm_config.pkg_artifacts_dir / slug
29
+ end
30
+
31
+ def slug
32
+ src_dir.nil? ? name : src_dir.basename.to_s
33
+ end
34
+
35
+ def dependencies
36
+ @dependencies ||= convert_field("dependencies", Dependency)
37
+ end
38
+
39
+ def targets
40
+ @targets ||= convert_field("targets", Target)
41
+ end
42
+
43
+ def products
44
+ @products ||= convert_field("products", Product)
45
+ end
46
+
47
+ def targets_of_product(name)
48
+ matched_products = products.select { |p| p.name == name }
49
+ dynamic = matched_products.any?(&:dynamic?)
50
+ matched_products
51
+ .flat_map do |p|
52
+ targets.select { |t| p.target_names.include?(t.name) }.map do |t|
53
+ t.dup_with_attrs(dynamic: dynamic, product_name: name)
54
+ end
55
+ end
56
+ end
57
+
58
+ def macro_impl_name
59
+ targets.find(&:macro?)&.name
60
+ end
61
+
62
+ def use_default_xcode_linking?
63
+ return @use_default_xcode_linking unless @use_default_xcode_linking.nil?
64
+
65
+ pkg = pod_config.podfile.spm_pkgs.find { |t| t.name == name }
66
+ @use_default_xcode_linking = pkg&.use_default_xcode_linking?
67
+ end
68
+
69
+ private
70
+
71
+ def convert_field(name, type)
72
+ raw.fetch(name, []).flat_map { |h| type.new(h, parent: self) }
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,17 @@
1
+ require "cocoapods-spm/swift/package/base"
2
+
3
+ module Pod
4
+ module Swift
5
+ class PackageDescription
6
+ class Product < PackageDescriptionBaseObject
7
+ def dynamic?
8
+ @dynamic ||= raw.fetch("type", {}).fetch("library", []).include?("dynamic")
9
+ end
10
+
11
+ def target_names
12
+ raw["targets"]
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,58 @@
1
+ require "cocoapods-spm/swift/package/description"
2
+
3
+ module Pod
4
+ module Swift
5
+ class ProjectPackages
6
+ def initialize(options = {})
7
+ @src_dir = options[:src_dir]
8
+ raise Informative, "src_dir must not be nil" if @src_dir.nil?
9
+
10
+ @json_dir = options[:write_json_to_dir]
11
+ @pkg_desc_cache = {}
12
+ load
13
+ end
14
+
15
+ def resolve_recursive_targets_of(pkg_name, product_name)
16
+ @recursive_targets_cache ||= {}
17
+ return @recursive_targets_cache[product_name] if @recursive_targets_cache.key(product_name)
18
+
19
+ res = []
20
+ to_visit = pkg_desc_of(pkg_name).targets_of_product(product_name)
21
+ until to_visit.empty?
22
+ target = to_visit.pop
23
+ res << target
24
+ # Exclude macros as they wont be linked to the project's binary
25
+ # https://github.com/trinhngocthuyen/cocoapods-spm/issues/107
26
+ to_visit += target.resolve_dependencies(@pkg_desc_cache).reject(&:macro?)
27
+ end
28
+ @recursive_targets_cache[product_name] = res.uniq(&:name)
29
+ end
30
+
31
+ def pkg_desc_of(name)
32
+ return @pkg_desc_cache[name] if @pkg_desc_cache.key?(name)
33
+
34
+ raise Informative, "Package description of `#{name}` does not exist!"
35
+ end
36
+
37
+ private
38
+
39
+ def load
40
+ @src_dir.glob("*").each do |dir|
41
+ next if dir.glob("Package*.swift").empty?
42
+
43
+ pkg_desc = PackageDescription.from_dir(dir)
44
+ name = pkg_desc.name
45
+ slug = dir.basename.to_s
46
+ @pkg_desc_cache[name] = pkg_desc
47
+ @pkg_desc_cache[slug] = pkg_desc
48
+ next if @json_dir.nil?
49
+
50
+ json_path = @json_dir / "#{name}.json"
51
+ slug_json_path = @json_dir / "#{slug}.json"
52
+ json_path.write(pkg_desc.raw.to_json)
53
+ IOUtils.symlink(json_path, slug_json_path) unless name == slug
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,17 @@
1
+ require "cocoapods-spm/swift/package/base"
2
+
3
+ module Pod
4
+ module Swift
5
+ class PackageDescription
6
+ class Resources < PackageDescriptionBaseObject
7
+ def name
8
+ "#{pkg_name}_#{parent.name}"
9
+ end
10
+
11
+ def built_resource_path
12
+ "${PODS_CONFIGURATION_BUILD_DIR}/#{name}.bundle"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,154 @@
1
+ require "cocoapods-spm/swift/package/base"
2
+
3
+ module Pod
4
+ module Swift
5
+ class PackageDescription
6
+ autoload :Resources, "cocoapods-spm/swift/package/resources"
7
+
8
+ class Target < PackageDescriptionBaseObject
9
+ def type
10
+ raw["type"]
11
+ end
12
+
13
+ def macro?
14
+ type == "macro"
15
+ end
16
+
17
+ def binary?
18
+ return @binary unless @binary.nil?
19
+
20
+ @binary = type == "binary"
21
+ end
22
+
23
+ def dynamic?
24
+ @dynamic
25
+ end
26
+
27
+ def framework_name
28
+ @product_name || name
29
+ end
30
+
31
+ def sources_path
32
+ @sources_path ||= begin
33
+ path = raw["path"] || "Sources/#{name}"
34
+ root.src_dir / path
35
+ end
36
+ end
37
+
38
+ def header_search_path_arg
39
+ return nil if public_headers_path.nil?
40
+
41
+ path = public_headers_path.to_s.sub(root.checkouts_dir.to_s, "${SOURCE_PACKAGES_CHECKOUTS_DIR}")
42
+ "\"#{path}\""
43
+ end
44
+
45
+ def public_headers_path
46
+ res = sources_path / raw["publicHeadersPath"] if raw.key?("publicHeadersPath")
47
+ res = implicit_public_headers if res.nil?
48
+ res
49
+ end
50
+
51
+ def implicit_public_headers
52
+ path = sources_path / "include"
53
+ path unless path.glob("**/*.h*").empty?
54
+ end
55
+
56
+ def use_generated_modulemap?
57
+ return false if public_headers_path.nil?
58
+
59
+ # If there exists module.modulemap, it'll be auto picked up during compilation
60
+ true if public_headers_path.glob("module.modulemap").empty?
61
+ end
62
+
63
+ def clang_modulemap_arg
64
+ return nil unless use_generated_modulemap?
65
+
66
+ "-fmodule-map-file=\"${GENERATED_MODULEMAP_DIR}/#{name}.modulemap\""
67
+ end
68
+
69
+ def resources
70
+ res = raw.fetch("resources", []).flat_map { |h| Resources.new(h, parent: self) }
71
+ res = implicit_resources if res.empty?
72
+ res
73
+ end
74
+
75
+ def implicit_resources
76
+ target_sources_path = raw["path"] || "Sources/#{name}"
77
+ target_sources_path = root.src_dir / target_sources_path
78
+
79
+ # Refer to the following link for the implicit resources
80
+ # https://developer.apple.com/documentation/xcode/bundling-resources-with-a-swift-package#Add-resource-files
81
+ patterns = [
82
+ "*.xcassets",
83
+ "*.xib",
84
+ "*.storyboard",
85
+ "*.xcdatamodeld",
86
+ "*.lproj",
87
+ ]
88
+ return [] if patterns.all? { |p| target_sources_path.glob(p).empty? }
89
+
90
+ [Resources.new({}, parent: self)]
91
+ end
92
+
93
+ def linker_flags
94
+ return ["-framework \"#{framework_name}\""] if dynamic?
95
+ return ["-l\"#{name}.o\""] unless binary?
96
+
97
+ case binary_basename
98
+ when /(\S+)\.framework/ then ["-framework \"#{$1}\""]
99
+ when /lib(\S+)\.(a|dylib)/ then ["-l\"#{$1}\""]
100
+ when /(\S+\.(a|dylib))/ then ["\"${PODS_CONFIGURATION_BUILD_DIR}/#{$1}\""]
101
+ else []
102
+ end
103
+ end
104
+
105
+ def resolve_dependencies(pkg_desc_cache)
106
+ raw.fetch("dependencies", []).flat_map do |hash|
107
+ type = ["byName", "target", "product"].find { |k| hash.key?(k) }
108
+ if type.nil?
109
+ raise Informative, "Unexpected dependency type. Must be either `byName`, `target`, or `product`."
110
+ end
111
+
112
+ name = hash[type][0]
113
+ pkg_name = hash.key?("product") ? hash["product"][1] : self.pkg_name
114
+ pkg_desc = pkg_desc_cache[pkg_name]
115
+ find_by_target = -> { pkg_desc.targets.select { |t| t.name == name } }
116
+ find_by_product = -> { pkg_desc.targets_of_product(name) }
117
+ next find_by_target.call if hash.key?("target")
118
+ next find_by_product.call if hash.key?("product")
119
+
120
+ # byName, could be either a target or a product
121
+ next find_by_target.call || find_by_product.call
122
+ end
123
+ end
124
+
125
+ def built_framework_path
126
+ "${BUILT_PRODUCTS_DIR}/PackageFrameworks/#{framework_name}.framework"
127
+ end
128
+
129
+ def xcframework
130
+ @xcframework ||= begin
131
+ path = (root.artifacts_dir / name).glob("*.xcframework")[0]
132
+ Xcode::XCFramework.new(name, path.realpath) unless path.nil?
133
+ end
134
+ end
135
+
136
+ def binary_basename
137
+ return nil unless binary?
138
+
139
+ @binary_basename ||= begin
140
+ xcframework_dir ||= (root.artifacts_dir / name).glob("*.xcframework")[0]
141
+ xcframework_dir ||= root.src_dir / raw["path"] if raw.key?("path")
142
+ paths = xcframework_dir.glob("*/*.{a,framework}")
143
+ UI.warn "Cannot detect binary_basename for #{name}" if paths.empty?
144
+ paths[0].basename.to_s unless paths.empty?
145
+ end
146
+ end
147
+
148
+ def use_default_xcode_linking?
149
+ root.use_default_xcode_linking?
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end