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 +4 -4
- data/lib/cocoapods-spm/def/podfile.rb +15 -0
- data/lib/cocoapods-spm/def/spm_dependency.rb +9 -0
- data/lib/cocoapods-spm/def/spm_package.rb +2 -1
- data/lib/cocoapods-spm/def/xcodeproj.rb +7 -0
- data/lib/cocoapods-spm/hooks/post_integrate/add_spm_pkgs.rb +2 -2
- data/lib/cocoapods-spm/hooks/post_integrate/update_embed_frameworks_script.rb +58 -0
- data/lib/cocoapods-spm/hooks/pre_integrate/update_settings.rb +11 -4
- data/lib/cocoapods-spm/installer/analyzer.rb +8 -5
- data/lib/cocoapods-spm/main.rb +1 -0
- data/lib/cocoapods-spm/patch/aggregate_target.rb +13 -0
- data/lib/cocoapods-spm/patch/installer.rb +5 -2
- metadata +8 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43e96257dc89796c000a5115e81d36fc9ef9df8208eba676a2fd1b6961864b84
|
4
|
+
data.tar.gz: 1aafa45b40759edbcb3e3ceee7a699038ca2638f8d6c432bd8a4dce2a5321783
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
39
|
-
target.
|
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
|
-
|
51
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
|
data/lib/cocoapods-spm/main.rb
CHANGED
@@ -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
|
-
|
60
|
-
|
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.
|
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-
|
11
|
+
date: 2023-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
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:
|
48
|
-
type: :
|
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:
|
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
|