You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by Jim Meyering <ji...@meyering.net> on 2006/12/01 21:32:08 UTC

better bootstrap and gen/* dependencies

This changes gives qpid improved dependency tracking: Now, if someone
modifies one of the gentools/... .java or .tmpl files, the source files
in gen/ will be regenerated.  But only if java and javac are available
and this is not a stand-alone qpid-cpp directory.

Also with this change, you should be able to "svn remove" the
generated file, gen/gen-src.mk, since the modified bootstrap
script generates it up front.

2006-12-01  Jim Meyering  <me...@redhat.com>

	* configure.ac: Use an automake conditional to indicate when we
	have access to files outside of the current hierarchy, and when
	we have the tools (java and javac) to build some generated files.
	* gen/Makefile.am: Don't use $(abs_srcdir); not needed.
	(timestamp): Depend on java sources and C++ template files,
	if we're building in a qpid tree.
	Use $(JAVA) and $(JAVAC), rather than hard-coding those names.
	(gen-src.mk) [$(java_sources), $(cxx_templates)]: New rules to
	generate these lists of file names.

	* bootstrap: Also generate gen/gen-src.mk.
	But do that only if we're in a qpid hierarchy.
	Redirect make's stdout to /dev/null.

Index: configure.ac
===================================================================
--- configure.ac	(revision 481343)
+++ configure.ac	(working copy)
@@ -33,6 +33,19 @@
  esac],
  [enableval=yes])

+# Turn on this automake conditional if we are in a qpid
+# hierarchy (i.e. with gentools/ and specs/ sibling directories),
+# and if we have working java + javac.
+build=yes
+AC_CHECK_PROGS([JAVA],  [java],  [no])
+AC_CHECK_PROGS([JAVAC], [javac], [no])
+build=yes
+test x$JAVA  = xno && build=no
+test x$JAVAC = xno && build=no
+test -d $srcdir/../gentools || build=no
+test -d $srcdir/../specs    || build=no
+AM_CONDITIONAL([BUILD_IN_MESSAGE_TREE], [test x$build = xyes])
+
 # Warnings: Enable as many as possible, keep the code clean. Please
 # do not disable warnings or remove -Werror without discussing on
 # qpid-dev list.
Index: gen/Makefile.am
===================================================================
--- gen/Makefile.am	(revision 481343)
+++ gen/Makefile.am	(working copy)
@@ -1,6 +1,3 @@
-# TODO aconway 2006-11-30: nasty hack, should be done by automake?
-abs_srcdir = @abs_srcdir@
-
 include gen-src.mk

 BUILT_SOURCES = $(generated_sources)
@@ -10,21 +7,20 @@
 EXTRA_DIST = $(BUILT_SOURCES)
 MAINTAINERCLEANFILES = $(BUILT_SOURCES)

-gentools_dir = $(abs_srcdir)/../../gentools
-spec_dir = $(abs_srcdir)/../../specs
+gentools_dir = $(srcdir)/../../gentools
+spec_dir = $(srcdir)/../../specs
 spec = $(spec_dir)/amqp-8.0.xml
+gentools_srcdir = $(gentools_dir)/src/org/apache/qpid/gentools

-# FIXME: add dependencies?
-timestamp: $(spec)
-	if test -d $(gentools_dir); then			\
-	  rm -f $(generated_sources);				\
-	  (cd $(gentools_dir)/src/org/apache/qpid/gentools &&	\
-	   rm -f *.class && javac *.java);			\
-	  java -cp $(gentools_dir)/src org.apache.qpid.gentools.Main \
-	    -c -o . -t $(gentools_dir)/templ.cpp $(spec);	\
-	else							\
-	  echo "warning: failed to regenerate gen/*.{cpp,h}" 1>&2;	\
-	fi
+timestamp: $(spec) $(java_sources) $(cxx_templates)
+if BUILD_IN_MESSAGE_TREE
+	rm -f $(generated_sources)
+	(cd $(gentools_srcdir) && rm -f *.class && $(JAVAC) *.java);	\
+	$(JAVA) -cp $(gentools_dir)/src org.apache.qpid.gentools.Main	\
+	  -c -o . -t $(gentools_dir)/templ.cpp $(spec)
+else
+	echo "warning: failed to regenerate gen/*.{cpp,h}" 1>&2
+endif
 	touch timestamp

 EXTRA_DIST += timestamp
@@ -35,4 +31,14 @@
 	( echo 'generated_sources = \'					\
 	  && ls *.cpp *.h | sort -u | sed 's/.*/  & \\/;$$s/ \\//'	\
 	) > $@-t
+if BUILD_IN_MESSAGE_TREE
+	( echo 'java_sources = \'					\
+	    && find $(gentools_srcdir) -name '*.java'			\
+		| sort -u | sed 's/.*/  & \\/;$$s/ \\//'		\
+	) >> $@-t
+	( echo 'cxx_templates = \'					\
+	    && find $(gentools_dir)/templ.cpp -name '*.tmpl'		\
+		| sort -u | sed 's/.*/  & \\/;$$s/ \\//'		\
+	) >> $@-t
+endif
 	mv $@-t $@
Index: bootstrap
===================================================================
--- bootstrap	(revision 481343)
+++ bootstrap	(working copy)
@@ -4,10 +4,19 @@
 autoheader
 libtoolize --automake

+# If we're building in the qpid tree, we can generate
+# some Makefile snippets:
+
+if test -d ../gentools && test -d ../specs; then
+  (cd gen && rm -f gen-src.mk
+    perl -ne '/^(abs_srcdir|if|else|endif|include)\b/ or print' Makefile.am \
+	| make -f - abs_srcdir=`pwd` srcdir=. gen-src.mk > /dev/null )
+fi
+
 # Generate (for automake) lots of repetitive parts of tests/Makefile.am.
 (cd tests && rm -f gen.mk
   perl -ne '/^include / or print' Makefile.am \
-      | make -f - abs_srcdir=`dirname $(pwd)` gen.mk )
+      | make -f - abs_srcdir=`dirname $(pwd)` gen.mk > /dev/null )

 automake
 autoconf

Re: better bootstrap and gen/* dependencies

Posted by Jim Meyering <ji...@meyering.net>.
Alan Conway <ac...@redhat.com> wrote:
> Jim I had problems with this - where are $JAVA and $JAVAC supposed to be
> set? I've got to go, I'll apply the patch tomorrow unless Gordon beats
> me to it.

Alan,

Those variables are set via configure.  The AC_CHECK_PROGS autoconf macro
AC_SUBST's them.  I've verified that the patch applies to a tree with no
modifications and that a subsequent "make" reruns autoconf, configure et
al (checking for java and javac) and rebuilds all of the required pieces.

What symptoms do you have?

> On Fri, 2006-12-01 at 21:32 +0100, Jim Meyering wrote:
>> This changes gives qpid improved dependency tracking: Now, if someone
>> modifies one of the gentools/... .java or .tmpl files, the source files
>> in gen/ will be regenerated.  But only if java and javac are available
>> and this is not a stand-alone qpid-cpp directory.
>>
>> Also with this change, you should be able to "svn remove" the
>> generated file, gen/gen-src.mk, since the modified bootstrap
>> script generates it up front.
>>
>> 2006-12-01  Jim Meyering  <me...@redhat.com>
>>
>> 	* configure.ac: Use an automake conditional to indicate when we
>> 	have access to files outside of the current hierarchy, and when
>> 	we have the tools (java and javac) to build some generated files.
>> 	* gen/Makefile.am: Don't use $(abs_srcdir); not needed.
>> 	(timestamp): Depend on java sources and C++ template files,
>> 	if we're building in a qpid tree.
>> 	Use $(JAVA) and $(JAVAC), rather than hard-coding those names.
>> 	(gen-src.mk) [$(java_sources), $(cxx_templates)]: New rules to
>> 	generate these lists of file names.
>>
>> 	* bootstrap: Also generate gen/gen-src.mk.
>> 	But do that only if we're in a qpid hierarchy.
>> 	Redirect make's stdout to /dev/null.

Re: better bootstrap and gen/* dependencies

Posted by Alan Conway <ac...@redhat.com>.
Jim I had problems with this - where are $JAVA and $JAVAC supposed to be
set? I've got to go, I'll apply the patch tomorrow unless Gordon beats
me to it.

On Fri, 2006-12-01 at 21:32 +0100, Jim Meyering wrote:
> This changes gives qpid improved dependency tracking: Now, if someone
> modifies one of the gentools/... .java or .tmpl files, the source files
> in gen/ will be regenerated.  But only if java and javac are available
> and this is not a stand-alone qpid-cpp directory.
> 
> Also with this change, you should be able to "svn remove" the
> generated file, gen/gen-src.mk, since the modified bootstrap
> script generates it up front.
> 
> 2006-12-01  Jim Meyering  <me...@redhat.com>
> 
> 	* configure.ac: Use an automake conditional to indicate when we
> 	have access to files outside of the current hierarchy, and when
> 	we have the tools (java and javac) to build some generated files.
> 	* gen/Makefile.am: Don't use $(abs_srcdir); not needed.
> 	(timestamp): Depend on java sources and C++ template files,
> 	if we're building in a qpid tree.
> 	Use $(JAVA) and $(JAVAC), rather than hard-coding those names.
> 	(gen-src.mk) [$(java_sources), $(cxx_templates)]: New rules to
> 	generate these lists of file names.
> 
> 	* bootstrap: Also generate gen/gen-src.mk.
> 	But do that only if we're in a qpid hierarchy.
> 	Redirect make's stdout to /dev/null.
> 
> Index: configure.ac
> ===================================================================
> --- configure.ac	(revision 481343)
> +++ configure.ac	(working copy)
> @@ -33,6 +33,19 @@
>   esac],
>   [enableval=yes])
> 
> +# Turn on this automake conditional if we are in a qpid
> +# hierarchy (i.e. with gentools/ and specs/ sibling directories),
> +# and if we have working java + javac.
> +build=yes
> +AC_CHECK_PROGS([JAVA],  [java],  [no])
> +AC_CHECK_PROGS([JAVAC], [javac], [no])
> +build=yes
> +test x$JAVA  = xno && build=no
> +test x$JAVAC = xno && build=no
> +test -d $srcdir/../gentools || build=no
> +test -d $srcdir/../specs    || build=no
> +AM_CONDITIONAL([BUILD_IN_MESSAGE_TREE], [test x$build = xyes])
> +
>  # Warnings: Enable as many as possible, keep the code clean. Please
>  # do not disable warnings or remove -Werror without discussing on
>  # qpid-dev list.
> Index: gen/Makefile.am
> ===================================================================
> --- gen/Makefile.am	(revision 481343)
> +++ gen/Makefile.am	(working copy)
> @@ -1,6 +1,3 @@
> -# TODO aconway 2006-11-30: nasty hack, should be done by automake?
> -abs_srcdir = @abs_srcdir@
> -
>  include gen-src.mk
> 
>  BUILT_SOURCES = $(generated_sources)
> @@ -10,21 +7,20 @@
>  EXTRA_DIST = $(BUILT_SOURCES)
>  MAINTAINERCLEANFILES = $(BUILT_SOURCES)
> 
> -gentools_dir = $(abs_srcdir)/../../gentools
> -spec_dir = $(abs_srcdir)/../../specs
> +gentools_dir = $(srcdir)/../../gentools
> +spec_dir = $(srcdir)/../../specs
>  spec = $(spec_dir)/amqp-8.0.xml
> +gentools_srcdir = $(gentools_dir)/src/org/apache/qpid/gentools
> 
> -# FIXME: add dependencies?
> -timestamp: $(spec)
> -	if test -d $(gentools_dir); then			\
> -	  rm -f $(generated_sources);				\
> -	  (cd $(gentools_dir)/src/org/apache/qpid/gentools &&	\
> -	   rm -f *.class && javac *.java);			\
> -	  java -cp $(gentools_dir)/src org.apache.qpid.gentools.Main \
> -	    -c -o . -t $(gentools_dir)/templ.cpp $(spec);	\
> -	else							\
> -	  echo "warning: failed to regenerate gen/*.{cpp,h}" 1>&2;	\
> -	fi
> +timestamp: $(spec) $(java_sources) $(cxx_templates)
> +if BUILD_IN_MESSAGE_TREE
> +	rm -f $(generated_sources)
> +	(cd $(gentools_srcdir) && rm -f *.class && $(JAVAC) *.java);	\
> +	$(JAVA) -cp $(gentools_dir)/src org.apache.qpid.gentools.Main	\
> +	  -c -o . -t $(gentools_dir)/templ.cpp $(spec)
> +else
> +	echo "warning: failed to regenerate gen/*.{cpp,h}" 1>&2
> +endif
>  	touch timestamp
> 
>  EXTRA_DIST += timestamp
> @@ -35,4 +31,14 @@
>  	( echo 'generated_sources = \'					\
>  	  && ls *.cpp *.h | sort -u | sed 's/.*/  & \\/;$$s/ \\//'	\
>  	) > $@-t
> +if BUILD_IN_MESSAGE_TREE
> +	( echo 'java_sources = \'					\
> +	    && find $(gentools_srcdir) -name '*.java'			\
> +		| sort -u | sed 's/.*/  & \\/;$$s/ \\//'		\
> +	) >> $@-t
> +	( echo 'cxx_templates = \'					\
> +	    && find $(gentools_dir)/templ.cpp -name '*.tmpl'		\
> +		| sort -u | sed 's/.*/  & \\/;$$s/ \\//'		\
> +	) >> $@-t
> +endif
>  	mv $@-t $@
> Index: bootstrap
> ===================================================================
> --- bootstrap	(revision 481343)
> +++ bootstrap	(working copy)
> @@ -4,10 +4,19 @@
>  autoheader
>  libtoolize --automake
> 
> +# If we're building in the qpid tree, we can generate
> +# some Makefile snippets:
> +
> +if test -d ../gentools && test -d ../specs; then
> +  (cd gen && rm -f gen-src.mk
> +    perl -ne '/^(abs_srcdir|if|else|endif|include)\b/ or print' Makefile.am \
> +	| make -f - abs_srcdir=`pwd` srcdir=. gen-src.mk > /dev/null )
> +fi
> +
>  # Generate (for automake) lots of repetitive parts of tests/Makefile.am.
>  (cd tests && rm -f gen.mk
>    perl -ne '/^include / or print' Makefile.am \
> -      | make -f - abs_srcdir=`dirname $(pwd)` gen.mk )
> +      | make -f - abs_srcdir=`dirname $(pwd)` gen.mk > /dev/null )
> 
>  automake
>  autoconf