The ic module is an Erlang implementation of an OMG IDL compiler. Depending on the choice of back-end the code will map to Erlang or C. The compiler generates client stub code and server behaviors.
Two kinds of files are generated for each scope, Erlang/C files and Erlang/C header files. Headers are used to store record definitions, while usual Erlang/C files contain the object interface functions, the object server or access functions for records defined in interfaces.
ic:gen(FileName) -> Result
ic:gen(FileName, [Option]) -> Result
Result = ok | error | {ok, [Warning}} | {error, [Warning],
[Error]}
Option = [ GeneralOption | CodeOption | WarningOption | BackendOption ]
GeneralOption =
{outdir, String()) | {cfgfile, String()} | {use_preproc, bool()} |
{preproc_cmd, String()} | {preproc_flags, String()}
CodeOption =
{gen_hrl, bool()} | {serv_last_call, exception | exit} |
{{impl, String()}, String()} | {{this, String()}, bool()} |
{{handle_info, String()}, bool()} | {timeout, String()} |
{scoped_op_calls, bool()} | {scl, bool()}
{precond, {atom(), atom()}} | {{precond, String()} {atom(), atom()}} |
{postcond, {atom(), atom()}} | {{postcond, String()} {atom(), atom()}}
WarningOption =
{'Wall', bool()} | {maxerrs, int() | infinity} |
{maxwarns, int() | infinity} | {nowarn, bool()} |
{warn_name_shadow, bool()} | {pedantic, bool()} |
{silent, bool()}
BackendOption =
{be, erl_corba | erl_plain | erl_genserv | c_genserv | c_client | c_server } |
DirNAme = string() | atom()
FileName = string() | atom()
The tuple {Option
, true} can be replaced with
Option
for boolean values.
Example: ic:gen(x, [{outdir, "output/generated"}])
".ic_config"
.
Example: ic:gen(x, [{cfgfile, "special.cfg"}])
preproc_cmd++preproc_flags++FileName
Example1: ic:gen(x, [{preproc_cmd, "erl"}])
Example2: ic:gen(x, [{preproc_cmd, "gcc -x c++ -E"}])
Example: ic:gen(x, [{preproc_flags, "-I../include"
gen_server handle_call
either raise a
CORBA exception or just exit plainly. Default is the exception.
"M1::I1"
.
this
which activates the
parameter for all interfaces in the source file, {this,
IntfName}
which activates the parameter for a specified
interface and {{this, IntfName}, false}
which
deactivates the parameter for a specified
interface.
Example: ic:gen(x, [this])
activates the parameter for
all interfaces.
Example: ic:gen(x, [{this, "M1::I1"}])
activates the
parameter for all functions of M1::I1
.
Example: ic:gen(x, [this, {{this, "M1::I2"}, false}])
activates the parameter for all interfaces except
M1::I2
.
handle_info
in the object implementation module on all unexpected
messages. Useful if the object implementation need to trap
exits.
Example: ic:gen(x, [handle_info])
will activates module
implementation handle_info
for all interfaces in the
source file.
Example: ic:gen(x, [{{handle_info, "M1::I1"}, true}
will activates module implementation handle_info
for
the specified interface.
Example: ic:gen(x, [handle_info, {{handle_info,
"M1::I1"}, false}
will generate the handle_info
call for all interfaces except M1::I1
.
Example: ic:gen(x, [{time_out,"M::I"}])
produces server
stub which will has an extra timeout parameter in the initialization
function for that interface.
All
of the parts generated by
ic have to agree in the use of this option. Default is
false
. Example: ic:gen(x, [{be,
c_genserv},{scoped_op_calls,true}])
produces client
stub which sends "scoped" requests to the a gen_server or a
c-server. 3.3
.
Due to better semantic checks on enumerants, the compiler discovers
name coalitions between user defined types and enumerant values
in the same name space. By enabling this option the compiler turns
off the extended semantic check on enumerant values.
Default is false
. Example: ic:gen(x, [{scl,true}])
{precond, {M, F}}
which activates the
call for operations in all interfaces in the source file, {{precond,
IntfName}, {M, F}}
which activates the call for all operations in a specific
interface and {{precond, OpName}, {M, F}}
which activates the call for a
specific operation.m:f(Module, Function, Args)
.
Example: ic:gen(x, [{precond, {mod, fun}}])
adds the call of m:f for all
operations in the idl file.
Example: ic:gen(x, [{{precond, "M1::I"}, {mod, fun}}])
adds the call of
m:f
for all operations in the interface M1::I1
.
Example: ic:gen(x, [{{precond, "M1::I::Op"}, {mod, fun}}])
adds the call of m:f
for the operation M1::I::Op
.
{postcond, {M, F}}
which activates the
call for operations in all interfaces in the source file, {{postcond,
IntfName}, {M, F}}
which activates the call for all operations in a specific
interface and {{postcond, OpName}, {M, F}}
which activates the call for a
specific operation.m:f(Module, Function, Args, Result)
.
Example: ic:gen(x, [{postcond, {mod, fun}}])
adds the call of m:f for all
operations in the idl file.
Example: ic:gen(x, [{{postcond, "M1::I"}, {mod, fun}}])
adds the call of
m:f
for all operations in the interface M1::I1
.
Example: ic:gen(x, [{{postcond, "M1::I::Op"}, {mod, fun}}])
adds the call of m:f
for the operation M1::I::Op
.
infinity
. Default number is 10.
infinity
. Default value is
infinity.
All back-end options are declared as a tuple {be,atom()}
,
followed eventually by back-end specific options:
Default back-end option is {be, erl_corba}.
The IDL compiler allows several preprocessors to be used, the
Erlang
IDL preprocessor
or other standard C
preprocessors.
Options can be used to provide extra flags such as include
directories to the preprocessor. The build in the Erlang IDL
preprocessor is used by default, but any standard C preprocessor
such as gcc
is adequate.
The preprocessor command is formed by appending the prepoc_cmd to the preproc_flags option and then appending the input IDL file name.
The compiler can be configured in two ways:
The configuration file is optional and overrides the compiler
defaults and is in turn overridden by the command line options.
The configuration file shall contain options in the form of
Erlang terms. The configuration file is read using
file:consult
.
An example of a configuration file, note the "." after each line.
{outdir, gen_dir}. {{impl, "M1::M2::object"}, "obj"}.
The compiler will produce output in several files depending on
scope declarations found in the IDL file. At most
three file types will be generated for each scope (including the top scope),
depending on the compiler back-end and the compiled interface.
Generally, the output per interface will be a header file (.hrl
/
.h
) and one or more Erlang/C files (.erl
/.c
).
Please look at the language mapping for each back-end for details.
There will be at least one set of files for an IDL file, for the file level scope. Modules and interfaces also have their own set of generated files.