cocoapods-tdf-bin 0.0.1.1
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/LICENSE.txt +22 -0
- data/README.md +103 -0
- data/lib/cocoapods-tdf-bin.rb +2 -0
- data/lib/cocoapods-tdf-bin/command.rb +2 -0
- data/lib/cocoapods-tdf-bin/command/bin.rb +57 -0
- data/lib/cocoapods-tdf-bin/command/bin/archive.rb +222 -0
- data/lib/cocoapods-tdf-bin/command/bin/auto.rb +216 -0
- data/lib/cocoapods-tdf-bin/command/bin/code.rb +232 -0
- data/lib/cocoapods-tdf-bin/command/bin/imy.rb +46 -0
- data/lib/cocoapods-tdf-bin/command/bin/init.rb +69 -0
- data/lib/cocoapods-tdf-bin/command/bin/initHotKey.rb +70 -0
- data/lib/cocoapods-tdf-bin/command/bin/install.rb +44 -0
- data/lib/cocoapods-tdf-bin/command/bin/lib/lint.rb +69 -0
- data/lib/cocoapods-tdf-bin/command/bin/repo/update.rb +43 -0
- data/lib/cocoapods-tdf-bin/command/bin/spec/create.rb +73 -0
- data/lib/cocoapods-tdf-bin/command/bin/spec/push.rb +114 -0
- data/lib/cocoapods-tdf-bin/command/bin/update.rb +157 -0
- data/lib/cocoapods-tdf-bin/config/config.rb +138 -0
- data/lib/cocoapods-tdf-bin/config/config_asker.rb +57 -0
- data/lib/cocoapods-tdf-bin/config/config_builder.rb +238 -0
- data/lib/cocoapods-tdf-bin/config/config_hot_key.rb +103 -0
- data/lib/cocoapods-tdf-bin/config/config_hot_key_asker.rb +57 -0
- data/lib/cocoapods-tdf-bin/gem_version.rb +10 -0
- data/lib/cocoapods-tdf-bin/helpers.rb +5 -0
- data/lib/cocoapods-tdf-bin/helpers/Info.plist +0 -0
- data/lib/cocoapods-tdf-bin/helpers/build_helper.rb +162 -0
- data/lib/cocoapods-tdf-bin/helpers/build_utils.rb +101 -0
- data/lib/cocoapods-tdf-bin/helpers/framework.rb +85 -0
- data/lib/cocoapods-tdf-bin/helpers/framework_builder.rb +283 -0
- data/lib/cocoapods-tdf-bin/helpers/library.rb +54 -0
- data/lib/cocoapods-tdf-bin/helpers/library_builder.rb +90 -0
- data/lib/cocoapods-tdf-bin/helpers/sources_helper.rb +36 -0
- data/lib/cocoapods-tdf-bin/helpers/spec_creator.rb +168 -0
- data/lib/cocoapods-tdf-bin/helpers/spec_files_helper.rb +77 -0
- data/lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb +228 -0
- data/lib/cocoapods-tdf-bin/helpers/upload_helper.rb +89 -0
- data/lib/cocoapods-tdf-bin/native.rb +23 -0
- data/lib/cocoapods-tdf-bin/native/acknowledgements.rb +27 -0
- data/lib/cocoapods-tdf-bin/native/analyzer.rb +55 -0
- data/lib/cocoapods-tdf-bin/native/configuration.rb +26 -0
- data/lib/cocoapods-tdf-bin/native/file_accessor.rb +28 -0
- data/lib/cocoapods-tdf-bin/native/installation_options.rb +25 -0
- data/lib/cocoapods-tdf-bin/native/installer.rb +135 -0
- data/lib/cocoapods-tdf-bin/native/linter.rb +26 -0
- data/lib/cocoapods-tdf-bin/native/path_source.rb +33 -0
- data/lib/cocoapods-tdf-bin/native/pod_source_installer.rb +19 -0
- data/lib/cocoapods-tdf-bin/native/pod_target_installer.rb +94 -0
- data/lib/cocoapods-tdf-bin/native/podfile.rb +91 -0
- data/lib/cocoapods-tdf-bin/native/podfile_env.rb +37 -0
- data/lib/cocoapods-tdf-bin/native/podfile_generator.rb +199 -0
- data/lib/cocoapods-tdf-bin/native/podspec_finder.rb +25 -0
- data/lib/cocoapods-tdf-bin/native/resolver.rb +243 -0
- data/lib/cocoapods-tdf-bin/native/sandbox_analyzer.rb +34 -0
- data/lib/cocoapods-tdf-bin/native/source.rb +35 -0
- data/lib/cocoapods-tdf-bin/native/sources_manager.rb +20 -0
- data/lib/cocoapods-tdf-bin/native/specification.rb +31 -0
- data/lib/cocoapods-tdf-bin/native/target_validator.rb +41 -0
- data/lib/cocoapods-tdf-bin/native/validator.rb +40 -0
- data/lib/cocoapods-tdf-bin/source_provider_hook.rb +54 -0
- data/lib/cocoapods_plugin.rb +3 -0
- data/spec/command/bin_spec.rb +12 -0
- data/spec/spec_helper.rb +50 -0
- metadata +179 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'cocoapods-tdf-bin/config/config_hot_key'
|
3
|
+
|
4
|
+
module CBin
|
5
|
+
class Config_Hot_Key
|
6
|
+
class Asker
|
7
|
+
def show_prompt
|
8
|
+
print ' > '.green
|
9
|
+
end
|
10
|
+
|
11
|
+
def ask_with_answer(question, pre_answer, selection)
|
12
|
+
print "\n#{question}\n"
|
13
|
+
|
14
|
+
print_selection_info = lambda {
|
15
|
+
print "可选值:[ #{selection.join(' / ')} ]\n" if selection
|
16
|
+
}
|
17
|
+
print_selection_info.call
|
18
|
+
print "旧值:#{pre_answer}\n" unless pre_answer.nil?
|
19
|
+
|
20
|
+
answer = ''
|
21
|
+
loop do
|
22
|
+
show_prompt
|
23
|
+
answer = STDIN.gets.chomp.strip
|
24
|
+
|
25
|
+
if answer == '' && !pre_answer.nil?
|
26
|
+
answer = pre_answer
|
27
|
+
print answer.yellow
|
28
|
+
print "\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
next if answer.empty?
|
32
|
+
break if !selection || selection.include?(answer)
|
33
|
+
|
34
|
+
print_selection_info.call
|
35
|
+
end
|
36
|
+
|
37
|
+
answer
|
38
|
+
end
|
39
|
+
|
40
|
+
def wellcome_message
|
41
|
+
print <<~EOF
|
42
|
+
|
43
|
+
开始设置快捷键 pod bin imy.
|
44
|
+
所有的信息都会保存在 #{CBin.config_hot_key.config_file} 文件中.
|
45
|
+
%w[hot_key.yaml]
|
46
|
+
你可以在对应目录下手动添加编辑该文件. 文件包含的配置信息样式如下:
|
47
|
+
|
48
|
+
#{CBin.config_hot_key.default_config.to_yaml}
|
49
|
+
EOF
|
50
|
+
end
|
51
|
+
|
52
|
+
def done_message
|
53
|
+
print "\n设置完成.\n".green
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
Binary file
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# copy from https://github.com/CocoaPods/cocoapods-packager
|
2
|
+
|
3
|
+
require 'cocoapods-tdf-bin/native/podfile'
|
4
|
+
require 'cocoapods/command/gen'
|
5
|
+
require 'cocoapods/generate'
|
6
|
+
require 'cocoapods-tdf-bin/helpers/framework_builder'
|
7
|
+
require 'cocoapods-tdf-bin/helpers/library_builder'
|
8
|
+
require 'cocoapods-tdf-bin/config/config_builder'
|
9
|
+
|
10
|
+
module CBin
|
11
|
+
class Build
|
12
|
+
class Helper
|
13
|
+
include Pod
|
14
|
+
#class var
|
15
|
+
@@build_defines = ""
|
16
|
+
#Debug下还待完成
|
17
|
+
def initialize(spec,
|
18
|
+
platform,
|
19
|
+
framework_output,
|
20
|
+
zip,
|
21
|
+
rootSpec,
|
22
|
+
skip_archive = false,
|
23
|
+
build_model="Release")
|
24
|
+
@spec = spec
|
25
|
+
@platform = platform
|
26
|
+
@build_model = build_model
|
27
|
+
@rootSpec = rootSpec
|
28
|
+
@isRootSpec = rootSpec.name == spec.name
|
29
|
+
@skip_archive = skip_archive
|
30
|
+
@framework_output = framework_output
|
31
|
+
@zip = zip
|
32
|
+
|
33
|
+
@framework_path
|
34
|
+
end
|
35
|
+
|
36
|
+
def build
|
37
|
+
UI.section("Building static framework #{@spec}") do
|
38
|
+
|
39
|
+
|
40
|
+
unless @skip_archive
|
41
|
+
unless CBin::Build::Utils.is_framework(@spec)
|
42
|
+
build_static_library
|
43
|
+
zip_static_library
|
44
|
+
else
|
45
|
+
build_static_framework
|
46
|
+
zip_static_framework
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def build_static_framework
|
55
|
+
source_dir = Dir.pwd
|
56
|
+
file_accessor = Sandbox::FileAccessor.new(Pathname.new('.').expand_path, @spec.consumer(@platform))
|
57
|
+
Dir.chdir(workspace_directory) do
|
58
|
+
builder = CBin::Framework::Builder.new(@spec, file_accessor, @platform, source_dir, @isRootSpec, @build_model )
|
59
|
+
@@build_defines = builder.build if @isRootSpec
|
60
|
+
begin
|
61
|
+
@framework_path = builder.lipo_build(@@build_defines) unless @skip_archive
|
62
|
+
rescue
|
63
|
+
@skip_archive = true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def build_static_library
|
69
|
+
source_dir = zip_dir
|
70
|
+
file_accessor = Sandbox::FileAccessor.new(Pathname.new('.').expand_path, @spec.consumer(@platform))
|
71
|
+
Dir.chdir(workspace_directory) do
|
72
|
+
builder = CBin::Library::Builder.new(@spec, file_accessor, @platform, source_dir,@framework_path)
|
73
|
+
builder.build
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def zip_static_framework
|
78
|
+
unless @framework_path
|
79
|
+
return
|
80
|
+
end
|
81
|
+
Dir.chdir(zip_dir) do
|
82
|
+
output_name = File.join(zip_dir, "#{framework_name}.zip")
|
83
|
+
unless File.exist?(framework_name)
|
84
|
+
UI.puts "没有需要压缩的 framework 文件:#{framework_name}"
|
85
|
+
return
|
86
|
+
end
|
87
|
+
|
88
|
+
UI.puts "Compressing #{framework_name} into #{output_name}"
|
89
|
+
`zip --symlinks -r #{output_name} #{framework_name}`
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def zip_static_library
|
94
|
+
Dir.chdir(zip_dir) do
|
95
|
+
output_library = "#{library_name}.zip"
|
96
|
+
unless File.exist?(library_name)
|
97
|
+
raise Informative, "没有需要压缩的 library 文件:#{library_name}"
|
98
|
+
end
|
99
|
+
|
100
|
+
UI.puts "Compressing #{library_name} into #{output_library}"
|
101
|
+
|
102
|
+
`zip --symlinks -r #{output_library} #{library_name}`
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def clean_workspace
|
109
|
+
UI.puts 'Cleaning workspace'
|
110
|
+
|
111
|
+
FileUtils.rm_rf(gen_name)
|
112
|
+
Dir.chdir(zip_dir) do
|
113
|
+
FileUtils.rm_rf(framework_name) if @zip
|
114
|
+
FileUtils.rm_rf(library_name)
|
115
|
+
FileUtils.rm_rf(framework_name) unless @framework_output
|
116
|
+
FileUtils.rm_rf("#{framework_name}.zip") unless @framework_output
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def framework_name
|
121
|
+
CBin::Config::Builder.instance.framework_name(@spec)
|
122
|
+
end
|
123
|
+
|
124
|
+
def framework_name_zip
|
125
|
+
CBin::Config::Builder.instance.framework_name_version(@spec) + ".zip"
|
126
|
+
end
|
127
|
+
|
128
|
+
def library_name
|
129
|
+
CBin::Config::Builder.instance.library_name(@spec)
|
130
|
+
end
|
131
|
+
|
132
|
+
def workspace_directory
|
133
|
+
File.expand_path("#{gen_name}/#{@rootSpec.name}")
|
134
|
+
end
|
135
|
+
|
136
|
+
def zip_dir
|
137
|
+
CBin::Config::Builder.instance.zip_dir
|
138
|
+
end
|
139
|
+
|
140
|
+
def gen_name
|
141
|
+
CBin::Config::Builder.instance.gen_dir
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
def spec_file
|
146
|
+
@spec_file ||= begin
|
147
|
+
if @podspec
|
148
|
+
find_spec_file(@podspec)
|
149
|
+
else
|
150
|
+
if code_spec_files.empty?
|
151
|
+
raise Informative, '当前目录下没有找到可用源码 podspec.'
|
152
|
+
end
|
153
|
+
|
154
|
+
spec_file = code_spec_files.first
|
155
|
+
spec_file
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'cocoapods-tdf-bin/config/config'
|
3
|
+
|
4
|
+
module CBin
|
5
|
+
class Build
|
6
|
+
|
7
|
+
class Utils
|
8
|
+
|
9
|
+
def Utils.is_framework(spec)
|
10
|
+
return true
|
11
|
+
# if Utils.uses_frameworks?
|
12
|
+
# return true
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# return Utils.is_swift_module(spec)
|
16
|
+
end
|
17
|
+
|
18
|
+
def Utils.spec_header_dir(spec)
|
19
|
+
|
20
|
+
header_dir = "./Headers/Public/#{spec.name}"
|
21
|
+
header_dir = "./Pods/Headers/Public/#{spec.name}" unless File.exist?(header_dir)
|
22
|
+
|
23
|
+
unless File.exist?(header_dir)
|
24
|
+
# 一些库名称中使用了中划线如AAA-BBB,public header中库名称会默认处理成下划线AAA_BBB
|
25
|
+
module_name = spec.name.gsub("-", "_")
|
26
|
+
header_dir = "./Pods/Headers/Public/#{module_name}"
|
27
|
+
end
|
28
|
+
|
29
|
+
# 暂时只支持:ios
|
30
|
+
consumer = Pod::Specification::Consumer.new(spec, :ios)
|
31
|
+
unless consumer.header_dir.nil?
|
32
|
+
header_dir = File.join(header_dir, consumer.header_dir)
|
33
|
+
end
|
34
|
+
|
35
|
+
header_dir
|
36
|
+
end
|
37
|
+
|
38
|
+
def Utils.spec_module_dir(spec)
|
39
|
+
if spec.module_name.nil?
|
40
|
+
module_dir = "./Headers/Public/#{spec.name}"
|
41
|
+
module_dir = "./Pods/Headers/Public/#{spec.name}" unless File.exist?(module_dir)
|
42
|
+
unless File.exist?(module_dir)
|
43
|
+
# 一些库名称中使用了中划线如AAA-BBB,public header中库名称会默认处理成下划线AAA_BBB
|
44
|
+
module_name = spec.name.gsub("-", "_")
|
45
|
+
module_dir = "./Pods/Headers/Public/#{module_name}"
|
46
|
+
end
|
47
|
+
else
|
48
|
+
module_dir = "./Headers/Public/#{spec.module_name}"
|
49
|
+
module_dir = "./Pods/Headers/Public/#{spec.module_name}" unless File.exist?(module_dir)
|
50
|
+
end
|
51
|
+
|
52
|
+
module_dir
|
53
|
+
end
|
54
|
+
|
55
|
+
def Utils.is_swift_module(spec)
|
56
|
+
|
57
|
+
is_framework = false
|
58
|
+
dir = File.join(CBin::Config::Builder.instance.gen_dir, CBin::Config::Builder.instance.target_name)
|
59
|
+
#auto 走这里
|
60
|
+
if File.exist?(dir)
|
61
|
+
Dir.chdir(dir) do
|
62
|
+
spec_module_dir = Utils.spec_module_dir(spec)
|
63
|
+
return false unless File.exist?(spec_module_dir)
|
64
|
+
is_framework = File.exist?(File.join(spec_module_dir, "#{spec.name}-umbrella.h"))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
if $ARGV[1] == "local"
|
69
|
+
is_framework = File.exist?(File.join(CBin::Config::Builder.instance.xcode_build_dir, "#{spec.name}.framework"))
|
70
|
+
unless is_framework
|
71
|
+
is_framework = File.exist?(File.join(CBin::Config::Builder.instance.xcode_BuildProductsPath_dir, "#{spec.name}","Swift Compatibility Header"))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
is_framework
|
76
|
+
end
|
77
|
+
|
78
|
+
def Utils.uses_frameworks?
|
79
|
+
uses_frameworks = false
|
80
|
+
# podfile_path = Pod::Config.instance.installation_root.to_s + "/Example/podfile"
|
81
|
+
# begin
|
82
|
+
# podfile = Pod::Podfile.from_file(podfile_path)
|
83
|
+
# rescue
|
84
|
+
# podfile = Pod::Config.instance.podfile
|
85
|
+
# end
|
86
|
+
Pod::Config.instance.podfile.target_definitions.each do |key,value|
|
87
|
+
if key != "Pods"
|
88
|
+
uses_frameworks = value.uses_frameworks?
|
89
|
+
if uses_frameworks
|
90
|
+
break ;
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
return uses_frameworks
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# copy from https://github.com/CocoaPods/cocoapods-packager
|
2
|
+
|
3
|
+
module CBin
|
4
|
+
class Framework
|
5
|
+
attr_reader :headers_path
|
6
|
+
attr_reader :module_map_path
|
7
|
+
attr_reader :resources_path
|
8
|
+
attr_reader :root_path
|
9
|
+
attr_reader :versions_path
|
10
|
+
attr_reader :swift_module_path
|
11
|
+
attr_reader :fwk_path
|
12
|
+
|
13
|
+
def initialize(name, platform)
|
14
|
+
@name = name
|
15
|
+
@platform = platform
|
16
|
+
end
|
17
|
+
|
18
|
+
def make
|
19
|
+
make_root
|
20
|
+
make_framework
|
21
|
+
make_headers
|
22
|
+
make_resources
|
23
|
+
make_current_version
|
24
|
+
end
|
25
|
+
|
26
|
+
def delete_resources
|
27
|
+
Pathname.new(@resources_path).rmtree if File.exist? (@resources_path)
|
28
|
+
(Pathname.new(@fwk_path) + Pathname.new('Resources')).delete if File.exist?(Pathname.new(@fwk_path) + Pathname.new('Resources'))
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove_current_version
|
32
|
+
FileUtils.rm_f(File.join(@fwk_path,@name))
|
33
|
+
FileUtils.rm_f(File.join(@fwk_path,"Headers"))
|
34
|
+
FileUtils.rm_f(File.join(@fwk_path,"Resources"))
|
35
|
+
|
36
|
+
FileUtils.cp_r("#{@versions_path}/.", @fwk_path)
|
37
|
+
# FileUtils.remove_dir(@versions_path)
|
38
|
+
FileUtils.remove_dir("#{@fwk_path}/Versions")
|
39
|
+
|
40
|
+
# current_version_path = @versions_path + Pathname.new('../Current')
|
41
|
+
# `ln -sf A #{current_version_path}`
|
42
|
+
# `ln -sf Versions/Current/Headers #{@fwk_path}/`
|
43
|
+
# `ln -sf Versions/Current/Resources #{@fwk_path}/`
|
44
|
+
# `ln -sf Versions/Current/#{@name} #{@fwk_path}/`
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def make_current_version
|
50
|
+
current_version_path = @versions_path + Pathname.new('../Current')
|
51
|
+
`ln -sf A #{current_version_path}`
|
52
|
+
`ln -sf Versions/Current/Headers #{@fwk_path}/`
|
53
|
+
`ln -sf Versions/Current/Resources #{@fwk_path}/`
|
54
|
+
`ln -sf Versions/Current/#{@name} #{@fwk_path}/`
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
def make_framework
|
60
|
+
@fwk_path = @root_path + Pathname.new(@name + '.framework')
|
61
|
+
@fwk_path.mkdir unless @fwk_path.exist?
|
62
|
+
|
63
|
+
@module_map_path = @fwk_path + Pathname.new('Modules')
|
64
|
+
@swift_module_path = @module_map_path + Pathname.new(@name + '.swiftmodule')
|
65
|
+
|
66
|
+
|
67
|
+
@versions_path = @fwk_path + Pathname.new('Versions/A')
|
68
|
+
end
|
69
|
+
|
70
|
+
def make_headers
|
71
|
+
@headers_path = @versions_path + Pathname.new('Headers')
|
72
|
+
@headers_path.mkpath unless @headers_path.exist?
|
73
|
+
end
|
74
|
+
|
75
|
+
def make_resources
|
76
|
+
@resources_path = @versions_path + Pathname.new('Resources')
|
77
|
+
@resources_path.mkpath unless @resources_path.exist?
|
78
|
+
end
|
79
|
+
|
80
|
+
def make_root
|
81
|
+
@root_path = Pathname.new(@platform)
|
82
|
+
@root_path.mkpath unless @root_path.exist?
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,283 @@
|
|
1
|
+
# copy from https://github.com/CocoaPods/cocoapods-packager
|
2
|
+
|
3
|
+
require 'cocoapods-tdf-bin/helpers/framework.rb'
|
4
|
+
require 'English'
|
5
|
+
require 'cocoapods-tdf-bin/config/config_builder'
|
6
|
+
require 'shellwords'
|
7
|
+
|
8
|
+
module CBin
|
9
|
+
class Framework
|
10
|
+
class Builder
|
11
|
+
include Pod
|
12
|
+
#Debug下还待完成
|
13
|
+
def initialize(spec, file_accessor, platform, source_dir, isRootSpec = true, build_model="Debug")
|
14
|
+
@spec = spec
|
15
|
+
@source_dir = source_dir
|
16
|
+
@file_accessor = file_accessor
|
17
|
+
@platform = platform
|
18
|
+
@build_model = build_model
|
19
|
+
@isRootSpec = isRootSpec
|
20
|
+
#vendored_static_frameworks 只有 xx.framework 需要拼接为 xx.framework/xx by slj
|
21
|
+
vendored_static_frameworks = file_accessor.vendored_static_frameworks.map do |framework|
|
22
|
+
path = framework
|
23
|
+
extn = File.extname path
|
24
|
+
if extn.downcase == '.framework'
|
25
|
+
path = File.join(path,File.basename(path, extn))
|
26
|
+
end
|
27
|
+
path
|
28
|
+
end
|
29
|
+
|
30
|
+
@vendored_libraries = (vendored_static_frameworks + file_accessor.vendored_static_libraries).map(&:to_s)
|
31
|
+
end
|
32
|
+
|
33
|
+
def build
|
34
|
+
defines = compile
|
35
|
+
build_sim_libraries(defines)
|
36
|
+
|
37
|
+
defines
|
38
|
+
end
|
39
|
+
|
40
|
+
def lipo_build(defines)
|
41
|
+
UI.section("Building static Library #{@spec}") do
|
42
|
+
|
43
|
+
cp_framework_to_source_dir
|
44
|
+
build_static_library_for_ios
|
45
|
+
|
46
|
+
copy_resources
|
47
|
+
|
48
|
+
end
|
49
|
+
framework
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def cp_framework_to_source_dir
|
55
|
+
framework_name = "#{@spec.name}.framework"
|
56
|
+
framework_dir = "./build-armv7/#{framework_name}" if File.exist?('./build-armv7')
|
57
|
+
framework_dir = "./build-arm64/#{framework_name}" if File.exist?('./build-arm64')
|
58
|
+
target_dir = File.join(CBin::Config::Builder.instance.zip_dir,framework_name)
|
59
|
+
|
60
|
+
zip_dir = CBin::Config::Builder.instance.zip_dir
|
61
|
+
FileUtils.mkdir_p(zip_dir) unless File.exist?(zip_dir)
|
62
|
+
|
63
|
+
`cp -fa #{framework_dir} #{target_dir}`
|
64
|
+
end
|
65
|
+
|
66
|
+
def cp_to_source_dir
|
67
|
+
framework_name = "#{@spec.name}.framework"
|
68
|
+
target_dir = File.join(CBin::Config::Builder.instance.zip_dir,framework_name)
|
69
|
+
FileUtils.rm_rf(target_dir) if File.exist?(target_dir)
|
70
|
+
|
71
|
+
zip_dir = CBin::Config::Builder.instance.zip_dir
|
72
|
+
FileUtils.mkdir_p(zip_dir) unless File.exist?(zip_dir)
|
73
|
+
|
74
|
+
`cp -fa #{@platform}/#{framework_name} #{target_dir}`
|
75
|
+
end
|
76
|
+
|
77
|
+
#模拟器,目前只支持 debug x86-64
|
78
|
+
def build_sim_libraries(defines)
|
79
|
+
UI.message 'Building simulator libraries'
|
80
|
+
|
81
|
+
# archs = %w[i386 x86_64]
|
82
|
+
archs = ios_architectures_sim
|
83
|
+
archs.map do |arch|
|
84
|
+
xcodebuild(defines, "-sdk iphonesimulator ARCHS=\'#{arch}\' ", "build-#{arch}",@build_model)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def static_libs_in_sandbox(build_dir = 'build')
|
90
|
+
file = Dir.glob("#{build_dir}/lib#{target_name}.a")
|
91
|
+
unless file
|
92
|
+
UI.warn "file no find = #{build_dir}/lib#{target_name}.a"
|
93
|
+
end
|
94
|
+
file
|
95
|
+
end
|
96
|
+
|
97
|
+
=begin
|
98
|
+
lipo合并 二进制
|
99
|
+
=end
|
100
|
+
def build_static_library_for_ios
|
101
|
+
UI.message "Building ios libraries with archs #{ios_architectures}"
|
102
|
+
|
103
|
+
framework_name = "#{@spec.name}.framework/#{@spec.name}"
|
104
|
+
output = File.join(CBin::Config::Builder.instance.zip_dir,framework_name)
|
105
|
+
|
106
|
+
build_path = Pathname("build")
|
107
|
+
build_path.path unless build_path.exist?
|
108
|
+
|
109
|
+
# if is_debug_model
|
110
|
+
libs = (ios_architectures + ios_architectures_sim) .map do |arch|
|
111
|
+
library = "build-#{arch}/#{@spec.name}.framework/#{@spec.name}"
|
112
|
+
library
|
113
|
+
end
|
114
|
+
|
115
|
+
UI.message "lipo -create -output #{output} #{libs.join(' ')}"
|
116
|
+
`lipo -create -output #{output} #{libs.join(' ')}`
|
117
|
+
end
|
118
|
+
|
119
|
+
def ios_build_options
|
120
|
+
"ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'"
|
121
|
+
end
|
122
|
+
|
123
|
+
def ios_architectures
|
124
|
+
# >armv7
|
125
|
+
# iPhone4
|
126
|
+
# iPhone4S
|
127
|
+
# >armv7s 去掉
|
128
|
+
# iPhone5
|
129
|
+
# iPhone5C
|
130
|
+
# >arm64
|
131
|
+
# iPhone5S(以上)
|
132
|
+
# >i386
|
133
|
+
# iphone5,iphone5s以下的模拟器
|
134
|
+
# >x86_64
|
135
|
+
# iphone6以上的模拟器
|
136
|
+
archs = %w[arm64 armv7]
|
137
|
+
# archs = %w[x86_64 arm64 armv7s i386]
|
138
|
+
# @vendored_libraries.each do |library|
|
139
|
+
# archs = `lipo -info #{library}`.split & archs
|
140
|
+
# end
|
141
|
+
archs
|
142
|
+
end
|
143
|
+
|
144
|
+
def ios_architectures_sim
|
145
|
+
|
146
|
+
archs = %w[x86_64]
|
147
|
+
archs
|
148
|
+
end
|
149
|
+
|
150
|
+
def compile
|
151
|
+
defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited)'"
|
152
|
+
defines += ' '
|
153
|
+
defines += @spec.consumer(@platform).compiler_flags.join(' ')
|
154
|
+
|
155
|
+
options = ios_build_options
|
156
|
+
# if is_debug_model
|
157
|
+
archs = ios_architectures
|
158
|
+
# archs = %w[arm64 armv7 armv7s]
|
159
|
+
archs.map do |arch|
|
160
|
+
xcodebuild(defines, "ARCHS=\'#{arch}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'","build-#{arch}",@build_model)
|
161
|
+
end
|
162
|
+
# else
|
163
|
+
# xcodebuild(defines,options)
|
164
|
+
# end
|
165
|
+
|
166
|
+
defines
|
167
|
+
end
|
168
|
+
|
169
|
+
def is_debug_model
|
170
|
+
@build_model == "Debug"
|
171
|
+
end
|
172
|
+
|
173
|
+
def target_name
|
174
|
+
#区分多平台,如配置了多平台,会带上平台的名字
|
175
|
+
# 如libwebp-iOS
|
176
|
+
if @spec.available_platforms.count > 1
|
177
|
+
"#{@spec.name}-#{Platform.string_name(@spec.consumer(@platform).platform_name)}"
|
178
|
+
else
|
179
|
+
@spec.name
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def xcodebuild(defines = '', args = '', build_dir = 'build', build_model = 'Debug')
|
184
|
+
|
185
|
+
unless File.exist?("Pods.xcodeproj") #cocoapods-generate v2.0.0
|
186
|
+
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{File.join(File.expand_path("..", build_dir), File.basename(build_dir))} clean build -configuration #{build_model} -target #{target_name} -project ./Pods/Pods.xcodeproj 2>&1"
|
187
|
+
else
|
188
|
+
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{build_model} -target #{target_name} -project ./Pods.xcodeproj 2>&1"
|
189
|
+
end
|
190
|
+
|
191
|
+
UI.message "command = #{command}"
|
192
|
+
output = `#{command}`.lines.to_a
|
193
|
+
|
194
|
+
if $CHILD_STATUS.exitstatus != 0
|
195
|
+
raise <<~EOF
|
196
|
+
Build command failed: #{command}
|
197
|
+
Output:
|
198
|
+
#{output.map { |line| " #{line}" }.join}
|
199
|
+
EOF
|
200
|
+
|
201
|
+
Process.exit
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def copy_resources
|
206
|
+
resource_dir = './build/*.bundle'
|
207
|
+
resource_dir = './build-armv7/*.bundle' if File.exist?('./build-armv7')
|
208
|
+
resource_dir = './build-arm64/*.bundle' if File.exist?('./build-arm64')
|
209
|
+
|
210
|
+
framework_name = "#{@spec.name}.framework"
|
211
|
+
resource_target_dir = File.join(CBin::Config::Builder.instance.zip_dir,framework_name,"Resources")
|
212
|
+
|
213
|
+
FileUtils.mkdir_p(resource_target_dir) unless File.exist?(resource_target_dir)
|
214
|
+
|
215
|
+
bundles = Dir.glob(resource_dir)
|
216
|
+
|
217
|
+
bundle_names = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
|
218
|
+
consumer = spec.consumer(@platform)
|
219
|
+
consumer.resource_bundles.keys +
|
220
|
+
consumer.resources.map do |r|
|
221
|
+
File.basename(r, '.bundle') if File.extname(r) == 'bundle'
|
222
|
+
end
|
223
|
+
end.compact.uniq
|
224
|
+
|
225
|
+
bundles.select! do |bundle|
|
226
|
+
bundle_name = File.basename(bundle, '.bundle')
|
227
|
+
bundle_names.include?(bundle_name)
|
228
|
+
end
|
229
|
+
|
230
|
+
if bundles.count > 0
|
231
|
+
UI.message "Copying bundle files #{bundles}"
|
232
|
+
bundle_files = bundles.join(' ')
|
233
|
+
`cp -rp #{bundle_files} #{resource_target_dir} 2>&1`
|
234
|
+
end
|
235
|
+
|
236
|
+
real_source_dir = @source_dir
|
237
|
+
unless @isRootSpec
|
238
|
+
spec_source_dir = File.join(Dir.pwd,"#{@spec.name}")
|
239
|
+
unless File.exist?(spec_source_dir)
|
240
|
+
spec_source_dir = File.join(Dir.pwd,"Pods/#{@spec.name}")
|
241
|
+
end
|
242
|
+
raise "copy_resources #{spec_source_dir} no exist " unless File.exist?(spec_source_dir)
|
243
|
+
|
244
|
+
real_source_dir = spec_source_dir
|
245
|
+
end
|
246
|
+
resources = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
|
247
|
+
expand_paths(real_source_dir, spec.consumer(@platform).resources)
|
248
|
+
end.compact.uniq
|
249
|
+
|
250
|
+
if resources.count == 0 && bundles.count == 0
|
251
|
+
framework.delete_resources
|
252
|
+
return
|
253
|
+
end
|
254
|
+
|
255
|
+
if resources.count > 0
|
256
|
+
#把 路径转义。 避免空格情况下拷贝失败
|
257
|
+
escape_resource = []
|
258
|
+
resources.each do |source|
|
259
|
+
escape_resource << Shellwords.join(source)
|
260
|
+
end
|
261
|
+
UI.message "Copying resources #{escape_resource}"
|
262
|
+
`cp -rp #{escape_resource.join(' ')} #{resource_target_dir}`
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def expand_paths(source_dir, path_specs)
|
267
|
+
path_specs.map do |path_spec|
|
268
|
+
Dir.glob(File.join(source_dir, path_spec))
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
def framework
|
273
|
+
@framework ||= begin
|
274
|
+
framework = Framework.new(@spec.name, @platform.name.to_s)
|
275
|
+
framework.make
|
276
|
+
framework
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|