-
Notifications
You must be signed in to change notification settings - Fork 193
/
rubyc.1
127 lines (127 loc) · 5.54 KB
/
rubyc.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
.Dd December 16, 2009
.Dt RUBYC 1
.Os
.Sh NAME
.Nm rubyc
.Nd MacRuby Ahead-of-Time Compiler
.Sh SYNOPSIS
.Nm rubyc
.Op Ar options...
.Ar files...
.Sh DESCRIPTION
.Nm rubyc
is a command-line interface to the MacRuby Ahead-of-Time (AOT) compiler. It statically compiles Ruby source code into native machine code (object files), and can then link it (dynamically or statically) into executables or dynamic libraries. It is typically invoked from
.Nm ruby_deploy
rather than being called directly.
.Pp
The Ahead-of-Time compilation process has two major advantages. The Ruby code does not need to be parsed and compiled at runtime, which improves the startup time of the program, and the original Ruby source code is no longer available, as it has been compiled down to machine code.
.Sh OPTIONS
The
.Nm rubyc
tool accepts the following command-line options:
.Bl -tag -width "123" -compact
.Pp
.It Fl a Ar arch , Fl -arch Ar arch
Compile for specified CPU architecture. By default,
.Nm rubyc
will compile for the current architecture. This option will compile for a different architecture. When this option is provided more than once,
.Nm rubyc
will create a universal binary. At the time of this writing, only the i386 and x86_64 architectures are supported.
.Pp
.It Fl c
Compile and assemble, but do not link. This option produces a Mach-O object file (.o) for every Ruby source file passed to
.Nm rubyc ,
using a default file name which consists of the source file name with the .o file extension. Such a file can later be passed to
.Nm rubyc
to create a dynamic library or executable.
.Pp
.It Fl C
Compile, assemble, and link a loadable object file. This option produces a Mach-O MacRuby loadable object bundle (.rbo) for every Ruby source file passed to
.Nm rubyc ,
using a default file name which consists of the source file name with the .rbo file extension. A MacRuby loadable object is a Mach-O bundle, compiled with a global constructor that will evaluate the Ruby machine code once it's loaded by the dynamic linker, at runtime, generally upon a Ruby #require statement.
.Pp
.It Fl -dylib
Create a dynamic library instead of an executable. This option compiles every Ruby source file passed to
.Nm rubyc
and produces a Mach-O dynamic library (.dylib). This library is compiled with a global constructor that will register every Ruby machine code file into the MacRuby runtime once it's loaded by the dynamic linker, at runtime. This library is intended to be linked against an executable that uses the MacRuby runtime, for example executables generated by
.Nm rubyc .
The
.Fl o
option must be provided when building dynamic libraries.
.Pp
.It Fl h, Fl -help
Display a short description of the command line options.
.Pp
.It Fl o Ar file
Place the output into
.Ar file .
If this option is not given,
.Nm rubyc
will try to determine a default output file name based on the object file type that is being generated. For executables, the default is a.out. For objects, the default is the original source file name with the object type extension. For dynamic libraries, this option is mandatory.
.Pp
.It Fl -static
Create a standalone, static executable. By default, executables created by
.Nm rubyc
are dynamically linked against the MacRuby runtime. This option will generate executables that are statically linked against the MacRuby runtime, significantly increasing the binary size but allowing its distribution on environments where MacRuby is not installed. This option can only be used when creating executables.
.Pp
.It Fl v, Fl -version
Display the version.
.Pp
.It Fl V, Fl -verbose
Print every command line executed by
.Nm rubyc .
This option is generally used for internal debugging.
.El
.Sh EXAMPLES
When used without options,
.Nm rubyc
will create a binary executable, like the C compiler.
.Pp
.Dl $ echo """p 42""" > test.rb
.Dl $ rubyc test.rb
.Dl $ ./a.out
.Pp
When building an executable, the very first file passed to
.Nm rubyc
will be considered as the main file. Its machine code will be run once the executable starts. Other machine code files will be linked into the executable, but only run upon #require calls.
.Pp
.Dl $ echo """def t1; 21; end""" > t1.rb
.Dl $ echo """def t2; 21; end""" > t2.rb
.Dl $ echo """require 't1'; require 't2'; p t1+t2""" > test.rb
.Dl $ rubyc test.rb t1.rb t2.rb -o test
.Dl $ ./test
.Pp
.Nm rubyc
is also able to generate a dynamic library (.dylib) out of Ruby source files, using the
.Fl -dylib
option. Such a library can later be linked against an executable that uses the MacRuby runtime. Like executables, the Ruby machine code files will run upon #require calls. Libraries can also be passed to
.Nm rubyc
when forming an executable, allowing the compilation of multiple executables sharing common code.
.Pp
.Dl $ rubyc t1.rb t2.rb -o code.dylib --dylib
.Dl $ rubyc test.rb code.dylib -o test
.Dl $ ./test
.Pp
.Sh USAGE
Generally, you should use
.Nm ruby
and
.Nm irb
during development, and
.Nm ruby_deploy
(via the Xcode target) when deploying Cocoa applications. However, calling
.Nm rubyc
provides greater control, and allows you to create libraries and standalone executables.
.Pp
The easiest way to compile an existing project is to generate loadable object bundles for every Ruby source file, e.g., using the
.Fl C
option and the find command:
.Pp
.Dl $ find ./lib -name """*.rb""" -exec rubyc -C {} \e;
.Pp
This creates bundles with the .rbo file extension in the same directory as the original .rb source files. The MacRuby runtime will always pick .rbo files over .rb files upon #require calls. The source files can then be removed.
.Pp
.Sh SEE ALSO
.Xr ruby 1 ,
.Xr irb 1 ,
.Xr ruby_deploy 1