cocoapods-spm 0.0.2 → 0.0.3

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: 4a5eda6a0153888c9f65ee3e325c3dfc4c09aa2de0d8021556da54b3f1ea0d43
4
- data.tar.gz: 3d37731a7d09ddc7cfb4064d47a0fa82ad7bc83fd30b7175a66485a8f7f35db0
3
+ metadata.gz: 43e96257dc89796c000a5115e81d36fc9ef9df8208eba676a2fd1b6961864b84
4
+ data.tar.gz: 1aafa45b40759edbcb3e3ceee7a699038ca2638f8d6c432bd8a4dce2a5321783
5
5
  SHA512:
6
- metadata.gz: 3cfb06f8423f4bfe9ff580aebb49a0417d7d2bd0cc3146114f4b3f40c11c8ed2ced93469d7482a6442f0acd396083256018ca6a8b8b9c0cbb8ffa657e01ad586
7
- data.tar.gz: 0111ab82c0ce14ff7a17831450d1710bbd583738a73f037ed09c9b822160a521c1d7f4d05a1587ffe3550836d165595f4c5bbe6372aa1c80ce6eda8e759aa245
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
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