This topic contains sections marked as revised for this release

WebSphere Message Brokers
File: as10000_
Writer: Lorraine Waitt

Task topic

This build: July 31, 2007 21:38:30

Compiling a C user-defined extension

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.

Header files

The following header files define the C interfaces:
BipCni.h
Message processing nodes
BipCpi.h
Message parsers
BipCci.h
Interfaces common to both nodes and parsers
BipCos.h
Platform-specific definitions

Compilation

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:

Compiling on AIX

AIX platform Compile and link the user-defined extension using a supported C compiler:
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

Compiling on HP-UX

HP-UX platform Compile and link the user-defined extension using a supported C compiler:
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

Compiling on Linux

Linux platform 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                                                        

Compiling on Solaris

Solaris platform Compile and link the user-defined extension using a supported C compiler:
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

Compiling on Windows

Windows platform 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.

Compiling on z/OS

z/OS platform Force your link to use prelinker or linker by setting the _CC_STEPS variable to -1:
export _CC_STEPS=-1
Alternatively, 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
Related reference
User-defined extensions
Notices | Trademarks | Downloads | Library | Support | Feedback

Copyright IBM Corporation 1999, 2007Copyright IBM Corporation 1999, 2007. All Rights Reserved.
This build: July 31, 2007 21:38:30

as10000_ This topic's URL is: