cocoapods-spm 0.0.2.rc7194768598 → 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: 023cb57cc496da534db60773efea73bdcdc40a869a7edeee06e52c16344dbe98
4
- data.tar.gz: 5cc2ca8ee116d74324e187a1a3150386f74e01a9994f5d4a05278fc55820986f
3
+ metadata.gz: 43e96257dc89796c000a5115e81d36fc9ef9df8208eba676a2fd1b6961864b84
4
+ data.tar.gz: 1aafa45b40759edbcb3e3ceee7a699038ca2638f8d6c432bd8a4dce2a5321783
5
5
  SHA512:
6
- metadata.gz: c3ee693e680264039630ac55ea94d477bab5a5e8e264b3af1f9d696b40d2d232a4e006495746d1b2722b633acabee97b937be065d1e4eb465554b41cdff33d90
7
- data.tar.gz: 87e655ba9232d80f6277bfef1cf234876fd8a164dcac3e2a2be1298f313b2528ed267ff5697cc40c21039c5672df2659f19b914b448cc47947486f9179006aa8
6
+ metadata.gz: c6673bab5c9be9aef9834c835fa6f732e7107cd19dedee9fade7674a11da5e08a59456e829a867e5dc5bc683a7506009bd947178f3b1184ed4e2d8f3100798e8
7
+ data.tar.gz: db59493b90243638c878ed6d9140155c9059f147ee3dda1c826ea2d2c0739329d10ddf2e5c6c5b53968b6cb85ba9159421e3405fae66d5f2ba340869f13bf5cf
@@ -3,6 +3,8 @@ require "cocoapods-spm/config"
3
3
  module Pod
4
4
  class Podfile
5
5
  module DSL
6
+ attr_accessor :spm_analyzer
7
+
6
8
  alias origin_pod pod
7
9
  def config_cocoapods_spm(options)
8
10
  SPM::Config.instance.dsl_config = options
@@ -26,6 +28,19 @@ module Pod
26
28
  current_target_definition.store_spm_pkg(name, options)
27
29
  end
28
30
 
31
+ def spm_pkgs_for(target)
32
+ spm_pkgs_by_aggregate_target[target.to_s]
33
+ end
34
+
35
+ def spm_pkgs_by_aggregate_target
36
+ @spm_pkgs_by_aggregate_target ||= begin
37
+ common_spm_pkgs = root_target_definitions.flat_map(&:spm_pkgs)
38
+ target_definition_list.reject(&:abstract?).to_h do |target|
39
+ [target.to_s, (common_spm_pkgs + target.spm_pkgs).uniq(&:name)]
40
+ end
41
+ end
42
+ end
43
+
29
44
  private
30
45
 
31
46
  def prepare_macro_pod_dir(name, requirement)
@@ -14,6 +14,15 @@ module Pod
14
14
  @pkg = pkg
15
15
  end
16
16
 
17
+ def linkage
18
+ # TODO: How to detect the linkage of an SPM library?
19
+ @pkg.linkage.is_a?(Hash) ? @pkg.linkage[@product] : @pkg.linkage
20
+ end
21
+
22
+ def dynamic?
23
+ linkage == :dynamic
24
+ end
25
+
17
26
  def inspect
18
27
  "#<#{self.class} name=#{name} product=#{product} pkg=#{pkg}>"
19
28
  end
@@ -4,7 +4,7 @@ require "cocoapods-spm/def/spm_dependency"
4
4
  module Pod
5
5
  module SPM
6
6
  class Package
7
- attr_reader :name, :requirement, :url, :relative_path
7
+ attr_reader :name, :requirement, :url, :relative_path, :linkage
8
8
 
9
9
  def initialize(name, options = {})
10
10
  @name = name
@@ -12,6 +12,7 @@ module Pod
12
12
  @requirement = requirement_from(options)
13
13
  @url = options[:url]
14
14
  @relative_path = options[:relative_path]
15
+ @linkage = options[:linkage]
15
16
  end
16
17
 
17
18
  def inspect
@@ -12,6 +12,13 @@ module Pod
12
12
  ref.product_name = product
13
13
  ref
14
14
  end
15
+
16
+ def create_target_dependency_ref(product)
17
+ ref = project.new(BaseObject::PBXTargetDependency)
18
+ ref.name = product
19
+ ref.product_ref = create_pkg_product_dependency_ref(product)
20
+ ref
21
+ end
15
22
  end
16
23
 
17
24
  BaseObject = Xcodeproj::Project::Object
@@ -35,8 +35,8 @@ module Pod
35
35
  pods_project.targets.each do |target|
36
36
  @spm_analyzer.spm_dependencies_by_target[target.name].to_a.each do |dep|
37
37
  pkg_ref = spm_pkg_refs[dep.pkg.name]
38
- product_ref = pkg_ref.create_pkg_product_dependency_ref(dep.product)
39
- target.package_product_dependencies << product_ref
38
+ target_dep_ref = pkg_ref.create_target_dependency_ref(dep.product)
39
+ target.dependencies << target_dep_ref
40
40
  end
41
41
  end
42
42
  end
@@ -0,0 +1,58 @@
1
+ require "cocoapods-spm/hooks/base"
2
+
3
+ module Pod
4
+ module SPM
5
+ class Hook
6
+ class UpdateEmbedFrameworksScript < Hook
7
+ def run
8
+ aggregate_targets.each do |target|
9
+ next if framework_paths_for(target).empty?
10
+
11
+ update_embed_frameworks_script(target)
12
+ user_build_configurations.each_key do |config|
13
+ update_embed_frameworks_script_files_path(target, config)
14
+ end
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def framework_paths_for(target)
21
+ @dynamic_deps_by_target ||=
22
+ @spm_analyzer
23
+ .spm_dependencies_by_target
24
+ .transform_values { |deps| deps.select(&:dynamic?) }
25
+ @dynamic_deps_by_target[target.to_s].map do |d|
26
+ "${BUILT_PRODUCTS_DIR}/PackageFrameworks/#{d.product}.framework"
27
+ end
28
+ end
29
+
30
+ def update_embed_frameworks_script(target)
31
+ lines = framework_paths_for(target).map { |p| "install_framework \"#{p}\"" }
32
+ target.embed_frameworks_script_path.open("a") do |f|
33
+ f << "\n" << <<~SH
34
+ # --------------------------------------------------------
35
+ # Added by `cocoapods-spm` to embed SPM package frameworks
36
+ # --------------------------------------------------------
37
+ #{lines.join("\n")}
38
+ # --------------------------------------------------------
39
+ SH
40
+ end
41
+ end
42
+
43
+ def update_embed_frameworks_script_files_path(target, config)
44
+ input_paths = framework_paths_for(target)
45
+ output_paths = input_paths.map do |p|
46
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{File.basename(p)}"
47
+ end
48
+ target.embed_frameworks_script_input_files_path(config).open("a") do |f|
49
+ input_paths.each { |p| f << "\n" << p }
50
+ end
51
+ target.embed_frameworks_script_output_files_path(config).open("a") do |f|
52
+ output_paths.each { |p| f << "\n" << p }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -47,14 +47,21 @@ module Pod
47
47
 
48
48
  # For packages to work in the main target
49
49
  perform_settings_update(
50
- update_aggregate_targets: lambda do |target, _, _|
51
- spm_deps = @spm_analyzer.spm_dependencies_by_target[target.to_s].to_a
52
- flags = spm_deps.map { |d| "-l\"#{d.product}.o\"" }
53
- { "OTHER_LDFLAGS" => flags }
50
+ update_targets: lambda do |target, _, _|
51
+ { "OTHER_LDFLAGS" => linker_flags_for(target) }
54
52
  end
55
53
  )
56
54
  end
57
55
 
56
+ def linker_flags_for(target)
57
+ spm_deps = @spm_analyzer.spm_dependencies_by_target[target.to_s].to_a
58
+ framework_flags = spm_deps.select(&:dynamic?).map { |d| "-framework \"#{d.product}\"" }
59
+ framework_flags << '-F"${PODS_CONFIGURATION_BUILD_DIR}/PackageFrameworks"' unless framework_flags.empty?
60
+ library_flags = spm_deps.reject(&:dynamic?).map { |d| "-l\"#{d.product}.o\"" }
61
+ library_flags << '-L"${PODS_CONFIGURATION_BUILD_DIR}"' unless library_flags.empty?
62
+ framework_flags + library_flags
63
+ end
64
+
58
65
  def update_swift_include_paths
59
66
  return unless @spm_analyzer.spm_pkgs
60
67
 
@@ -15,6 +15,10 @@ module Pod
15
15
  analyze_spm_dependencies_by_target
16
16
  end
17
17
 
18
+ def spm_dependencies_for(target)
19
+ @spm_dependencies_by_target[target.to_s]
20
+ end
21
+
18
22
  private
19
23
 
20
24
  def analyze_spm_pkgs
@@ -40,11 +44,10 @@ module Pod
40
44
  @spm_dependencies_by_target[target.to_s] = merge_spm_dependencies(spm_dependencies)
41
45
  end
42
46
 
43
- common_spm_pkgs = @podfile.root_target_definitions.flat_map(&:spm_pkgs)
44
- @podfile.target_definition_list.reject(&:abstract?).each do |target|
45
- existing = @spm_dependencies_by_target[target.label].to_a
46
- spm_dependencies = (common_spm_pkgs + target.spm_pkgs).flat_map(&:to_dependencies)
47
- @spm_dependencies_by_target[target.label] = merge_spm_dependencies(existing + spm_dependencies)
47
+ @podfile.spm_pkgs_by_aggregate_target.each do |target, pkgs|
48
+ existing = @spm_dependencies_by_target[target].to_a
49
+ spm_dependencies = pkgs.flat_map(&:to_dependencies)
50
+ @spm_dependencies_by_target[target] = merge_spm_dependencies(existing + spm_dependencies)
48
51
  end
49
52
  end
50
53
 
@@ -1,5 +1,6 @@
1
1
  require "cocoapods-spm/def/target_definition"
2
2
  require "cocoapods-spm/def/podfile"
3
3
  require "cocoapods-spm/def/spec"
4
+ require "cocoapods-spm/patch/aggregate_target"
4
5
  require "cocoapods-spm/patch/installer"
5
6
  require "cocoapods-spm/command/spm"
@@ -0,0 +1,13 @@
1
+ module Pod
2
+ class AggregateTarget
3
+ alias origin_includes_frameworks? includes_frameworks?
4
+
5
+ def includes_frameworks?
6
+ origin_includes_frameworks? || includes_dynamic_spm_dependencies?
7
+ end
8
+
9
+ def includes_dynamic_spm_dependencies?
10
+ podfile.spm_analyzer.spm_dependencies_for(self).any?(&:dynamic)
11
+ end
12
+ end
13
+ end
@@ -56,8 +56,11 @@ module Pod
56
56
 
57
57
  def resolve_spm_dependencies
58
58
  # TODO: convert aggregate_targets to umbrella_targets?
59
- @spm_analyzer ||= Pod::Installer::SPMAnalyzer.new(podfile, aggregate_targets)
60
- @spm_analyzer.analyze
59
+ UI.section "Analyzing SPM dependencies" do
60
+ @spm_analyzer ||= Pod::Installer::SPMAnalyzer.new(podfile, aggregate_targets)
61
+ @spm_analyzer.analyze
62
+ podfile.spm_analyzer = @spm_analyzer
63
+ end
61
64
  end
62
65
  end
63
66
  end
metadata CHANGED
@@ -1,57 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-spm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.rc7194768598
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thuyen Trinh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-13 00:00:00.000000000 Z
11
+ date: 2023-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">"
18
- - !ruby/object:Gem::Version
19
- version: '1.3'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">"
25
- - !ruby/object:Gem::Version
26
- version: '1.3'
27
- - !ruby/object:Gem::Dependency
28
- name: rspec
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rubocop
14
+ name: xcodeproj
43
15
  requirement: !ruby/object:Gem::Requirement
44
16
  requirements:
45
17
  - - ">="
46
18
  - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
19
+ version: 1.23.0
20
+ type: :runtime
49
21
  prerelease: false
50
22
  version_requirements: !ruby/object:Gem::Requirement
51
23
  requirements:
52
24
  - - ">="
53
25
  - !ruby/object:Gem::Version
54
- version: '0'
26
+ version: 1.23.0
55
27
  description: CocoaPods plugin to add SPM dependencies to CocoaPods targets
56
28
  email:
57
29
  - trinhngocthuyen@gmail.com
@@ -72,6 +44,7 @@ files:
72
44
  - lib/cocoapods-spm/def/xcodeproj.rb
73
45
  - lib/cocoapods-spm/hooks/base.rb
74
46
  - lib/cocoapods-spm/hooks/post_integrate/add_spm_pkgs.rb
47
+ - lib/cocoapods-spm/hooks/post_integrate/update_embed_frameworks_script.rb
75
48
  - lib/cocoapods-spm/hooks/pre_integrate/update_settings.rb
76
49
  - lib/cocoapods-spm/installer/analyzer.rb
77
50
  - lib/cocoapods-spm/macro/fetcher.rb
@@ -79,6 +52,7 @@ files:
79
52
  - lib/cocoapods-spm/macro/prebuilder.rb
80
53
  - lib/cocoapods-spm/main.rb
81
54
  - lib/cocoapods-spm/metadata.rb
55
+ - lib/cocoapods-spm/patch/aggregate_target.rb
82
56
  - lib/cocoapods-spm/patch/installer.rb
83
57
  - lib/cocoapods_plugin.rb
84
58
  homepage: https://github.com/trinhngocthuyen/cocoapods-spm
@@ -96,9 +70,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
70
  version: '0'
97
71
  required_rubygems_version: !ruby/object:Gem::Requirement
98
72
  requirements:
99
- - - ">"
73
+ - - ">="
100
74
  - !ruby/object:Gem::Version
101
- version: 1.3.1
75
+ version: '0'
102
76
  requirements: []
103
77
  rubygems_version: 3.1.6
104
78
  signing_key: