First steps with the SOM compiler: Difference between revisions
No edit summary |
No edit summary |
||
Line 3: | Line 3: | ||
In [[Interface Definition Language|previous]] article we looked at SOM [[Interface Definition Language]]. Now we'll try to explain how SOM Compiler works. | In [[Interface Definition Language|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]] 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]] 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. | [[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): | 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 ... | sc [-C:D:E:I:S:VU:cd:hi:m:prsvw] f1 f2 ... | ||
Line 67: | Line 67: | ||
#pragma modifier <modifier stm>; : instead of modifier statement. | #pragma modifier <modifier stm>; : instead of modifier statement. | ||
Now let's explain | Now let's explain some command line switches deeper. | ||
First of the most interesting switch is -s. By default [[SOM Compiler]] uses SMEMIT environment variable to determine which [[emitter]] to use. Look at emit*.dll files for corresponding [[emitter]]. Using swich -s you can change default logic and select one-time [[emitter]] insted of global emitters. In easy situation you need only one emitter (say, C emitter). In complex situations you need use more emitters (say, C, H, DEF and IH emitters). You can create your own emitter to produces, for example, some sort of documentation and other stuff. | |||
Another interesting switch is -m. Using -m you can set and/or unset so named modifiers. Midifiers allow you to change default behavelour of emitter and compiler. As example, by default compiler adds new methods or midifies existent. You can tell compiler just add new text to end of file. Midifiers can control emitters. addstart and noaddstar controls C emitter to add or not add pointer sign (*) to references of objects. | |||
Switch -u adds or updates [[Interface Repository]] with new information about class interface. Interface repository filename controlled by SOMIR environment variable. This thing usefull to add info for [[Object REXX]] access and other things wich uses [[Interface Repository]]. | |||
Other switches is like for standard C/C++ preprocessor and not described here. |
Revision as of 12:42, 31 May 2005
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 some command line switches deeper.
First of the most interesting switch is -s. By default SOM Compiler uses SMEMIT environment variable to determine which emitter to use. Look at emit*.dll files for corresponding emitter. Using swich -s you can change default logic and select one-time emitter insted of global emitters. In easy situation you need only one emitter (say, C emitter). In complex situations you need use more emitters (say, C, H, DEF and IH emitters). You can create your own emitter to produces, for example, some sort of documentation and other stuff.
Another interesting switch is -m. Using -m you can set and/or unset so named modifiers. Midifiers allow you to change default behavelour of emitter and compiler. As example, by default compiler adds new methods or midifies existent. You can tell compiler just add new text to end of file. Midifiers can control emitters. addstart and noaddstar controls C emitter to add or not add pointer sign (*) to references of objects.
Switch -u adds or updates Interface Repository with new information about class interface. Interface repository filename controlled by SOMIR environment variable. This thing usefull to add info for Object REXX access and other things wich uses Interface Repository.
Other switches is like for standard C/C++ preprocessor and not described here.