mirror of
https://github.com/zhigang1992/RubyMotion.git
synced 2026-04-01 09:31:20 +08:00
139 lines
4.2 KiB
Ruby
Executable File
139 lines
4.2 KiB
Ruby
Executable File
#!/usr/bin/ruby
|
|
|
|
# Monkey-patch gen_bridge_metadata
|
|
|
|
load '/usr/bin/gen_bridge_metadata'
|
|
|
|
module Bridgesupportparser
|
|
class Parser
|
|
# From /System/Library/BridgeSupport/ruby-1.8/bridgesupportparser.rb
|
|
def recursivefuncptr(f)
|
|
return nil if f.nil?
|
|
func, rettype, retenc, retattrs, retfunc, fattrs, variadic, inline = f.info
|
|
ret = Bridgesupportparser::RetvalPtrInfo.new(self, nil, rettype, retenc, retattrs, recursivefuncptr(retfunc))
|
|
args = Bridgesupportparser::MergingSequence.new('recursivefuncptr')
|
|
f.each_argument do |name, type, enc, attrs, funcptr|
|
|
# RubyMotion change:
|
|
#
|
|
# In the original implementation the last argument is always nil,
|
|
# but we need to enable recursive parsing.
|
|
#
|
|
# Related to: http://hipbyte.myjetbrains.com/youtrack/issue/RM-288
|
|
args << Bridgesupportparser::ArgInfo.new(self, name, type, enc, attrs, recursivefuncptr(funcptr))
|
|
end
|
|
Bridgesupportparser::FuncInfo.new(self, func, ret, args, fattrs, variadic, inline)
|
|
end
|
|
end
|
|
end
|
|
|
|
# Because this is not a method, in the original implementation, we need to copy it verbatim.
|
|
if __FILE__ == $0
|
|
g = BridgeSupportGenerator.new
|
|
OptionParser.new do |opts|
|
|
opts.banner = "Usage: #{File.basename(__FILE__)} [options] <headers...>"
|
|
opts.separator ''
|
|
opts.separator 'Options:'
|
|
|
|
opts.on('-f', '--framework FRAMEWORK', 'Generate metadata for the given framework.') do |opt|
|
|
g.frameworks << opt
|
|
end
|
|
|
|
opts.on('-p', '--private', 'Support private frameworks headers.') do
|
|
g.private = true
|
|
end
|
|
|
|
formats = BridgeSupportGenerator::FORMATS
|
|
opts.on('-F', '--format FORMAT', formats, {}, "Select metadata format.") do |opt|
|
|
g.generate_format = opt
|
|
end
|
|
|
|
opts.on('-e', '--exception EXCEPTION', 'Use the given exception file.') do |opt|
|
|
g.exception_paths << opt
|
|
end
|
|
|
|
# both 32 & 64 bit is now the default
|
|
enable_32 = true
|
|
enable_64 = true
|
|
opts.on(nil, '--64-bit', 'Write 64-bit annotations (now the default).') do
|
|
enable_64 = true
|
|
end
|
|
opts.on(nil, '--no-64-bit', 'Do not write 64-bit annotations.') do
|
|
enable_64 = false
|
|
end
|
|
no_32bit_support = `/usr/bin/sw_vers -productVersion`.strip >= '10.9'
|
|
if no_32bit_support
|
|
opts.on(nil, '--no-32-bit', 'Do not write 32-bit annotations.') do
|
|
enable_32 = false
|
|
end
|
|
end
|
|
|
|
opts.on('-c', '--cflags FLAGS', 'Specify custom compiler flags.') do |flags|
|
|
g.compiler_flags ||= ''
|
|
g.compiler_flags << ' ' + flags + ' '
|
|
end
|
|
|
|
compiler_flags_64 = nil
|
|
opts.on('-C', '--cflags-64 FLAGS', 'Specify custom 64-bit compiler flags.') do |flags|
|
|
compiler_flags_64 ||= ''
|
|
compiler_flags_64 << ' ' + flags + ' '
|
|
end
|
|
|
|
opts.on('-o', '--output FILE', 'Write output to the given file.') do |opt|
|
|
die 'Output file can\'t be specified more than once' if @out_file
|
|
g.out_file = opt
|
|
end
|
|
|
|
help_msg = "Use the `-h' flag or consult gen_bridge_metadata(1) for help."
|
|
opts.on('-h', '--help', 'Show this message.') do
|
|
puts opts, help_msg
|
|
exit
|
|
end
|
|
|
|
opts.on('-d', '--debug', 'Turn on debugging messages.') do
|
|
$DEBUG = true
|
|
end
|
|
|
|
opts.on('-v', '--version', 'Show version.') do
|
|
puts BridgeSupportGenerator::VERSION
|
|
exit
|
|
end
|
|
|
|
opts.separator ''
|
|
|
|
if ARGV.empty?
|
|
die opts.banner
|
|
else
|
|
begin
|
|
opts.parse!(ARGV)
|
|
ARGV.each { |header| g.add_header(header) }
|
|
if no_32bit_support
|
|
g.parse(enable_32, enable_64, compiler_flags_64)
|
|
else
|
|
g.parse(enable_64, compiler_flags_64)
|
|
end
|
|
# g.collect
|
|
# if enable_64
|
|
# g2 = g.duplicate
|
|
# g2.enable_64 = true
|
|
# if compiler_flags_64 != g.compiler_flags
|
|
# g2.compiler_flags = compiler_flags_64
|
|
# end
|
|
# g2.collect
|
|
# g.merge_64_metadata(g2)
|
|
# end
|
|
g.write
|
|
# g.cleanup
|
|
rescue => e
|
|
msg = e.message
|
|
msg = 'Internal error' if msg.empty?
|
|
$DEBUG = true #DEBUG
|
|
if $DEBUG
|
|
$stderr.puts "Received exception: #{e}:"
|
|
$stderr.puts e.backtrace.join("\n")
|
|
end
|
|
die msg, opts.banner, help_msg
|
|
end
|
|
end
|
|
end
|
|
end
|