#!/usr/bin/perl use strict; use warnings; use CORBA::IDL 2.60; use CORBA::C 2.60; use CORBA::Python; # visitors use CORBA::IDL::RepositoryIdVisitor; use CORBA::C::SkeletonVisitor; use CORBA::C::IncSkelVisitor; use CORBA::Python::PyExtendedVisitor; use CORBA::Python::CPyExtendedVisitor; use CORBA::Python::HPyExtendedVisitor; my $parser = CORBA::IDL::ParserFactory::create('3.0'); $parser->getopts('hi:J:Ovx'); if ($parser->YYData->{opt_v}) { print "CORBA::Python $CORBA::Python::VERSION\n"; print "CORBA::C $CORBA::C::VERSION\n"; print "CORBA::IDL $CORBA::IDL::VERSION\n"; print "IDL $CORBA::IDL::Parser::IDL_VERSION\n"; print "$0\n"; print "Perl $] on $^O\n"; exit; } if ($parser->YYData->{opt_h}) { use Pod::Usage; pod2usage(-verbose => 1); } my $cflags = '-D__idl2pyext'; if ($CORBA::IDL::Parser::IDL_VERSION lt '3.0') { $cflags .= ' -D_PRE_3_0_COMPILER_'; } my $preprocessor; if ($^O eq 'MSWin32') { $preprocessor = 'cpp -C ' . $cflags; # $preprocessor = 'CL /E /C /nologo ' . $cflags; # Microsoft VC } else { $preprocessor = 'cpp -C ' . $cflags; } $parser->Configure( 'preprocessor' => $preprocessor, 'verbose_error' => 1, # 0, 1 'verbose_warning' => 1, # 0, 1 'verbose_info' => 1, # 0, 1 'verbose_deprecated' => 0, # 0, 1 (concerns only version '2.4' and upper) 'collision_allowed' => 1, ); $parser->Run(@ARGV); $parser->DisplayStatus(); my $root = $parser->getRoot(); if (defined $root) { $root->visit(new CORBA::IDL::RepositoryIdVisitor($parser)); if ($parser->YYData->{opt_x}) { $parser->Export(); } $root->visit(new CORBA::C::NameVisitor($parser)); $root->visit(new CORBA::C::LiteralVisitor($parser)); $root->visit(new CORBA::C::LengthVisitor($parser)); $root->visit(new CORBA::C::TypeVisitor($parser)); $root->visit(new CORBA::C::IncSkelVisitor($parser, q{}, q{})); $root->visit(new CORBA::C::SkeletonVisitor($parser, q{})); $root->visit(new CORBA::Python::NameVisitor($parser)); $root->visit(new CORBA::Python::ImportVisitor($parser, 1)); $root->visit(new CORBA::Python::LiteralVisitor($parser)); $root->visit(new CORBA::Python::PyExtendedVisitor($parser)); $root->visit(new CORBA::Python::CPyExtendedVisitor($parser)); $root->visit(new CORBA::Python::HPyExtendedVisitor($parser)); } __END__ =head1 NAME idl2pyext - IDL compiler to Python extension with C =head1 SYNOPSIS idl2pyext [options] I.idl =head1 OPTIONS All options are forwarded to C preprocessor, except -h -i -J -v -x. With the GNU C Compatible Compiler Processor, useful options are : =over 8 =item B<-D> I =item B<-D> I=I =item B<-I> I =item B<-I-> =item B<-nostdinc> =back Specific options : =over 8 =item B<-h> Display help. =item B<-i> I Specify a path for import (only for version 3.0). =item B<-J> I Specify a path for Python package. =item B<-O> Enable old Python object model. =item B<-v> Display version. =item B<-x> Enable export (only for version 3.0). =back =head1 DESCRIPTION B parses the given input file (IDL) and generates : =over 4 =item * a set of Python sources : an optional _I.py and I/__init__.py for each package (in a standard tree) =item * a C c_Imodule.c for each package =item * a include file hpy_I.h =item * a include file I.h (following the language C mapping rules) =item * a C skeleton I.c (with automatic merge) =item * setup.py =back B is a Perl OO application what uses the visitor design pattern. The parser is generated by Parse::Yapp. B needs a B executable. CORBA Specifications, including IDL (Interface Language Definition) C Language Mapping and Python Language Mapping are available on Ehttp://www.omg.org/E. =head1 INSTALLATION After standard Perl installation, you must install the Python package PyIDL : setup.py install And copy the file F in Python24/include. =head1 TUTORIAL =head2 EXAMPLE 1 Use F as current directory. The file F describes the interface of a simple calculator. Nota : the IDL interface Calc is in the global scope. First, copy additional files in current directory cp ../corba/corba.h cp ../corba/corba.c cp ../corba/cpyhelper.c Second, run : idl2pyext Calc.idl Third, in F complete each methode between tag START_EDIT and STOP_EDIT : // IDL : long Add(in long val1, in long val2); CORBA_long Calc_Add( Calc _o, CORBA_long val1, // in (fixed length) CORBA_long val2, // in (fixed length) CORBA_Environment * _ev ) { /* START_EDIT (Calc_Add) */ return val1 + val2; /* STOP_EDIT (Calc_Add) */ } Fourth, build : python setup.py build install Finally, run Unit Test using the extension module : python tu_Calc.py =head2 EXAMPLE 2 Use F as current directory. The file F describes the interface of a complex calculator. Nota : the IDL interface CalcCplx is in the IDL module Cplx. Same steps as in previous example. =head1 SEE ALSO cpp, idl2html, idl2py, idl2pyemb =head1 COPYRIGHT (c) 2005-2007 Francois PERRAD, France. All rights reserved. This program and all CORBA::Perl modules are distributed under the terms of the Artistic Licence. =head1 AUTHOR Francois PERRAD, francois.perrad@gadz.org =cut