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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/lib/cocoapods-spm/command/clean.rb +31 -0
  3. data/lib/cocoapods-spm/command/macro/deprecated.rb +35 -0
  4. data/lib/cocoapods-spm/command/macro/fetch.rb +33 -0
  5. data/lib/cocoapods-spm/command/macro/prebuild.rb +37 -0
  6. data/lib/cocoapods-spm/command/macro.rb +14 -0
  7. data/lib/cocoapods-spm/command/spm.rb +17 -0
  8. data/lib/cocoapods-spm/compatibility/all.rb +1 -0
  9. data/lib/cocoapods-spm/compatibility/rb26.rb +14 -0
  10. data/lib/cocoapods-spm/config/pod.rb +11 -0
  11. data/lib/cocoapods-spm/config/project.rb +32 -0
  12. data/lib/cocoapods-spm/config/spm.rb +111 -0
  13. data/lib/cocoapods-spm/config.rb +15 -0
  14. data/lib/cocoapods-spm/def/installer.rb +7 -0
  15. data/lib/cocoapods-spm/def/podfile.rb +80 -0
  16. data/lib/cocoapods-spm/def/spec.rb +26 -0
  17. data/lib/cocoapods-spm/def/spm_dependency.rb +24 -0
  18. data/lib/cocoapods-spm/def/spm_package.rb +106 -0
  19. data/lib/cocoapods-spm/def/target_definition.rb +15 -0
  20. data/lib/cocoapods-spm/def/xcodeproj.rb +38 -0
  21. data/lib/cocoapods-spm/executables.rb +9 -0
  22. data/lib/cocoapods-spm/helpers/io.rb +14 -0
  23. data/lib/cocoapods-spm/helpers/patch.rb +14 -0
  24. data/lib/cocoapods-spm/hooks/base.rb +99 -0
  25. data/lib/cocoapods-spm/hooks/helpers/update_script.rb +61 -0
  26. data/lib/cocoapods-spm/hooks/post_integrate/1.add_spm_pkgs.rb +31 -0
  27. data/lib/cocoapods-spm/hooks/post_integrate/5.update_settings.rb +88 -0
  28. data/lib/cocoapods-spm/hooks/post_integrate/6.update_embed_frameworks_script.rb +32 -0
  29. data/lib/cocoapods-spm/hooks/post_integrate/7.update_copy_resources_script.rb +33 -0
  30. data/lib/cocoapods-spm/macro/config.rb +27 -0
  31. data/lib/cocoapods-spm/macro/fetcher.rb +86 -0
  32. data/lib/cocoapods-spm/macro/metadata.rb +17 -0
  33. data/lib/cocoapods-spm/macro/pod_installer.rb +35 -0
  34. data/lib/cocoapods-spm/macro/prebuilder.rb +50 -0
  35. data/lib/cocoapods-spm/main.rb +13 -0
  36. data/lib/cocoapods-spm/patch/aggregate_target.rb +25 -0
  37. data/lib/cocoapods-spm/patch/installer.rb +75 -0
  38. data/lib/cocoapods-spm/resolver/recursive_target_resolver.rb +39 -0
  39. data/lib/cocoapods-spm/resolver/result.rb +73 -0
  40. data/lib/cocoapods-spm/resolver/target_dep_resolver.rb +64 -0
  41. data/lib/cocoapods-spm/resolver/umbrella_package.rb +72 -0
  42. data/lib/cocoapods-spm/resolver/validator.rb +32 -0
  43. data/lib/cocoapods-spm/resolver.rb +43 -0
  44. data/lib/cocoapods-spm/swift/package/base.rb +54 -0
  45. data/lib/cocoapods-spm/swift/package/dependency.rb +27 -0
  46. data/lib/cocoapods-spm/swift/package/description.rb +76 -0
  47. data/lib/cocoapods-spm/swift/package/product.rb +17 -0
  48. data/lib/cocoapods-spm/swift/package/project_packages.rb +59 -0
  49. data/lib/cocoapods-spm/swift/package/resources.rb +17 -0
  50. data/lib/cocoapods-spm/swift/package/target.rb +171 -0
  51. data/lib/cocoapods-spm.rb +1 -0
  52. data/lib/cocoapods_plugin.rb +1 -0
  53. 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