2008 07 04BridgeSupport's type and type64
BridgeSupport describes the system's frameworks in .xml files. This is used by RubyCocoa to call C functions and understand C enums, constants and structs. It looks like this :
<function name='NSRunAlertPanel' variadic='true'> <arg name='title' declared_type='NSString*' type='@'/> <arg printf_format='true' name='msgFormat' declared_type='NSString*' type='@'/> <arg name='defaultButton' declared_type='NSString*' type='@'/> <arg name='alternateButton' declared_type='NSString*' type='@'/> <arg name='otherButton' declared_type='NSString*' type='@'/> <retval declared_type='NSInteger' type='i' type64='q'/> </function>
gen_bridge_metadata.rb
analyzes the frameworks and outputs this description. type
and type64
are in fact type encodings, straight from the compiler's @encode
function !
To generate a .bridgesupport
file, feed gen_bridge_metadata.rb
a framework path and it will :
- analyze the framework's header files
- collect enum, constant, struct definitions
- build dummy C files asking for type encodings (
printf
of the type's@encode
output) and constant values - compile those dummy files
- execute them then parse the output, yielding the compiler's type encodings of structs and functions plus constant values
Once done, the .bridgesupport
file can be generated. All of this is done without the framework's sources — just by parsing its headers. Both hacky and elegant !
Sample log
BridgeSupport handling QuartzCore shows a log ofgen_bridge_metadata.rb
describing the frameworks.