Author: aconway
Date: Fri Aug 17 08:52:07 2007
New Revision: 567072

URL: http://svn.apache.org/viewvc?view=rev&rev=567072
Log:
        * Fixes for code generation.
         - Generate make fragments in $(srcdir) to fix VPATH builds.
         - rubygen: generates its own .mk fragment
         - rubygen: moved template info from Makefile.am to generated 
rubygen.mk, fixes circular dependency between Makefile and rubygen.mk
         - removed unused templates.

Removed:
    incubator/qpid/trunk/qpid/cpp/rubygen/templates/ClassBodyVariant.rb
    incubator/qpid/trunk/qpid/cpp/rubygen/templates/method_variants.rb
Modified:
    incubator/qpid/trunk/qpid/cpp/bootstrap
    incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb
    incubator/qpid/trunk/qpid/cpp/rubygen/generate
    incubator/qpid/trunk/qpid/cpp/src/Makefile.am
    incubator/qpid/trunk/qpid/cpp/src/generate.sh

Modified: incubator/qpid/trunk/qpid/cpp/bootstrap
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/bootstrap?view=diff&rev=567072&r1=567071&r2=567072
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/bootstrap (original)
+++ incubator/qpid/trunk/qpid/cpp/bootstrap Fri Aug 17 08:52:07 2007
@@ -14,8 +14,15 @@
   perl -ne '/^(include |if |else|endif)/ or print' Makefile.am \
       | make -f - abs_srcdir=`dirname $(pwd)` gen.mk > /dev/null )
 
-# Create empty Makefile include files, make will generate the real contents.
-touch src/rubygen.mk src/generate.mk
+# Create initial Makefile fragments that will force make to generate
+# the real ones.
+cat > src/rubygen.mk <<EOF
+\$(srcdir)/rubygen.mk: force
+       \$(rgen_cmd)
+EOF
+
+touch src/generate.mk 
+
 automake
 autoconf
 

Modified: incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb?view=diff&rev=567072&r1=567071&r2=567072
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb (original)
+++ incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb Fri Aug 17 08:52:07 2007
@@ -174,6 +174,13 @@
   
 end
 
+# Collect information about generated files.
+class GenFiles
+  @@files =[]
+  def GenFiles.add(f) @@files << f; puts f; end
+  def GenFiles.get() @@files; end
+end
+
 # Base class for code generators.
 # Supports setting a per-line prefix, useful for e.g. indenting code.
 # 
@@ -191,7 +198,7 @@
 
   # Create a new file, set @out. 
   def file(file)
-    puts file                   
+    GenFiles.add file
     if (@outdir != "-")         
       path=Pathname.new "[EMAIL PROTECTED]/#{file}"
       path.parent.mkpath

Modified: incubator/qpid/trunk/qpid/cpp/rubygen/generate
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/rubygen/generate?view=diff&rev=567072&r1=567071&r2=567072
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/rubygen/generate (original)
+++ incubator/qpid/trunk/qpid/cpp/rubygen/generate Fri Aug 17 08:52:07 2007
@@ -4,10 +4,11 @@
 #
 # Run a set of code generation templates.
 #
-
 if ARGV.size < 3
   puts <<EOS
 Usage: #{ARGV[0]} OUTDIR  SPEC.xml [ ... ] TEMPLATE.rb [ ... ]
+or:    #{ARGV[0]} OUTDIR  SPEC.xml [ ... ] all [ makefragment.mk ]
+
 Parse all SPEC.xml files to create an AMQP model, run each TEMPLATE
 putting the resulting files under OUTDIR. Prints a list of files
 generated to standard output.
@@ -16,8 +17,43 @@
 EOS
   exit 1
 end
+
 Outdir=ARGV[0]
-specs=ARGV.grep(/\.xml$/)
-templates=ARGV.grep(/\.rb$/)
-Amqp=AmqpRoot.new(*specs)
+Specs=ARGV.grep(/\.xml$/)
+Amqp=AmqpRoot.new(*Specs)
+
+# Run selected templates
+if ARGV.grep("^all$")
+  templates=Dir["#{File.dirname __FILE__}/templates/*.rb"]
+else
+  templates=ARGV.grep(/\.rb$/)
+end
 templates.each { |t| require t }
+
+# Generate makefile
+makefile=ARGV.grep(/.mk$/)[0]
+if makefile
+  dir=Dir.getwd
+  Dir.chdir File.dirname(__FILE__)
+  generator_files=Dir["**/*.rb"] << File.basename(__FILE__)
+  Dir.chdir dir
+  rgen_generator=generator_files.map{ |f| "$(rgen_dir)/#{f}" }
+
+  File.open(makefile, 'w') { |out|
+    out << <<EOS
+# Generated makefile fragment.
+# Including makefile defines $(rgen_dir) $(rgen_cmd) and $(specs).
+
+rgen_generator=#{rgen_generator.join(" \\\n    ")}
+
+rgen_srcs=#{GenFiles.get.join(" \\\n   ")}
+
+$(rgen_srcs) $(srcdir)/#{File.basename makefile}: $(rgen_generator) $(specs)
+       $(rgen_cmd)
+
+# Empty rule in case a generator file is renamed/removed.
+$(rgen_generator): 
+EOS
+  }
+end
+

Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?view=diff&rev=567072&r1=567071&r2=567072
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Fri Aug 17 08:52:07 2007
@@ -1,24 +1,20 @@
 SUBDIRS = . tests
 
+EXTRA_DIST= $(platform_dist) 
+
 ## Generated code
 
 # Note: generated soure and makefiles included in distribution so a
 # distribution can be built without code generation tools and XML
 # sources.
 
-EXTRA_DIST= $(platform_dist) 
-
-EXTRA_DIST += generate.mk generate.sh $(generated_cpp) $(generated_h) \
-  rubygen.mk $(rgen_srcs) 
+# This phony target is needed by generated makefile fragments:
+force:
 
 # AMQP_XML is defined in ../configure.ac
 [EMAIL PROTECTED]@ $(top_srcdir)/xml/cluster.xml
 
-# Makefiles are either generated or copied from $srcdir.
-include generate.mk
-include rubygen.mk
-
-DISTCLEANFILES=generate.mk rubygen.mk
+EXTRA_DIST += generate.mk generate.sh $(generated_cpp) $(generated_h)  
$(rgen_srcs) 
 
 if GENERATE
 
@@ -28,7 +24,7 @@
 
 gentools_dir=$(top_srcdir)/gentools
 
-generate.mk $(generated_cpp) $(generated_h): generate.timestamp
+$(srcdir)/generate.mk $(generated_cpp) $(generated_h): generate.timestamp
 generate.timestamp: generate.sh $(specs) $(generator)
        env gentools_dir=$(gentools_dir) specs="$(specs)" $(srcdir)/generate.sh
        touch $@
@@ -40,36 +36,15 @@
        rm -rf gen
 
 # Ruby generator.
-
 rgen_dir=$(top_srcdir)/rubygen
-rgen_tdir=$(rgen_dir)/templates
-rgen_cmd=ruby -I $(rgen_dir) $(rgen_dir)/generate
+rgen_cmd=ruby -I $(rgen_dir) $(rgen_dir)/generate . $(specs) all 
$(srcdir)/rubygen.mk
 
-rgen_templates=$(rgen_tdir)/MethodHolder.rb    \
-       $(rgen_tdir)/MethodBodyConstVisitor.rb  \
-       $(rgen_tdir)/frame_body_lists.rb        \
-       $(rgen_tdir)/Session.rb                 \
-       $(rgen_tdir)/all_method_bodies.rb       \
-       $(rgen_tdir)/Proxy.rb
-
-rgen_generator=$(rgen_dir)/generate            \
-       $(rgen_dir)/amqpgen.rb                  \
-       $(rgen_dir)/cppgen.rb
-
-rubygen.mk $(rgen_srcs): rubygen.timestamp
-rubygen.timestamp: $(rgen_generator) $(specs) $(rgen_templates)
-       srcs=`$(rgen_cmd) . $(specs) $(rgen_templates) ` && { \
-       echo -n "rgen_srcs= "; \
-       for f in $$srcs; do echo "\\"; echo -n "        $$f "; done; \
-       echo; } > rubygen.mk
-       touch $@
-else                           # !GENERATE
-# If not generating, copy generated makefiles from source dir to build dir.
-generate.mk:
-       cp $(srcdir)/$@ $@
-rubygen.mk:
-       cp $(srcdir)/$@ $@
 endif                          # GENERATE
+
+include $(srcdir)/generate.mk
+include $(srcdir)/rubygen.mk
+
+DISTCLEANFILES=generate.mk rubygen.mk
 
 # Code generated by C++
 noinst_PROGRAMS=generate_MethodHolderMaxSize_h

Modified: incubator/qpid/trunk/qpid/cpp/src/generate.sh
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/generate.sh?view=diff&rev=567072&r1=567071&r2=567072
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/generate.sh (original)
+++ incubator/qpid/trunk/qpid/cpp/src/generate.sh Fri Aug 17 08:52:07 2007
@@ -7,6 +7,7 @@
 test -z "$JAVA" && JAVA=java ; 
 test -z "$JAVAC" && JAVAC=javac ;
 
+srcdir=`dirname $0`
 checkspecs() {
     for s in $specs; do test -f $s || return 1; done
     return 0
@@ -41,7 +42,7 @@
            `find ../gentools \( -name '*.java' -o -name '*.tmpl' \) -print`
     fi
 ) > generate.mk-t
-mv generate.mk-t generate.mk
+mv generate.mk-t $srcdir/generate.mk
 
 
 


Reply via email to