From f0281e4654f49dd1b0e4607d6721553847e428a2 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Wed, 1 Aug 2007 16:50:33 +0000 Subject: * src/generate.sh: Moved requirements test to configure.ac * rubygen: Cleanup and improvements, template for cluster work. * configure.ac: - support for ruby code generator + cleanup. - moved "can generate" tests to configure.ac - removed redundant APR stuff. * bootstrap: Remove codegen from bootstrap, all in config/make. * src/Makefile.am (libqpidcommon_la_LIBADD): - Ruby code generator. - Improvements to existing generator rules. - Removed APR stuff. * configure.ac (CPPUNIT_CXXFLAGS): Removed APR stuff. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@561869 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/bootstrap | 4 -- qpid/cpp/configure.ac | 39 +++++------ qpid/cpp/rubygen/README | 13 ++-- qpid/cpp/rubygen/amqpgen.rb | 15 ++-- qpid/cpp/rubygen/cppgen.rb | 25 +++++++ qpid/cpp/rubygen/generate | 23 ++++++ qpid/cpp/rubygen/templates/frame_body_lists.rb | 31 ++++++++ qpid/cpp/src/Makefile.am | 97 ++++++++++++++++---------- qpid/cpp/src/generate.sh | 20 +++--- qpid/cpp/src/tests/Makefile.am | 3 +- qpid/cpp/src/tests/ais_check | 2 +- qpid/cpp/src/tests/cluster.mk | 1 + 12 files changed, 185 insertions(+), 88 deletions(-) create mode 100755 qpid/cpp/rubygen/generate create mode 100644 qpid/cpp/rubygen/templates/frame_body_lists.rb (limited to 'qpid/cpp') diff --git a/qpid/cpp/bootstrap b/qpid/cpp/bootstrap index 4a0d2cf86b..d56ae5bef4 100755 --- a/qpid/cpp/bootstrap +++ b/qpid/cpp/bootstrap @@ -14,13 +14,9 @@ export JAVA JAVAC perl -ne '/^(include |if |else|endif)/ or print' Makefile.am \ | make -f - abs_srcdir=`dirname $(pwd)` gen.mk > /dev/null ) -# Bootstrap generated code. -(cd src; ./generate.sh) - automake autoconf - if [ "$1" = "-build" -o "$1" = "--build" ] ; then shift ./configure "$@" diff --git a/qpid/cpp/configure.ac b/qpid/cpp/configure.ac index f94710232a..86a0347248 100644 --- a/qpid/cpp/configure.ac +++ b/qpid/cpp/configure.ac @@ -90,28 +90,7 @@ CPPUNIT_CXXFLAGS=$CPPUNIT_CFLAGS AC_SUBST(CPPUNIT_LIBS) AC_SUBST(CPPUNIT_CXXFLAGS) -AC_ARG_ENABLE([apr-platform], - [AS_HELP_STRING([--enable-apr-platform], - [use the Apache Portable Runtime library for platform (default no)])], - [case $enableval in - yes|no) enable_APR_PLATFORM=$enableval;; - *) AC_MSG_ERROR([Invalid value for --enable-apr-platform: $enableval]);; - esac], - [enable_APR_PLATFORM=no] -) -AM_CONDITIONAL([USE_APR_PLATFORM], [test x$enable_APR_PLATFORM = xyes]) - -APR_MINIMUM_VERSION=1.2.2 -AC_SUBST(APR_MINIMUM_VERSION) -AC_SUBST(APR_CXXFLAGS) -AC_SUBST(USE_APR_PLATFORM) - -if test "$enable_APR_PLATFORM" = yes; then - PKG_CHECK_MODULES([APR], [apr-1 >= $APR_MINIMUM_VERSION]) - APR_CXXFLAGS="$APR_CFLAGS -DUSE_APR_PLATFORM=1" - USE_APR_PLATFORM=1 -fi - +# Enable Valgrind AC_ARG_ENABLE([valgrind], [AS_HELP_STRING([--enable-valgrind], [run valgrind memory checker on tests, if available (default yes)])], @@ -132,6 +111,22 @@ test "$enable_VALGRIND" = no && VALGRIND= AC_CHECK_PROG([RPMLINT], [rpmlint], [rpmlint]) AM_CONDITIONAL([HAS_RPMLINT], [test -n "$RPMLINT"]) +# Code generation: generated code is included in the distribution +# so code generation is only required in an svn checkout. +# It requires several external tools and files, which we check for here. + +AC_CHECK_PROG([RUBY], [ruby], [ruby]) +AC_CHECK_PROG([JAVA], [java], [java]) +AC_CHECK_PROG([JAVAC], [javac], [javc]) +test -n "$RUBY" -a -n "$JAVA" -a -n "$JAVAC" && generate=yes + +specdir=`pwd`/$srcdir/../specs +AMQP_XML=$specdir/amqp-transitional.0-10.xml +AC_SUBST(AMQP_XML) +ls $AMQP_XML >/dev/null 2>&1 || generate=no + +AM_CONDITIONAL([GENERATE], [test x$generate = xyes]) + # URL and download URL for the package. URL=http://rhm.et.redhat.com/qpidc AC_SUBST(URL) diff --git a/qpid/cpp/rubygen/README b/qpid/cpp/rubygen/README index 43111d4c4f..a1fd6cfec8 100644 --- a/qpid/cpp/rubygen/README +++ b/qpid/cpp/rubygen/README @@ -1,16 +1,13 @@ RUBY CODE GENERATOR -amqpgen.rb: builds an AMQP model from XML files and provides generic code generation functions (e.g. capitalization of names etc) +Run ./generate for usage. +Examples in samples/ -cppgen.rb: C++ specific code generation functions. +For example: + ./generate . ../../specs/amqp.0-9.xml samples/Proxy.rb +will generate -A template is a ruby file that generates one or more source files. -For an example run - samples/runme test - -The first argument is a directory for generated files, remaining arguments -are xml files. diff --git a/qpid/cpp/rubygen/amqpgen.rb b/qpid/cpp/rubygen/amqpgen.rb index 3fc66525d8..1bd11848a6 100755 --- a/qpid/cpp/rubygen/amqpgen.rb +++ b/qpid/cpp/rubygen/amqpgen.rb @@ -135,12 +135,13 @@ class AmqpRoot < AmqpElement def classes() @cache_classes ||= elements.collect("class") { |c| AmqpClass.new(c,self) }.sort_by_name end - + + # Return all methods on all classes. + def methods() classes.collect { |c| c.methods }.flatten; end + # Return all methods on chassis for all classes. def methods_on(chassis) - classes.collect { |c| - c.methods_on(chassis) - }.flatten + classes.collect { |c| c.methods_on(chassis) }.flatten end # Merge contents of elements. @@ -190,6 +191,12 @@ class Generator @midline = /[^\n]\z/ === str end + # Append str + '\n' to generated code. + def genl(str="") + gen str + gen "\n" + end + # Generate code with added prefix. def prefix(add) save=@prefix diff --git a/qpid/cpp/rubygen/cppgen.rb b/qpid/cpp/rubygen/cppgen.rb index 3e3800c4cd..b5f4758411 100755 --- a/qpid/cpp/rubygen/cppgen.rb +++ b/qpid/cpp/rubygen/cppgen.rb @@ -105,6 +105,7 @@ class CppGen < Generator # Write a header file. def h_file(path) + path = (/\.h$/ === path ? path : path+".h") guard=path.upcase.tr('./-','_') file(path) { gen "#ifndef #{guard}\n" @@ -122,5 +123,29 @@ class CppGen < Generator yield end end + + def include(header) genl "#include \"#{header}\""; end + + def scope(open="{",close="}", &block) + genl open; indent(&block); genl close + end + + def namespace(name, &block) + names = name.split("::") + names.each { |n| genl "namespace #{n} {" } + yield + genl('}'*names.size+" // "+name) + end + + def struct_class(type, name, *bases, &block) + gen "#{type} #{name}" + gen ": #{bases.join(', ')}" unless bases.empty + genl "{" + yield + genl "};" + end + + def struct(name, *bases, &block) struc_class("struct", bases, &block); end + def class_(name, *bases, &block) struc_class("struct", bases, &block); end end diff --git a/qpid/cpp/rubygen/generate b/qpid/cpp/rubygen/generate new file mode 100755 index 0000000000..09b27211af --- /dev/null +++ b/qpid/cpp/rubygen/generate @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +require 'amqpgen' + +# +# Run a set of code generation templates. +# + +if ARGV.size < 3 + puts < $@ + echo rgen_srcs=`$(rgen_cmd) . $(specs) $(rgen_templates)` -EXTRA_DIST=generate.sh $(generated_cpp) $(generated_h) $(platform_dist) +$(rgen_srcs): rubygen.mk -AM_CXXFLAGS = $(WARNING_CFLAGS) $(APR_CXXFLAGS) +else # !GENERATE +# If not generating, copy generated makefiles from source dir to build dir. +gen/generate.mk: + cp $(srcdir)/$@ $@ +rubygen.mk: + cp $(srcdir)/$@ $@ +endif # GENERATE + +## Compiler flags + +AM_CXXFLAGS = $(WARNING_CFLAGS) AM_LDFLAGS = -version-info $(LIBTOOL_VERSION_INFO_ARG) INCLUDES = -Igen -I$(srcdir)/gen +## Automake macros to build libraries and executables. + qpidd_LDADD = \ libqpidbroker.la \ libqpidcommon.la @@ -33,21 +77,6 @@ qpidd_LDADD = \ sbin_PROGRAMS = qpidd qpidd_SOURCES = qpidd.cpp -apr_plat_src = \ - qpid/sys/apr/APRBase.cpp \ - qpid/sys/apr/APRPool.cpp \ - qpid/sys/apr/Socket.cpp \ - qpid/sys/apr/Time.cpp \ - qpid/sys/apr/Thread.cpp \ - qpid/sys/apr/Shlib.cpp - -apr_plat_hdr = \ - qpid/sys/apr/APRBase.h \ - qpid/sys/apr/APRPool.h \ - qpid/sys/apr/Condition.h \ - qpid/sys/apr/Mutex.h \ - qpid/sys/apr/Thread.h - posix_plat_src = \ qpid/sys/epoll/EpollPoller.cpp \ qpid/sys/posix/check.cpp \ @@ -64,15 +93,8 @@ posix_plat_hdr = \ qpid/sys/posix/Mutex.h \ qpid/sys/posix/Thread.h -if USE_APR_PLATFORM - platform_dist=$(posix_plat_src) $(posix_plat_hdr) - platform_src = $(apr_plat_src) - platform_hdr = $(apr_plat_hdr) -else - platform_dist=$(apr_plat_src) $(apr_plat_hdr) - platform_src = $(posix_plat_src) - platform_hdr = $(posix_plat_hdr) -endif +platform_src = $(posix_plat_src) +platform_hdr = $(posix_plat_hdr) lib_LTLIBRARIES = libqpidcommon.la libqpidbroker.la libqpidclient.la @@ -91,7 +113,6 @@ libqpidcommon_la_LIBADD = \ -lboost_program_options \ -luuid \ libLogger.la \ - $(APR_LIBS) \ $(LIB_DLOPEN) \ $(LIB_CLOCK_GETTIME) diff --git a/qpid/cpp/src/generate.sh b/qpid/cpp/src/generate.sh index 1d8f946ecd..2cc31ff922 100755 --- a/qpid/cpp/src/generate.sh +++ b/qpid/cpp/src/generate.sh @@ -1,19 +1,19 @@ # !/bin/sh # Generate code from AMQP specification. -# srcdir must +# specs and gentools_dir are set by Makefile # -srcdir=`dirname $0` set -e -gentools_dir="$srcdir/../gentools" -specs_dir="$srcdir/../../specs" -specs="$specs_dir/amqp-transitional.0-10.xml $srcdir/../xml/cluster.xml" - test -z "$JAVA" && JAVA=java ; -test -z "$JAVAC" && JAVAC=javac ; +test -z "$JAVAC" && JAVAC=javac ; + +checkspecs() { + for s in $specs; do test -f $s || return 1; done + return 0 +} # Can we generate code? -if { test -d $gentools_dir && test -d $specs_dir && \ +if { test -d $gentools_dir && checkspecs && which $JAVA && which $JAVAC; } > /dev/null; then echo "Generating code." @@ -40,8 +40,8 @@ make_assign() { make_assign "generator" "" $specs \ `find ../gentools \( -name '*.java' -o -name '*.tmpl' \) -print` fi -) > generate.mk-t -mv generate.mk-t generate.mk +) > gen/generate.mk-t +mv gen/generate.mk-t gen/generate.mk diff --git a/qpid/cpp/src/tests/Makefile.am b/qpid/cpp/src/tests/Makefile.am index 82918c1aec..bc173d61d6 100644 --- a/qpid/cpp/src/tests/Makefile.am +++ b/qpid/cpp/src/tests/Makefile.am @@ -14,6 +14,7 @@ check_PROGRAMS= check_LTLIBRARIES= TESTS= EXTRA_DIST= +CLEANFILES= # # Unit test programs. @@ -171,7 +172,7 @@ all-am: .valgrind.supp .valgrindrc # ltmain invocations, one may corrupt the temporaries of the other. .NOTPARALLEL: -CLEANFILES=valgrind.out *.log *.vglog .valgrindrc .valgrind.supp dummy_test $(unit_wrappers) +CLEANFILES+=valgrind.out *.log *.vglog .valgrindrc .valgrind.supp dummy_test $(unit_wrappers) MAINTAINERCLEANFILES=gen.mk interop_runner_SOURCES = \ diff --git a/qpid/cpp/src/tests/ais_check b/qpid/cpp/src/tests/ais_check index 69a0469a26..ce3bbe1b1c 100755 --- a/qpid/cpp/src/tests/ais_check +++ b/qpid/cpp/src/tests/ais_check @@ -34,6 +34,6 @@ fi FAILED=0 for test in `cat ais_tests`; do - $srcdir/$test || FAILED=`expr $FAILED + 1` + ./$test || FAILED=`expr $FAILED + 1` done exit $FAILED diff --git a/qpid/cpp/src/tests/cluster.mk b/qpid/cpp/src/tests/cluster.mk index 8b603efb14..092647c9eb 100644 --- a/qpid/cpp/src/tests/cluster.mk +++ b/qpid/cpp/src/tests/cluster.mk @@ -21,6 +21,7 @@ AIS_TESTS= ais_check: ais_tests ais_tests: echo $(AIS_TESTS) >$@ +CLEANFILES+=ais_tests AIS_TESTS+=Cpg check_PROGRAMS+=Cpg -- cgit v1.2.1