cocoapods-spm2 0.1.10
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 +7 -0
- 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 +17 -0
- data/lib/cocoapods-spm/compatibility/all.rb +1 -0
- data/lib/cocoapods-spm/compatibility/rb26.rb +14 -0
- data/lib/cocoapods-spm/config/pod.rb +11 -0
- data/lib/cocoapods-spm/config/project.rb +32 -0
- data/lib/cocoapods-spm/config/spm.rb +111 -0
- data/lib/cocoapods-spm/config.rb +15 -0
- data/lib/cocoapods-spm/def/installer.rb +7 -0
- data/lib/cocoapods-spm/def/podfile.rb +80 -0
- data/lib/cocoapods-spm/def/spec.rb +26 -0
- data/lib/cocoapods-spm/def/spm_dependency.rb +24 -0
- data/lib/cocoapods-spm/def/spm_package.rb +106 -0
- data/lib/cocoapods-spm/def/target_definition.rb +15 -0
- data/lib/cocoapods-spm/def/xcodeproj.rb +38 -0
- data/lib/cocoapods-spm/executables.rb +9 -0
- data/lib/cocoapods-spm/helpers/io.rb +14 -0
- data/lib/cocoapods-spm/helpers/patch.rb +14 -0
- data/lib/cocoapods-spm/hooks/base.rb +99 -0
- data/lib/cocoapods-spm/hooks/helpers/update_script.rb +61 -0
- data/lib/cocoapods-spm/hooks/post_integrate/1.add_spm_pkgs.rb +31 -0
- data/lib/cocoapods-spm/hooks/post_integrate/5.update_settings.rb +88 -0
- data/lib/cocoapods-spm/hooks/post_integrate/6.update_embed_frameworks_script.rb +32 -0
- data/lib/cocoapods-spm/hooks/post_integrate/7.update_copy_resources_script.rb +33 -0
- data/lib/cocoapods-spm/macro/config.rb +27 -0
- data/lib/cocoapods-spm/macro/fetcher.rb +86 -0
- data/lib/cocoapods-spm/macro/metadata.rb +17 -0
- data/lib/cocoapods-spm/macro/pod_installer.rb +35 -0
- data/lib/cocoapods-spm/macro/prebuilder.rb +50 -0
- data/lib/cocoapods-spm/main.rb +13 -0
- data/lib/cocoapods-spm/patch/aggregate_target.rb +25 -0
- data/lib/cocoapods-spm/patch/installer.rb +75 -0
- data/lib/cocoapods-spm/resolver/recursive_target_resolver.rb +39 -0
- data/lib/cocoapods-spm/resolver/result.rb +73 -0
- data/lib/cocoapods-spm/resolver/target_dep_resolver.rb +64 -0
- data/lib/cocoapods-spm/resolver/umbrella_package.rb +72 -0
- data/lib/cocoapods-spm/resolver/validator.rb +32 -0
- data/lib/cocoapods-spm/resolver.rb +43 -0
- 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 +59 -0
- data/lib/cocoapods-spm/swift/package/resources.rb +17 -0
- data/lib/cocoapods-spm/swift/package/target.rb +171 -0
- data/lib/cocoapods-spm.rb +1 -0
- data/lib/cocoapods_plugin.rb +1 -0
- metadata +108 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
module Pod
|
2
|
+
module IOUtils
|
3
|
+
def self.symlink(src, dst)
|
4
|
+
# NOTE: File operations are case-insensitive (foo.json and Foo.json are identical)
|
5
|
+
return if File.identical?(src, dst)
|
6
|
+
|
7
|
+
src = Pathname.new(src) unless src.is_a?(Pathname)
|
8
|
+
dst = Pathname.new(dst) unless dst.is_a?(Pathname)
|
9
|
+
dst.dirname.mkpath unless dst.dirname.exist?
|
10
|
+
dst.delete if dst.exist?
|
11
|
+
File.symlink(src.absolute? ? src : src.realpath, dst)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Mixin
|
2
|
+
module PatchingBehavior
|
3
|
+
def patch_method(method_name, &block)
|
4
|
+
raw_method_name = "origin_#{method_name}"
|
5
|
+
alias_method raw_method_name, method_name
|
6
|
+
define_method(method_name, &block)
|
7
|
+
private raw_method_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.included(base)
|
11
|
+
base.extend(self)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require "cocoapods-spm/config"
|
2
|
+
require "cocoapods-spm/def/podfile"
|
3
|
+
require "cocoapods-spm/def/spec"
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
module SPM
|
7
|
+
class Hook
|
8
|
+
include Config::Mixin
|
9
|
+
|
10
|
+
def initialize(context, options = {})
|
11
|
+
@context = context
|
12
|
+
@options = options
|
13
|
+
@spm_resolver = options[:spm_resolver]
|
14
|
+
@analysis_result = options[:analysis_result]
|
15
|
+
end
|
16
|
+
|
17
|
+
def sandbox
|
18
|
+
@context.sandbox
|
19
|
+
end
|
20
|
+
|
21
|
+
def pods_project
|
22
|
+
@context.pods_project
|
23
|
+
end
|
24
|
+
|
25
|
+
def pod_targets
|
26
|
+
@analysis_result.pod_targets
|
27
|
+
end
|
28
|
+
|
29
|
+
def aggregate_targets
|
30
|
+
@analysis_result.targets
|
31
|
+
end
|
32
|
+
|
33
|
+
def pod_target_subprojects
|
34
|
+
@context.pod_target_subprojects
|
35
|
+
end
|
36
|
+
|
37
|
+
def projects_to_integrate
|
38
|
+
[pods_project] + pod_target_subprojects
|
39
|
+
end
|
40
|
+
|
41
|
+
def user_build_configurations
|
42
|
+
@user_build_configurations ||= (pod_targets + aggregate_targets)[0].user_build_configurations
|
43
|
+
end
|
44
|
+
|
45
|
+
def config
|
46
|
+
Config.instance
|
47
|
+
end
|
48
|
+
|
49
|
+
def podfile
|
50
|
+
pod_config.podfile
|
51
|
+
end
|
52
|
+
|
53
|
+
def run; end
|
54
|
+
|
55
|
+
def self.run_hooks(phase, context, options)
|
56
|
+
Dir["#{__dir__}/#{phase}/*.rb"].sort.each do |f|
|
57
|
+
require f
|
58
|
+
id = File.basename(f, ".*").split(".").last
|
59
|
+
cls_name = "Pod::SPM::Hook::#{id.camelize}"
|
60
|
+
UI.message "- Running hook: #{cls_name}" do
|
61
|
+
cls_name.constantize.new(context, options).run
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def perform_settings_update(
|
67
|
+
update_targets: nil,
|
68
|
+
update_pod_targets: nil,
|
69
|
+
update_aggregate_targets: nil
|
70
|
+
)
|
71
|
+
proc = lambda do |update, target, setting, config|
|
72
|
+
return if update.nil?
|
73
|
+
|
74
|
+
hash = update.call(target, setting, config)
|
75
|
+
setting.xcconfig.merge!(hash)
|
76
|
+
setting.generate.merge!(hash)
|
77
|
+
Installer::Xcode::PodsProjectGenerator::TargetInstallerHelper.update_changed_file(
|
78
|
+
setting, target.xcconfig_path(config)
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
pod_targets.each do |target|
|
83
|
+
target.build_settings.each do |config, setting|
|
84
|
+
proc.call(update_targets, target, setting, config)
|
85
|
+
proc.call(update_pod_targets, target, setting, config)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
aggregate_targets.each do |target|
|
90
|
+
target.user_build_configurations.each_key do |config|
|
91
|
+
setting = target.build_settings(config)
|
92
|
+
proc.call(update_targets, target, setting, config)
|
93
|
+
proc.call(update_aggregate_targets, target, setting, config)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "cocoapods-spm/hooks/base"
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
module SPM
|
5
|
+
module UpdateScript
|
6
|
+
module Mixin
|
7
|
+
def update_script(options = {})
|
8
|
+
script_name = options[:name]
|
9
|
+
content_by_target = options[:content_by_target]
|
10
|
+
|
11
|
+
aggregate_targets.each do |target|
|
12
|
+
lines, input_paths, output_paths = content_by_target.call(target)
|
13
|
+
next if input_paths.empty?
|
14
|
+
|
15
|
+
update_script_content(
|
16
|
+
path: target.send("#{script_name}_path"),
|
17
|
+
before: options[:insert_before],
|
18
|
+
insert: lines.join("\n")
|
19
|
+
)
|
20
|
+
|
21
|
+
# Update input/output files
|
22
|
+
user_build_configurations.each_key do |config|
|
23
|
+
append_contents = lambda do |method_name, contents|
|
24
|
+
target.send(method_name, config).open("a") do |f|
|
25
|
+
contents.each { |p| f << "\n" << p }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
append_contents.call("#{script_name}_input_files_path", input_paths)
|
29
|
+
append_contents.call("#{script_name}_output_files_path", output_paths)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def update_script_content(options = {})
|
37
|
+
match_content = options[:before]
|
38
|
+
insert_content = <<~SH
|
39
|
+
# --------------------------------------------------------
|
40
|
+
# Added by `cocoapods-spm`
|
41
|
+
# --------------------------------------------------------
|
42
|
+
#{options[:insert]}
|
43
|
+
# --------------------------------------------------------
|
44
|
+
SH
|
45
|
+
options[:path].open("r+") do |f|
|
46
|
+
content = f.read
|
47
|
+
offset = content.index(match_content) unless match_content.nil?
|
48
|
+
if offset.nil?
|
49
|
+
f << "\n" << insert_content
|
50
|
+
else
|
51
|
+
f.seek(offset)
|
52
|
+
after_content = f.read
|
53
|
+
f.seek(offset)
|
54
|
+
f << "\n" << insert_content << after_content
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "cocoapods-spm/hooks/base"
|
2
|
+
require "cocoapods-spm/resolver"
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
module SPM
|
6
|
+
class Hook
|
7
|
+
class AddSpmPkgs < Hook
|
8
|
+
def run
|
9
|
+
return if @spm_resolver.result.spm_pkgs.empty?
|
10
|
+
|
11
|
+
projects_to_integrate.compact.each do |project|
|
12
|
+
spm_pkg_refs = {}
|
13
|
+
project.targets.each do |target|
|
14
|
+
@spm_resolver.result.spm_dependencies_for(target).each do |dep|
|
15
|
+
pkg_ref = dep.pkg.create_pkg_ref(project)
|
16
|
+
target_dep_ref = pkg_ref.create_target_dependency_ref(dep.product)
|
17
|
+
target.dependencies << target_dep_ref
|
18
|
+
target.package_product_dependencies << target_dep_ref.product_ref if dep.pkg.use_default_xcode_linking?
|
19
|
+
spm_pkg_refs.store(dep.pkg.name, pkg_ref)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
spm_pkg_refs.each_value do |pkg_ref|
|
23
|
+
project.root_object.package_references << pkg_ref
|
24
|
+
end
|
25
|
+
project.save
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require "cocoapods-spm/hooks/base"
|
2
|
+
require "cocoapods-spm/macro/metadata"
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
module SPM
|
6
|
+
class Hook
|
7
|
+
class UpdateSettings < Hook
|
8
|
+
def run
|
9
|
+
update_macro_plugin_flags
|
10
|
+
update_packages_flags
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def macro_plugin_flag_by_config
|
16
|
+
path_prefix = "${PODS_ROOT}/../#{spm_config.macro_prebuilt_root_dir}"
|
17
|
+
@macro_plugin_flag_by_config ||= begin
|
18
|
+
hash = user_build_configurations.keys.to_h do |config|
|
19
|
+
flags = macro_pods.keys.map do |name|
|
20
|
+
metadata = MacroMetadata.for_pod(name)
|
21
|
+
impl_module_name = metadata.macro_impl_name
|
22
|
+
plugin_executable_path =
|
23
|
+
"#{path_prefix}/#{name}/" \
|
24
|
+
"#{impl_module_name}-#{config.to_s.downcase}##{impl_module_name}"
|
25
|
+
"-load-plugin-executable \"#{plugin_executable_path}\""
|
26
|
+
end.join(" ")
|
27
|
+
[config, flags]
|
28
|
+
end
|
29
|
+
user_build_configurations.each { |config, symbol| hash[symbol] = hash[config] }
|
30
|
+
hash
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def update_macro_plugin_flags
|
35
|
+
return if spm_config.all_macros.empty?
|
36
|
+
|
37
|
+
perform_settings_update(
|
38
|
+
update_targets: lambda do |_, _, config|
|
39
|
+
{ "OTHER_SWIFT_FLAGS" => macro_plugin_flag_by_config[config] }
|
40
|
+
end
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def update_packages_flags
|
45
|
+
return if @spm_resolver.result.spm_pkgs.empty?
|
46
|
+
|
47
|
+
perform_settings_update(
|
48
|
+
update_targets: lambda do |target, _, _|
|
49
|
+
{
|
50
|
+
"SOURCE_PACKAGES_CHECKOUTS_DIR" => "${BUILD_ROOT}/../../SourcePackages/checkouts",
|
51
|
+
"FRAMEWORK_SEARCH_PATHS" => "\"${PODS_CONFIGURATION_BUILD_DIR}/PackageFrameworks\"",
|
52
|
+
"LIBRARY_SEARCH_PATHS" => "\"${PODS_CONFIGURATION_BUILD_DIR}\"",
|
53
|
+
"SWIFT_INCLUDE_PATHS" => "$(PODS_CONFIGURATION_BUILD_DIR)",
|
54
|
+
"OTHER_SWIFT_FLAGS" => modulemap_args_for_target(target, prefix: "-Xcc"),
|
55
|
+
"OTHER_CFLAGS" => modulemap_args_for_target(target),
|
56
|
+
"HEADER_SEARCH_PATHS" => header_search_paths_for(target),
|
57
|
+
"OTHER_LDFLAGS" => linker_flags_for(target),
|
58
|
+
}
|
59
|
+
end
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
def linker_flags_for(target)
|
64
|
+
return [] if !target.is_a?(Pod::AggregateTarget) && target.build_as_static?
|
65
|
+
|
66
|
+
@spm_resolver.result.linker_flags_for(target)
|
67
|
+
end
|
68
|
+
|
69
|
+
def modulemap_args_for_target(target, prefix: nil)
|
70
|
+
@spm_resolver
|
71
|
+
.result
|
72
|
+
.spm_targets_for(target)
|
73
|
+
.filter_map(&:clang_modulemap_arg)
|
74
|
+
.map { |v| prefix.nil? ? v : "#{prefix} #{v}" }
|
75
|
+
.join(" ")
|
76
|
+
end
|
77
|
+
|
78
|
+
def header_search_paths_for(target)
|
79
|
+
@spm_resolver
|
80
|
+
.result
|
81
|
+
.spm_targets_for(target)
|
82
|
+
.filter_map(&:header_search_path_arg)
|
83
|
+
.join(" ")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "cocoapods-spm/hooks/base"
|
2
|
+
require "cocoapods-spm/hooks/helpers/update_script"
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
module SPM
|
6
|
+
class Hook
|
7
|
+
class UpdateEmbedFrameworksScript < Hook
|
8
|
+
include UpdateScript::Mixin
|
9
|
+
|
10
|
+
def run
|
11
|
+
update_script(
|
12
|
+
name: :embed_frameworks_script,
|
13
|
+
content_by_target: lambda do |target|
|
14
|
+
input_paths = framework_paths_for(target)
|
15
|
+
output_paths = input_paths.map do |p|
|
16
|
+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{File.basename(p)}"
|
17
|
+
end
|
18
|
+
lines = input_paths.map { |p| "install_framework \"#{p}\"" }
|
19
|
+
[lines, input_paths, output_paths]
|
20
|
+
end
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def framework_paths_for(target)
|
27
|
+
@spm_resolver.result.spm_targets_for(target).select(&:dynamic?).map(&:built_framework_path).uniq
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "cocoapods-spm/hooks/base"
|
2
|
+
require "cocoapods-spm/hooks/helpers/update_script"
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
module SPM
|
6
|
+
class Hook
|
7
|
+
class UpdateCopyResourcesScript < Hook
|
8
|
+
include UpdateScript::Mixin
|
9
|
+
|
10
|
+
def run
|
11
|
+
update_script(
|
12
|
+
name: :copy_resources_script,
|
13
|
+
insert_before: Generator::CopyResourcesScript::RSYNC_CALL,
|
14
|
+
content_by_target: lambda do |target|
|
15
|
+
input_paths = resource_paths_for(target)
|
16
|
+
output_paths = input_paths.map do |p|
|
17
|
+
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/#{File.basename(p)}"
|
18
|
+
end
|
19
|
+
lines = input_paths.map { |p| "install_resource \"#{p}\"" }
|
20
|
+
[lines, input_paths, output_paths]
|
21
|
+
end
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def resource_paths_for(target)
|
28
|
+
@spm_resolver.result.spm_targets_for(target).flat_map(&:resources).map(&:built_resource_path).uniq
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Pod
|
2
|
+
module SPM
|
3
|
+
module MacroConfigMixin
|
4
|
+
include Config::Mixin
|
5
|
+
|
6
|
+
def macro_downloaded_dir
|
7
|
+
spm_config.macro_downloaded_root_dir / name
|
8
|
+
end
|
9
|
+
|
10
|
+
def macro_dir
|
11
|
+
@macro_dir ||= spm_config.macro_root_dir / name
|
12
|
+
end
|
13
|
+
|
14
|
+
def macro_prebuilt_dir
|
15
|
+
spm_config.macro_prebuilt_root_dir / name
|
16
|
+
end
|
17
|
+
|
18
|
+
def metadata_path
|
19
|
+
macro_dir / "metadata.json"
|
20
|
+
end
|
21
|
+
|
22
|
+
def metadata
|
23
|
+
@metadata ||= MacroMetadata.for_pod(name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "cocoapods-spm/helpers/io"
|
2
|
+
require "cocoapods-spm/macro/metadata"
|
3
|
+
require_relative "config"
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
module SPM
|
7
|
+
class MacroFetcher
|
8
|
+
include MacroConfigMixin
|
9
|
+
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
@name = options[:name]
|
14
|
+
@specs_by_platform = options[:specs_by_platform]
|
15
|
+
@can_cache = options[:can_cache]
|
16
|
+
@podfile = Pod::Config.instance.podfile
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
prepare_macro_source
|
21
|
+
macro_dir = spm_config.macro_root_dir / name
|
22
|
+
macro_downloaded_dir = spm_config.macro_downloaded_root_dir / name
|
23
|
+
FileUtils.copy_entry(
|
24
|
+
macro_downloaded_dir / "Sources" / name,
|
25
|
+
macro_dir / "Sources" / name
|
26
|
+
)
|
27
|
+
generate_metadata
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def local?
|
33
|
+
local_macro_pod?(name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def generate_metadata
|
37
|
+
raise "Package.swift not exist in #{macro_downloaded_dir}" \
|
38
|
+
unless (macro_downloaded_dir / "Package.swift").exist?
|
39
|
+
|
40
|
+
raw = Dir.chdir(macro_downloaded_dir) { `swift package dump-package` }
|
41
|
+
metadata_path.write(raw)
|
42
|
+
end
|
43
|
+
|
44
|
+
def prepare_macro_source
|
45
|
+
if local?
|
46
|
+
symlink_local_macro_source
|
47
|
+
else
|
48
|
+
download_macro_source
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def symlink_local_macro_source
|
53
|
+
UI.message "Creating symlink to local macro source: #{name}..."
|
54
|
+
# For local macro pod, just need to copy local pod dir to downloaded sandbox,
|
55
|
+
# or create a symlink .spm.pods/macros/.downloaded/FOO -> LocalPods/FOO
|
56
|
+
IOUtils.symlink(local_macro_pod_dir(name), macro_downloaded_dir)
|
57
|
+
end
|
58
|
+
|
59
|
+
def download_macro_source
|
60
|
+
UI.puts "Downloading source for macro: #{name}...".magenta
|
61
|
+
@specs_by_platform ||= @podfile.root_target_definitions.to_h do |definition|
|
62
|
+
spec = Pod::Spec.from_file(spm_config.macro_root_dir / name / "#{name}.podspec")
|
63
|
+
[definition.platform, [spec]]
|
64
|
+
end
|
65
|
+
|
66
|
+
# When `can_cache` is true, PodSourceDownloader only keeps the contents
|
67
|
+
# according to its `source_files` declared in the podspec.
|
68
|
+
# However, we wish to keep all contents (including Package.swift...).
|
69
|
+
# --> We alter the spec when downloading the source.
|
70
|
+
altered_specs_by_platform = @specs_by_platform.to_h do |platform, specs|
|
71
|
+
altered_specs = specs.map do |spec|
|
72
|
+
spec.with { |s| s.source_files = "**/*" }
|
73
|
+
end
|
74
|
+
[platform, altered_specs]
|
75
|
+
end
|
76
|
+
downloader = Pod::Installer::PodSourceDownloader.new(
|
77
|
+
spm_config.macro_downloaded_sandbox,
|
78
|
+
@podfile,
|
79
|
+
altered_specs_by_platform,
|
80
|
+
can_cache: @can_cache
|
81
|
+
)
|
82
|
+
downloader.download!
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "cocoapods-spm/swift/package/description"
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
module SPM
|
5
|
+
class MacroMetadata < Swift::PackageDescription
|
6
|
+
def self.for_pod(name)
|
7
|
+
path = Config.instance.macro_root_dir / name / "metadata.json"
|
8
|
+
unless path.exist?
|
9
|
+
UI.message "Will fetch macro #{name} because its metadata does not exist at #{path}"
|
10
|
+
require "cocoapods-spm/macro/fetcher"
|
11
|
+
MacroFetcher.new(name: name, can_cache: true).run
|
12
|
+
end
|
13
|
+
from_file(path)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "cocoapods-spm/def/spec"
|
2
|
+
require "cocoapods-spm/macro/fetcher"
|
3
|
+
require "cocoapods-spm/macro/prebuilder"
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
class Installer
|
7
|
+
class MacroPodInstaller < PodSourceInstaller
|
8
|
+
include SPM::Config::Mixin
|
9
|
+
|
10
|
+
def install!
|
11
|
+
install_macro_pod!
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def fetcher
|
18
|
+
@fetcher ||= SPM::MacroFetcher.new(
|
19
|
+
name: name,
|
20
|
+
specs_by_platform: specs_by_platform,
|
21
|
+
can_cache: can_cache?
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def prebuilder
|
26
|
+
@prebuilder ||= SPM::MacroPrebuilder.new(name: name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def install_macro_pod!
|
30
|
+
fetcher.run if local_macro_pod?(name) || !fetcher.metadata_path.exist?
|
31
|
+
prebuilder.run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "cocoapods-spm/macro/metadata"
|
2
|
+
require_relative "config"
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
module SPM
|
6
|
+
class MacroPrebuilder
|
7
|
+
include MacroConfigMixin
|
8
|
+
include Executables
|
9
|
+
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
@name = options[:name]
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
prebuild_macro_impl
|
18
|
+
end
|
19
|
+
|
20
|
+
def prebuild_macro_impl
|
21
|
+
return if spm_config.dont_prebuild_macros?
|
22
|
+
|
23
|
+
config = spm_config.macro_config
|
24
|
+
impl_module_name = metadata.macro_impl_name
|
25
|
+
prebuilt_binary = macro_prebuilt_dir / "#{impl_module_name}-#{config}"
|
26
|
+
if spm_config.dont_prebuild_macros_if_exist? && prebuilt_binary.exist?
|
27
|
+
return UI.message "Macro binary exists at #{prebuilt_binary} -> Skip prebuilding macro"
|
28
|
+
end
|
29
|
+
|
30
|
+
UI.section "Building macro implementation: #{impl_module_name} (#{config})...".green do
|
31
|
+
Dir.chdir(macro_downloaded_dir) do
|
32
|
+
swift! ["--version"]
|
33
|
+
swift! ["build", "-c", config, "--product", impl_module_name]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
prebuilt_binary.parent.mkpath
|
38
|
+
macro_downloaded_build_config_dir = macro_downloaded_dir / ".build" / config
|
39
|
+
macro_build_binary_file_path = macro_downloaded_build_config_dir / impl_module_name
|
40
|
+
unless macro_build_binary_file_path.exist?
|
41
|
+
macro_build_binary_file_path = macro_downloaded_build_config_dir / "#{impl_module_name}-tool"
|
42
|
+
end
|
43
|
+
FileUtils.copy_entry(
|
44
|
+
macro_build_binary_file_path,
|
45
|
+
prebuilt_binary
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "pry" if ENV["COCOAPODS_IMPORT_PRY"] == "true"
|
2
|
+
require "cocoapods-spm/compatibility/all"
|
3
|
+
require "cocoapods-spm/helpers/io"
|
4
|
+
require "cocoapods-spm/helpers/patch"
|
5
|
+
require "cocoapods-spm/config"
|
6
|
+
require "cocoapods-spm/executables"
|
7
|
+
require "cocoapods-spm/def/installer"
|
8
|
+
require "cocoapods-spm/def/target_definition"
|
9
|
+
require "cocoapods-spm/def/podfile"
|
10
|
+
require "cocoapods-spm/def/spec"
|
11
|
+
require "cocoapods-spm/patch/aggregate_target"
|
12
|
+
require "cocoapods-spm/patch/installer"
|
13
|
+
require "cocoapods-spm/command/spm"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "cocoapods-spm/helpers/patch"
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class AggregateTarget
|
5
|
+
include Mixin::PatchingBehavior
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
patch_method :includes_frameworks? do
|
10
|
+
origin_includes_frameworks? || includes_dynamic_spm_dependencies?
|
11
|
+
end
|
12
|
+
|
13
|
+
patch_method :includes_resources? do
|
14
|
+
origin_includes_resources? || includes_spm_resouces?
|
15
|
+
end
|
16
|
+
|
17
|
+
def includes_dynamic_spm_dependencies?
|
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? }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|