SOM Compiler
by Prokushev
In previous article we looked at SOM Interface Definition Language. Now we'll try to explain how SOM Compiler works.
SOM Compiler is a tool to produce various file formats from Interface Definition Language files. SOM Compiler reads IDL file and produces abstract graph tree. Using abstract tree SOM Compiler generates object graph tree using classes like SOMTEntryC. After object graph is ready, SOM Compiler uses classes like SOMTEmitC to produce output template. Output file generated with help of SOMTTemplateOutputC class.
SOM Compiler uses DLL-name based loading of classes libraries (other programs can user another approach, like WPS does. WPS uses Interface Repository to find corresponding class). Most of SOM Compiler classes libraries it is implementation of corresponding emitter. Emitters can be created with help of Emitter Framework.
SOM Compiler actually is client program which uses Emitter Framework classes. SOM Compiler is closed-source, but with open architecture. Only things which can't be easely extended are parser, abstract graph builder and object graph builder. Other things can be shadowed and replaced by our own.
Let's look at SOM Compiler command line syntax to understand how to produce corresponding skeleton code from SOM Compiler template (bellow is SOM Compiler help screen):
sc [-C:D:E:I:S:VU:cd:hi:m:prsvw] f1 f2 ... Where:
-C <n> - size of comment buffer (default: 200000) -D <DEFINE> - same as -D option for cpp. -E =<value> - set environment variable. -I <INCLUDE> - same as -I option for cpp. -S <n> - size of string buffer (default: 200000) -U <UNDEFINE> - same as -U option for cpp. -V - show version number of compiler. -c - ignore all comments. -d <dir> - output directory for each emitted file. -h - this message. -i <file> - use this file name as supplied. -m <name[=value]> - add global modifier. -p - shorthand for -D__PRIVATE__. -r - check releaseorder entries exist (default: FALSE). -s <string> - replace SMEMIT variable with <string> -u - update interface repository. -v - verbose debugging mode (default: FALSE). -w - don't display warnings (default: FALSE).
Modifiers:
addprefixes : adds `functionprefix' to method names in template file [no]addstar : [no]add `*' to C bindings for interface references. corba : check the source for CORBA compliance. csc : force running of OIDL compiler. emitappend : append the emitted files at the end of existing file. noheader : don't add a header to the emitted file. noint : don't warn about "int" causing portability problems. nolock : don't lock the IR during update. nopp : don't run the source through the pre-processor. notc : don't use typecodes for emit information. nouseshort : don't generate short names for types. pp=<path> : specify a local pre-processor to use. tcconsts : generate CORBA TypeCode constants.
Note: All command-line modifiers can be set in the environment by changing them to UPPERCASE and preappending "SM" to them. Environment Variables:
SMEMIT=[h;ih;c;xh;xih;xc;def;ir;pdl] : emitters to run (default : h;ih). SMINCLUDE=<dir1>[;<dir2>]+ : where to search for .idl and .efw files. SMKNOWNEXTS=ext[;ext]+ : add headers to user written emitters. SMTMP=<dir> : directory to hold intermediate files. SOMIR=<path>[;<path>]+ : list of IRs to search.
Pragmas:
#pragma somemittypes on : turn on emission of global types. #pragma somemittypes off : turn off emission of global types. #pragma modifier <modifier stm>; : instead of modifier statement.
Now let's explain each command line switch deeper.