This topic contains sections marked as revised for this release
Before you start
You must have a user-defined extension that is written in C. This C program can be one of the provided sample nodes described in Sample node files, the sample parser described in Sample parser files, or a node or parser that you have created yourself using the instructions in Creating a message processing or output node in C, Creating an input node in C, or Creating a parser in C.
This section provides information on how to compile user-defined extensions for all supported platforms.
The file names used in these instructions are those of the supplied samples. If you are compiling your own user-defined extensions, substitute your own file names.
You do not have to modify user-defined extension libraries that are provided by software vendors, but you do have to import or create the associated workbench resources.
When you compile a user-defined extension that is written in C, you need a compatible compiler. For details of supported compilers, see Optional software support.
Compile the source for your user-defined extension on each of the supported platforms to create the executable file that the broker invokes to implement your user-defined extension. On Linux, UNIX, and z/OS systems, this file is a loadable implementation library file (LIL); on Windows systems, it is a dynamic load library (DLL).
Navigate to the directory where your user-defined extension source code is located, and follow the instructions for your operating system:
xlc_r \ -I. \ -I /opt/IBM/mqsi/6.0/include/plugin \ -c SwitchNode.c \ -o SwitchNode.o xlc_r \ -I. \ -I /opt/IBM/mqsi/6.0/include/plugin \ -c BipSampPluginUtil.c \ -o BipSampPluginUtil.o xlc_r \ -I. \ -I /opt/IBM/mqsi/6.0/include/plugin \ -c Common.c \ -o Common.o xlc_r \ -I. \ -I /opt/IBM/mqsi/6.0/include/plugin \ -c NodeFactory.c \ -o NodeFactory.o xlc_r -qmkshrobj \ -bM:SRE \ -bexpall \ -bnoentry \ -o SwitchNode.lil SwitchNode.o BipSampPluginUtil.o Common.o NodeFactory.o \ -L /opt/IBM/mqsi/6.0/lib -l imbdfplg chmod a+r SwitchNode.lil
cc +z \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c BipSampPluginUtil.c \ -o output_dir/BipSampPluginUtil.o cc +z \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c Common.c \ -o output_dir/Common.o cc +z \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c NodeFactory.c \ -o output_dir/NodeFactory.o cc +z \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c SwitchNode.c \ -o output_dir/SwitchNode.o cc +z \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c TransformNode.c \ -o output_dir/TransformNode.o ld -b \ -o output_dir/SwitchNode.lil \ output_dir/BipSampPluginUtil.o \ output_dir/Common.o \ output_dir/NodeFactory.o \ output_dir/SwitchNode.o \ output_dir/TransformNode.o \ -L install_dir/lib \ -L install_dir/xml4c/lib \ -L install_dir/merant/lib \ -L install_dir/jre/lib/PA_RISC2.0 \ -L install_dir/jre/lib/PA_RISC2.0/server \ -l imbdfplg chmod a+r output_dir/SwitchNode.lil
Compile and link the user-defined
extension using a supported C compiler. Enter each command as a single line
of input; in the examples shown below the lines have been split to improve
readability.
/usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU -D_GNU_SOURCE TransformNode.c /usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU -D_GNU_SOURCE SwitchNode.c /usr/bin/gcc -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU -D_GNU_SOURCE BipSampPluginUtil.c /usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU -D_GNU_SOURCE Common.c /usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU -D_GNU_SOURCE NodeFactory.c /usr/bin/g++ -o samples.lil TransformNode.o SwitchNode.o BipSampPluginUtil.o Common.o NodeFactory.o -shared -lc -lnsl -ldl -L/opt/mqsi/lib -limbdfplg
These commands create the file samples.lil that provide TransformNode and SwitchNode objects.
Building the C user-defined extension with g++ requires some changes; you must define the interface function as a C-style function to the C++ compiler. In the following example, the ifdefs keep your code portable, and hide the extern "C" directives from a C compiler.
#ifdef __cplusplus extern "C" { #endif void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory() { ... ... } #ifdef __cplusplus } #endif
cc -mt \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c SwitchNode.c \ -o output_dir/SwitchNode.o cc -mt \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c BipSampPluginUtil.c \ -o output_dir/BipSampPluginUtil.o cc -mt \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c NodeFactory.c \ -o output_dir/NodeFactory.o cc -mt \ -I. \ -I<install_dir>/include \ -I<install_dir>/include/plugin \ -c Common.c \ -o output_dir/Common.o cc -G \ -o output_dir/SwitchNode.lil \ output_dir/SwitchNode.o \ output_dir/BipSampPluginUtil.o \ output_dir/NodeFactory.o \ output_dir/Common.o \ -L <install_dir>/lib / -l imbdfplg chmod a+r output_dir/SwitchNode.lil
Compile and link the user-defined
extension using a supported compiler. Ensure that you include a space between SwitchNode.c and BipSampPluginUtil.c, and also between -link and /DLL.
Enter the command as a single line of input; in the example shown below the lines have been split to improve readability.
cl /VERBOSE /LD /MD /Zi /I. /I..\..\..\include\plugin SwitchNode.c BipSampPluginUtil.c Common.c NodeFactory.c TransformNode.c -link /DLL ..\..\..\lib\imbdfplg.lib /OUT:SwitchNode.lil
If you have correctly set the LIB environment variable, you do not have to specify the full paths to the .lib files.
export _CC_STEPS=-1Alternatively, add these two lines to your makefile to export it:
_CC_STEPS=-1 .EXPORT : _CC_STEPS
Compile and link the user-defined extension using a supported C compiler. To create optimized builds, use -2 in place of -g in the following commands:
cc -c \ -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,float\(ieee\) \ -Wc,xplink \ -W0,LIST\(./SwitchNode.lst\) \ -I. -I${install_dir}/include \ -I${install_dir}/include/plugin \ -I${install_dir}/sample/include \ -I${install_dir}/sample/plugin \ -o ./SwitchNode.o ./SwitchNode.c
cc -c \ -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,float\(ieee\) \ -Wc,xplink \ -W0,LIST\(./SwitchNode.lst\) \ -I. -I${install_dir}/include \ -I${install_dir}/include/plugin \ -I${install_dir}/sample/include \ -I${install_dir}/sample/plugin \ -o ./BipSampPluginUtil.o ./BipSampPluginUtil.c
cc -c \ -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,float\(ieee\) \ -Wc,xplink \ -W0,LIST\(./SwitchNode.lst\) \ -I. -I${install_dir}/include \ -I${install_dir}/include/plugin \ -I${install_dir}/sample/include \ -I${install_dir}/sample/plugin \ -o ./Common.o ./Common.c
cc -c \ -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL, float\(ieee\) \ -Wc,xplink \ -W0,LIST\(./SwitchNode.lst\) \ -I. -I${install_dir}/include \ -I${install_dir}/include/plugin \ -I${install_dir}/sample/include \ -I${install_dir}/sample/plugin \ -o ./NodeFactory.o ./NodeFactory.c
cc \ -Wl,DLL -g -Wl,p,map -Wl,LIST=ALL,MAP,XREF,REUS=RENT \ -Wl,xplink \ -o ./SwitchNode.lil ./SwitchNode.o ./BipSampPluginUtil.o \ ./Common.o ./NodeFactory.o \ ${install_dir}/lib/libimbdfplg.x
Issue the following command to set the file permissions of the user-defined extension to group read and to be executable:
chmod a+rx {output_dir}/SwitchNode.lil