cocoapods-imy-bin 0.2.6 → 0.3.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -540
  3. data/lib/cocoapods-imy-bin/command/bin/archive.rb +43 -4
  4. data/lib/cocoapods-imy-bin/command/bin/auto.rb +9 -7
  5. data/lib/cocoapods-imy-bin/command/bin/code.rb +1 -6
  6. data/lib/cocoapods-imy-bin/command/bin/local.rb +16 -7
  7. data/lib/cocoapods-imy-bin/config/config.rb +1 -1
  8. data/lib/cocoapods-imy-bin/config/config_builder.rb +39 -2
  9. data/lib/cocoapods-imy-bin/gem_version.rb +1 -1
  10. data/lib/cocoapods-imy-bin/helpers.rb +1 -0
  11. data/lib/cocoapods-imy-bin/helpers/Info.plist +0 -0
  12. data/lib/cocoapods-imy-bin/helpers/build_helper.rb +15 -7
  13. data/lib/cocoapods-imy-bin/helpers/build_utils.rb +63 -0
  14. data/lib/cocoapods-imy-bin/helpers/framework.rb +25 -2
  15. data/lib/cocoapods-imy-bin/helpers/framework_builder.rb +172 -57
  16. data/lib/cocoapods-imy-bin/helpers/library.rb +2 -2
  17. data/lib/cocoapods-imy-bin/helpers/local/local_build_helper.rb +38 -6
  18. data/lib/cocoapods-imy-bin/helpers/local/local_framework.rb +20 -0
  19. data/lib/cocoapods-imy-bin/helpers/local/local_framework_builder.rb +91 -38
  20. data/lib/cocoapods-imy-bin/helpers/sources_helper.rb +5 -2
  21. data/lib/cocoapods-imy-bin/helpers/spec_source_creator.rb +65 -8
  22. data/lib/cocoapods-imy-bin/helpers/upload_helper.rb +8 -3
  23. data/lib/cocoapods-imy-bin/native.rb +4 -0
  24. data/lib/cocoapods-imy-bin/native/analyzer.rb +2 -0
  25. data/lib/cocoapods-imy-bin/native/file_accessor.rb +28 -0
  26. data/lib/cocoapods-imy-bin/native/pod_target_installer.rb +94 -0
  27. data/lib/cocoapods-imy-bin/native/podfile_generator.rb +11 -2
  28. data/lib/cocoapods-imy-bin/native/target_validator.rb +41 -0
  29. data/lib/cocoapods-imy-bin/native/validator.rb +1 -38
  30. metadata +7 -2
@@ -12,31 +12,55 @@ module CBin
12
12
  class Builder
13
13
  include Pod
14
14
  #Debug下还待完成
15
- def initialize(spec, file_accessor, platform, local_build_dir_name, local_build_dir)
15
+ def initialize(spec, file_accessor, platform, local_build_dir_name, local_build_dir, is_library = true, framework_BuildProductsPath = "")
16
16
  @spec = spec
17
17
  @file_accessor = file_accessor
18
18
  @platform = platform
19
19
  @local_build_dir_name = local_build_dir_name
20
20
  @local_build_dir = local_build_dir
21
+ @is_library = is_library
22
+ @framework_BuildProductsPath = framework_BuildProductsPath
21
23
  end
22
24
 
23
25
  def create
24
- UI.section("Building static framework #{@spec}") do
25
- output = framework.versions_path + Pathname.new(@spec.name)
26
-
27
- build_static_library_for_ios(output)
26
+ begin
27
+ #如果是.a 文件, 或者 swift下,是.a文件的
28
+ if @is_library || (!@is_library && @framework_BuildProductsPath != framework_name)
29
+
30
+ UI.section("Building static library #{@spec}") do
31
+ output = framework.versions_path + Pathname.new(@spec.name)
32
+ build_static_library_for_ios(output)
33
+ res = copy_headers
34
+ # maybe fails for copy_headers
35
+ if res
36
+ copy_resources
37
+ cp_to_source_dir
38
+ else
39
+ FileUtils.remove_dir(framework.fwk_path) if File.exist?(framework.fwk_path)
40
+ return nil
41
+ end
42
+ end
28
43
 
29
- copy_headers
30
- copy_resources
44
+ else
45
+ UI.section("Building static framework #{@spec}") do
46
+ output = File.join(CBin::Config::Builder.instance.zip_dir,"#{@spec.name}.framework")
47
+ build_static_framework_for_ios(output)
48
+ end
49
+ end
31
50
 
32
- cp_to_source_dir
51
+ rescue StandardError
52
+ UI.warn "【#{spec.name} | #{spec.version}】组件二进制版本组装失败 ."
33
53
  end
54
+
34
55
  framework
35
56
  end
36
57
 
37
58
  private
38
59
 
39
60
  def cp_to_source_dir
61
+ # 删除Versions 软链接
62
+ framework.remove_current_version if CBin::Build::Utils.is_swift_module(@spec)
63
+
40
64
  target_dir = File.join(CBin::Config::Builder.instance.root_dir,CBin::Config::Builder.instance.framework_file(@spec))
41
65
  FileUtils.rm_rf(target_dir) if File.exist?(target_dir)
42
66
 
@@ -46,58 +70,80 @@ module CBin
46
70
  `cp -fa #{@platform}/#{CBin::Config::Builder.instance.framework_name(@spec)} #{target_dir}`
47
71
  end
48
72
 
73
+
49
74
  def copy_headers
50
75
  #by slj 如果没有头文件,去 "Headers/Public"拿
51
76
  # if public_headers.empty?
52
77
  Dir.chdir(File.join(Pod::Config.instance.installation_root,'Pods')) do
53
78
 
54
- #走 podsepc中的public_headers
55
- public_headers = Array.new
56
- Dir.chdir("./Headers/Public/#{@spec.name}") do
57
- headers = Dir.glob('*.h')
58
- headers.each do |h|
59
- public_headers << Pathname.new(File.join(Dir.pwd,h))
60
- end
61
- end
79
+ if File.exist?("./Headers/Public/#{@spec.name}")
80
+ #走 podsepc中的public_headers
81
+ public_headers = Array.new
62
82
 
63
- UI.message "Copying public headers #{public_headers.map(&:basename).map(&:to_s)}"
83
+ Dir.chdir("./Headers/Public/#{@spec.name}") do
84
+ headers = Dir.glob('*.h')
85
+ headers.each do |h|
86
+ public_headers << Pathname.new(File.join(Dir.pwd,h))
87
+ end
88
+ end
64
89
 
65
- public_headers.each do |h|
66
- `ditto #{h} #{framework.headers_path}/#{h.basename}`
67
- end
90
+ UI.message "Copying public headers #{public_headers.map(&:basename).map(&:to_s)}"
68
91
 
69
- # If custom 'module_map' is specified add it to the framework distribution
70
- # otherwise check if a header exists that is equal to 'spec.name', if so
71
- # create a default 'module_map' one using it.
72
- if !@spec.module_map.nil?
73
- module_map_file = @file_accessor.module_map
74
- if Pathname(module_map_file).exist?
75
- module_map = File.read(module_map_file)
92
+ public_headers.each do |h|
93
+ `ditto #{h} #{framework.headers_path}/#{h.basename}`
76
94
  end
77
- elsif public_headers.map(&:basename).map(&:to_s).include?("#{@spec.name}.h")
78
- module_map = <<-MAP
95
+
96
+ # If custom 'module_map' is specified add it to the framework distribution
97
+ # otherwise check if a header exists that is equal to 'spec.name', if so
98
+ # create a default 'module_map' one using it.
99
+ if !@spec.module_map.nil?
100
+ module_map_file = @file_accessor.module_map
101
+ if Pathname(module_map_file).exist?
102
+ module_map = File.read(module_map_file)
103
+ end
104
+ elsif public_headers.map(&:basename).map(&:to_s).include?("#{@spec.name}-umbrella.h")
105
+ module_map = <<-MAP
79
106
  framework module #{@spec.name} {
80
- umbrella header "#{@spec.name}.h"
107
+ umbrella header "#{@spec.name}-umbrella.h"
81
108
 
82
109
  export *
83
110
  module * { export * }
84
111
  }
85
- MAP
86
- end
112
+ MAP
113
+ end
87
114
 
88
- unless module_map.nil?
89
- UI.message "Writing module map #{module_map}"
90
- unless framework.module_map_path.exist?
91
- framework.module_map_path.mkpath
115
+ unless module_map.nil?
116
+ UI.message "Writing module map #{module_map}"
117
+ unless framework.module_map_path.exist?
118
+ framework.module_map_path.mkpath
119
+ end
120
+ File.write("#{framework.module_map_path}/module.modulemap", module_map)
121
+
122
+ # unless framework.swift_module_path.exist?
123
+ # framework.swift_module_path.mkpath
124
+ # end
125
+ # DO BuildProductsPath swiftModule拷贝到 framework.swift_module_path
126
+ swiftmodule_path = File.join(@framework_BuildProductsPath, "#{@spec.name}.swiftmodule")
127
+ if File.directory?(swiftmodule_path)
128
+ FileUtils.cp_r("#{swiftmodule_path}/.", framework.swift_module_path)
129
+ end
130
+ swift_Compatibility_Header = "#{@framework_BuildProductsPath}/Swift\ Compatibility\ Header/#{@spec.name}-Swift.h"
131
+ FileUtils.cp(swift_Compatibility_Header,framework.headers_path) if File.exist?(swift_Compatibility_Header)
132
+ info_plist_file = File.join(File.dirname(File.dirname(__FILE__)),"info.plist")
133
+ FileUtils.cp(info_plist_file,framework.fwk_path)
92
134
  end
93
- File.write("#{framework.module_map_path}/module.modulemap", module_map)
135
+ else
136
+ UI.warn "== Headers/Public/#{@spec.name} no exist"
137
+ return false
94
138
  end
95
139
 
96
140
  end
141
+ return true
97
142
  end
98
143
 
99
144
  def copy_resources
100
145
 
146
+
101
147
  Dir.chdir(Pod::Config.instance.sandbox_root) do
102
148
 
103
149
  bundles = Dir.glob('./build/*.bundle')
@@ -126,7 +172,7 @@ module CBin
126
172
  expand_paths(real_source_dir, spec.consumer(@platform).resources)
127
173
  end.compact.uniq
128
174
 
129
- if resources.count == 0 && bundles.count == 0
175
+ if (resources.count == 0 || (resources.count == 1 && resources[0].count == 0)) && bundles.count == 0
130
176
  framework.delete_resources
131
177
  return
132
178
  end
@@ -150,10 +196,17 @@ module CBin
150
196
  `cp -rp #{library_name} #{output}`
151
197
  end
152
198
 
199
+ def build_static_framework_for_ios(output)
200
+ FileUtils.cp_r(framework_name, output)
201
+ end
202
+
153
203
  def library_name
154
204
  File.join(@local_build_dir, "lib#{@spec.name}.a")
155
205
  end
156
206
 
207
+ def framework_name
208
+ File.join(@local_build_dir, "#{@spec.name}.framework")
209
+ end
157
210
 
158
211
  def expand_paths(source_dir, path_specs)
159
212
  path_specs.map do |path_spec|
@@ -21,8 +21,11 @@ module CBin
21
21
  # 只允许二进制的 specification subspec 比源码的 specification subspec 多
22
22
  #
23
23
  def valid_sources(code_dependencies = false)
24
- sources = [binary_source, code_source]
25
- sources.reverse! if code_dependencies
24
+ sources = [code_source]
25
+ unless code_dependencies
26
+ sources << binary_source
27
+ sources.reverse!
28
+ end
26
29
  sources
27
30
  end
28
31
 
@@ -20,12 +20,12 @@ module CBin
20
20
  end
21
21
 
22
22
  def create
23
- spec = create_from_code_spec
24
-
25
- # Pod::UI.message '生成二进制 podspec 内容: '
26
- # spec.to_pretty_json.split("\n").each do |text|
27
- # Pod::UI.message text
28
- # end
23
+ # spec = nil
24
+ if CBin::Build::Utils.is_framework(@code_spec)
25
+ spec = create_framework_from_code_spec
26
+ else
27
+ spec = create_from_code_spec
28
+ end
29
29
 
30
30
  spec
31
31
  end
@@ -121,12 +121,69 @@ module CBin
121
121
  @spec.vendored_libraries = binary_vendored_libraries
122
122
  @spec.resources = binary_resources if @spec.attributes_hash.keys.include?("resources")
123
123
  @spec.description = <<-EOF
124
- 「 converted automatically by plugin cocoapods-imy-bin @slj 」
124
+ 「 converted automatically by plugin cocoapods-imy-bin @厦门美柚 - slj 」
125
+ #{@spec.description}
126
+ EOF
127
+ @spec
128
+ end
129
+
130
+ def create_framework_from_code_spec
131
+ @spec = code_spec.dup
132
+ # vendored_frameworks | resources | source | source_files | public_header_files
133
+ # license | resource_bundles | vendored_libraries
134
+
135
+ # Project Linkin
136
+ @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
137
+
138
+ # Resources
139
+ extnames = []
140
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
141
+ if code_spec_consumer.resources.any?
142
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
143
+ end
144
+ if extnames.any?
145
+ @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
146
+ end
147
+
148
+ # Source Location
149
+ @spec.source = binary_source
150
+
151
+ # Source Code
152
+ # @spec.source_files = framework_contents('Headers/*')
153
+ # @spec.public_header_files = framework_contents('Headers/*')
154
+
155
+ # Unused for binary
156
+ spec_hash = @spec.to_hash
157
+ # spec_hash.delete('license')
158
+ spec_hash.delete('resource_bundles')
159
+ spec_hash.delete('exclude_files')
160
+ spec_hash.delete('preserve_paths')
161
+ # 这里不确定 vendored_libraries 指定的时动态/静态库
162
+ # 如果是静态库的话,需要移除,否则就不移除
163
+ # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
164
+ # 这里统一只对命名后缀 .a 文件做处理
165
+ # spec_hash.delete('vendored_libraries')
166
+ # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
167
+ vendored_libraries = spec_hash.delete('vendored_libraries')
168
+ vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
169
+ if vendored_libraries.any?
170
+ spec_hash['vendored_libraries'] = vendored_libraries
171
+ end
172
+
173
+ # Filter platforms
174
+ platforms = spec_hash['platforms']
175
+ selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
176
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
177
+
178
+ @spec = Pod::Specification.from_hash(spec_hash)
179
+ @spec.description = <<-EOF
180
+ 「 converted automatically by plugin cocoapods-imy-bin @厦门美柚 - slj 」
125
181
  #{@spec.description}
126
- EOF
182
+ EOF
127
183
  @spec
128
184
  end
129
185
 
186
+
130
187
  def binary_source
131
188
  { http: format(CBin.config.binary_download_url, code_spec.root.name, code_spec.version), type: CBin.config.download_file_type }
132
189
  end
@@ -47,14 +47,19 @@ module CBin
47
47
  def curl_zip
48
48
  zip_file = "#{CBin::Config::Builder.instance.library_file(@spec)}.zip"
49
49
  res = File.exist?(zip_file)
50
- print <<EOF
50
+ unless res
51
+ zip_file = CBin::Config::Builder.instance.framework_zip_file(@spec) + ".zip"
52
+ res = File.exist?(zip_file)
53
+ end
54
+ if res
55
+ print <<EOF
51
56
  上传二进制文件
52
57
  curl #{CBin.config.binary_upload_url} -F "name=#{@spec.name}" -F "version=#{@spec.version}" -F "annotate=#{@spec.name}_#{@spec.version}_log" -F "file=@#{zip_file}"
53
58
  EOF
54
- `curl #{CBin.config.binary_upload_url} -F "name=#{@spec.name}" -F "version=#{@spec.version}" -F "annotate=#{@spec.name}_#{@spec.version}_log" -F "file=@#{zip_file}"` if res
59
+ `curl #{CBin.config.binary_upload_url} -F "name=#{@spec.name}" -F "version=#{@spec.version}" -F "annotate=#{@spec.name}_#{@spec.version}_log" -F "file=@#{zip_file}"` if res
60
+ end
55
61
 
56
62
  res
57
-
58
63
  end
59
64
 
60
65
 
@@ -16,4 +16,8 @@ if Pod.match_version?('~> 1.4')
16
16
  require 'cocoapods-imy-bin/native/acknowledgements'
17
17
  require 'cocoapods-imy-bin/native/sandbox_analyzer'
18
18
  require 'cocoapods-imy-bin/native/podspec_finder'
19
+ require 'cocoapods-imy-bin/native/file_accessor'
20
+ require 'cocoapods-imy-bin/native/pod_target_installer'
21
+ require 'cocoapods-imy-bin/native/target_validator'
22
+
19
23
  end
@@ -48,6 +48,8 @@ module Pod
48
48
  old_update_repositories
49
49
  end
50
50
  end
51
+
52
+
51
53
  end
52
54
  end
53
55
  end
@@ -0,0 +1,28 @@
1
+ require 'macho'
2
+ require 'cocoapods'
3
+
4
+ module Pod
5
+ class Sandbox
6
+ class FileAccessor
7
+
8
+ # swift动态库 需要设置为true
9
+ def dynamic_binary?(binary)
10
+ @cached_dynamic_binary_results ||= {}
11
+ return @cached_dynamic_binary_results[binary] unless @cached_dynamic_binary_results[binary].nil?
12
+ return false unless binary.file?
13
+
14
+ @cached_dynamic_binary_results[binary] = MachO.open(binary).dylib?
15
+ rescue MachO::MachOError
16
+ @cached_dynamic_binary_results[binary] = true
17
+
18
+ end
19
+
20
+ # def expanded_paths(patterns, options = {})
21
+ # return [] if patterns.empty?
22
+ # path_list.glob(patterns, options).flatten.compact.uniq
23
+ # end
24
+
25
+ #-----------------------------------------------------------------------#
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,94 @@
1
+ module Pod
2
+ class Installer
3
+ class Xcode
4
+ class PodsProjectGenerator
5
+ # Creates the target for the Pods libraries in the Pods project and the
6
+ # relative support files.
7
+ #
8
+ class PodTargetInstaller < TargetInstaller
9
+ require 'cocoapods/installer/xcode/pods_project_generator/app_host_installer'
10
+
11
+ # Adds a shell script phase, intended only for library targets that contain swift,
12
+ # to copy the ObjC compatibility header (the -Swift.h file that the swift compiler generates)
13
+ # to the built products directory. Additionally, the script phase copies the module map, appending a `.Swift`
14
+ # submodule that references the (moved) compatibility header. Since the module map has been moved, the umbrella header
15
+ # is _also_ copied, so that it is sitting next to the module map. This is necessary for a successful archive build.
16
+ #
17
+ # @param [PBXNativeTarget] native_target
18
+ # the native target to add the Swift static library script phase into.
19
+ #
20
+ # @return [Void]
21
+ #
22
+ alias old_add_swift_library_compatibility_header_phase add_swift_library_compatibility_header_phase
23
+
24
+ def add_swift_library_compatibility_header_phase(native_target)
25
+ UI.warn("========= swift add_swift_library_compatibility_header_phase")
26
+ if $ARGV[1] == "auto"
27
+ UI.warn("========= auto swift add_swift_library_compatibility_header_phase")
28
+
29
+ if custom_module_map
30
+ raise Informative, 'Using Swift static libraries with custom module maps is currently not supported. ' \
31
+ "Please build `#{target.label}` as a framework or remove the custom module map."
32
+ end
33
+
34
+ build_phase = native_target.new_shell_script_build_phase('Copy generated compatibility header')
35
+
36
+ relative_module_map_path = target.module_map_path.relative_path_from(target.sandbox.root)
37
+ relative_umbrella_header_path = target.umbrella_header_path.relative_path_from(target.sandbox.root)
38
+
39
+ build_phase.shell_script = <<-SH.strip_heredoc
40
+ COMPATIBILITY_HEADER_PATH="${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h"
41
+ MODULE_MAP_PATH="${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap"
42
+
43
+ ditto "${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h" "${COMPATIBILITY_HEADER_PATH}"
44
+ ditto "${PODS_ROOT}/#{relative_module_map_path}" "${MODULE_MAP_PATH}"
45
+ ditto "${PODS_ROOT}/#{relative_umbrella_header_path}" "${BUILT_PRODUCTS_DIR}"
46
+
47
+ COPY_PATH="${PODS_CONFIGURATION_BUILD_DIR}/${PRODUCT_MODULE_NAME}"
48
+ UMBRELLA_PATH="${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}-umbrella.h"
49
+ SWIFTMODULE_PATH="${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.swiftmodule"
50
+
51
+ ditto "${MODULE_MAP_PATH}" "${PODS_CONFIGURATION_BUILD_DIR}/${PRODUCT_MODULE_NAME}/${PRODUCT_MODULE_NAME}.modulemap"
52
+ ditto "${COMPATIBILITY_HEADER_PATH}" "${COPY_PATH}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h"
53
+ ditto "${COMPATIBILITY_HEADER_PATH}" "${COPY_PATH}"
54
+ ditto "${UMBRELLA_PATH}" "${COPY_PATH}"
55
+ ditto "${SWIFTMODULE_PATH}" "${COPY_PATH}/${PRODUCT_MODULE_NAME}.swiftmodule"
56
+ ditto "${SWIFTMODULE_PATH}" "${COPY_PATH}/${PRODUCT_MODULE_NAME}.swiftmodule"
57
+
58
+ if [ ${PRODUCT_MODULE_NAME} != ${PRODUCT_NAME} ] ; then
59
+ ditto "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}-umbrella.h" "${COPY_PATH}"
60
+ ditto "${COPY_PATH}" "${PODS_CONFIGURATION_BUILD_DIR}/${PRODUCT_NAME}"
61
+ fi
62
+
63
+ MODULE_MAP_SEARCH_PATH = "${PODS_CONFIGURATION_BUILD_DIR}/${PRODUCT_MODULE_NAME}/${PRODUCT_MODULE_NAME}.modulemap"
64
+
65
+ if [${MODULE_MAP_PATH} != ${MODULE_MAP_SEARCH_PATH}] ; then
66
+ printf "\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\"${COPY_PATH}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h\\"\\n requires objc\\n}\\n" >> "${MODULE_MAP_SEARCH_PATH}"
67
+ fi
68
+
69
+ printf "\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\"${COMPATIBILITY_HEADER_PATH}\\"\\n requires objc\\n}\\n" >> "${MODULE_MAP_PATH}"
70
+
71
+ SH
72
+ build_phase.input_paths = %W(
73
+ ${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h
74
+ ${PODS_ROOT}/#{relative_module_map_path}
75
+ ${PODS_ROOT}/#{relative_umbrella_header_path}
76
+ )
77
+ build_phase.output_paths = %W(
78
+ ${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap
79
+ ${BUILT_PRODUCTS_DIR}/#{relative_umbrella_header_path.basename}
80
+ ${BUILT_PRODUCTS_DIR}/Swift\ Compatibility\ Header/${PRODUCT_MODULE_NAME}-Swift.h
81
+ )
82
+ else
83
+ UI.warn("========= null swift add_swift_library_compatibility_header_phase")
84
+ old_add_swift_library_compatibility_header_phase(native_target)
85
+ end
86
+
87
+ end
88
+
89
+ #-----------------------------------------------------------------------#
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end