Compiling a C user-defined extension

Compile user-defined extensions in C for all supported operating systems.

Before you start

Start of changeIf you create your own user-defined nodes, parsers, and user exits in C, compile them on the operating system on which the target broker is running. Samples are provided for both nodes and parsers, and are described in Sample node files and Sample parser files. Use the instructions here to compile the samples. If you want to create your own extensions, see the following topics:End of change

Start of changeEnd of change

These instructions use the file names of the supplied samples. If you are compiling your own user-defined extensions, substitute your own file names.

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

Compiling

Compile the source for your user-defined extension on each of the supported operating systems to create the executable file that the broker calls 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).

Start of changeThe libraries that you build to contain user-defined nodes or parsers must have the extension .lil on all operating systems so that the broker can load them. Libraries that contain user exits must have the extension .lel on all operating systems. The examples in this topic show libraries with the extension .lil.End of change

Start of changeRefer to the documentation for the compiler that you are using for full details of available compile and link options that might be required for your programs.End of change

Navigate to the directory where your user-defined extension source code is located, and follow the instructions for your operating system:

Compiling on AIX

When you compile a user-defined extension that is written in C, use a supported compiler.

Start of change
xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   -c SwitchNode.c \
   -o SwitchNode.o

xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   -c BipSampPluginUtil.c \
   -o BipSampPluginUtil.o

xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   -c Common.c \
   -o Common.o

xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   -c NodeFactory.c \
   -o NodeFactory.o

xlc_r -q32 \
      -qmkshrobj \
      -bM:SRE \
      -bexpall \
      -bnoentry \
      -o SwitchNode.lil SwitchNode.o \
         BipSampPluginUtil.o Common.o NodeFactory.o \
      -L /install_dir/lib \
      -l imbdfplg

chmod a+r SwitchNode.lil
End of change

Compiling on HP-UX on PA-RISC

When you compile a user-defined extension that is written in C, use a supported compiler.

Start of change
cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c BipSampPluginUtil.c \
   -o output_dir/BipSampPluginUtil.o \
   -Ae

cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c Common.c \
   -o output_dir/Common.o \
   -Ae

cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c NodeFactory.c \
   -o output_dir/NodeFactory.o \
   -Ae

cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c SwitchNode.c \
   -o output_dir/SwitchNode.o \
   -Ae

cc +z -DD32\
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c TransformNode.c \
   -o output_dir/TransformNode.o \
   -Ae

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
End of change

Compiling on HP-UX on Itanium

When you compile a user-defined extension that is written in C, use a supported compiler.

Start of change
aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c BipSampPluginUtil.c \
   -o output_dir/BipSampPluginUtil.o

aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c Common.c \
   -o output_dir/Common.o

aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c NodeFactory.c \
   -o output_dir/NodeFactory.o

aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c SwitchNode.c \
   -o output_dir/SwitchNode.o

aCC -O +DD64 -AA -mt +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/IA64N\
   -L install_dir/jre/lib/IA64N/server \
   -l imbdfplg

chmod a+r output_dir/SwitchNode.lil
End of change

Compiling on Linux

When you compile a user-defined extension that is written in C, use a supported compiler.

/usr/bin/g++ -c -fpic -MD -trigraphs  
   -I. 
   -I/install_dir/include 
   -I/install_dir/include/plugin  
   -DLINUX -D__USE_GNU -D_GNU_SOURCE 
   TransformNode.c

/usr/bin/g++ -c -fpic -MD -trigraphs  
   -I. 
   -I/opt/mqsi/include 
   -I/install_dir/include/plugin 
   -DLINUX -D__USE_GNU -D_GNU_SOURCE 
   SwitchNode.c 

/usr/bin/gcc -c -fpic -MD -trigraphs  
   -I. 
   -I/opt/mqsi/include 
   -I/install_dir/include/plugin 
   -DLINUX -D__USE_GNU -D_GNU_SOURCE 
   BipSampPluginUtil.c 

/usr/bin/g++ -c -fpic -MD -trigraphs  
   -I. 
   -I/opt/mqsi/include 
   -I/install_dir/include/plugin 
   -DLINUX -D__USE_GNU -D_GNU_SOURCE 
   Common.c 

/usr/bin/g++ -c -fpic -MD -trigraphs  
   -I. 
   -I/opt/mqsi/include 
   -I/install_dir/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/install_dir/lib -limbdfplg 

These commands create the file samples.lil that provides 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

When you compile a user-defined extension that is written in C, use a supported compiler.

Start of change
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
End of change

Compiling on Windows

When you compile a user-defined extension that is written in C, use 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 following example the lines have been split to improve readability.

Start of change
cl /VERBOSE /LD /MD /Zi /GX /I. 
   /Iinstall_dir\include\plugin 
   SwitchNode.c BipSampPluginUtil.c Common.c 
   NodeFactory.c TransformNode.c 
   -link /DLL install_dir\lib\imbdfplg.lib 
   /OUT:SwitchNode.lil
End of change

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

When you compile a user-defined extension that is written in C, use a supported compiler.

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

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
Notices | Trademarks | Downloads | Library | Support | Feedback

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Last updated : 2009-01-07 15:23:16

as10000_