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.
- checksums.yaml +4 -4
- data/lib/cocoapods-spm/command/clean.rb +31 -0
- data/lib/cocoapods-spm/command/macro/deprecated.rb +35 -0
- data/lib/cocoapods-spm/command/macro/fetch.rb +33 -0
- data/lib/cocoapods-spm/command/macro/prebuild.rb +37 -0
- data/lib/cocoapods-spm/command/macro.rb +14 -0
- data/lib/cocoapods-spm/command/spm.rb +2 -2
- data/lib/cocoapods-spm/config/spm.rb +11 -3
- data/lib/cocoapods-spm/def/podfile.rb +9 -5
- data/lib/cocoapods-spm/def/spm_dependency.rb +3 -1
- data/lib/cocoapods-spm/def/spm_package.rb +3 -1
- data/lib/cocoapods-spm/helpers/io.rb +13 -0
- data/lib/cocoapods-spm/helpers/patch.rb +14 -0
- data/lib/cocoapods-spm/hooks/helpers/update_script.rb +61 -0
- data/lib/cocoapods-spm/hooks/post_integrate/5.update_settings.rb +24 -35
- data/lib/cocoapods-spm/hooks/post_integrate/6.update_embed_frameworks_script.rb +14 -36
- data/lib/cocoapods-spm/hooks/post_integrate/7.update_copy_resources_script.rb +33 -0
- data/lib/cocoapods-spm/macro/metadata.rb +11 -0
- data/lib/cocoapods-spm/macro/prebuilder.rb +7 -6
- data/lib/cocoapods-spm/main.rb +2 -1
- data/lib/cocoapods-spm/patch/aggregate_target.rb +15 -3
- data/lib/cocoapods-spm/patch/installer.rb +6 -7
- data/lib/cocoapods-spm/resolver/recursive_target_resolver.rb +37 -0
- data/lib/cocoapods-spm/resolver/result.rb +27 -23
- data/lib/cocoapods-spm/resolver/umbrella_package.rb +9 -4
- data/lib/cocoapods-spm/resolver.rb +6 -8
- data/lib/cocoapods-spm/swift/package/base.rb +54 -0
- data/lib/cocoapods-spm/swift/package/dependency.rb +27 -0
- data/lib/cocoapods-spm/swift/package/description.rb +76 -0
- data/lib/cocoapods-spm/swift/package/product.rb +17 -0
- data/lib/cocoapods-spm/swift/package/project_packages.rb +58 -0
- data/lib/cocoapods-spm/swift/package/resources.rb +17 -0
- data/lib/cocoapods-spm/swift/package/target.rb +154 -0
- metadata +20 -7
- data/lib/cocoapods-spm/command/fetch.rb +0 -31
- data/lib/cocoapods-spm/command/prebuild.rb +0 -35
- data/lib/cocoapods-spm/metadata.rb +0 -50
- data/lib/cocoapods-spm/resolver/product.rb +0 -31
- 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
|
-
|
5
|
+
include Mixin::PatchingBehavior
|
6
|
+
|
7
|
+
private
|
4
8
|
|
5
|
-
|
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.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
21
|
+
ATTRS.each_key { |x| attr_reader x }
|
19
22
|
|
20
23
|
def initialize(options = {})
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
28
|
-
|
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
|
38
|
-
spm_dependencies_for(target).flat_map
|
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
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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?)
|
60
|
-
|
61
|
-
|
62
|
-
|
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/
|
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
|
-
@
|
17
|
-
|
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
|