#
# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

#
# Makefile to build the BeanInfo generation tool (ie, a doclet), and
# then the beaninfo itself.  Swing versions prior to 1.2 are no longer
# built.
#
# This makefile could be a lot simpler if we made it more regular.
#

# identify this as a swingbeans product - used only to identify a
# unique name for OBJDIR
PRODUCT = swing-beans

#
# Main targets provided by this makefile.
# 
swing-1.2-beans:
	$(MAKE) DEBUG_FLAG=false make-swing-beans
swing-1.2-beans-debug:
	$(MAKE) DEBUG_FLAG=true make-swing-beans


# get the absolute path to the jar command.
PREFIX          = 1.2
JAVADOCFLAGS    += $(NO_PROPRIETARY_API_WARNINGS) $(LANGUAGE_VERSION)
SWINGPKG        = javax/swing
LOCAL_JAVAC_FLAGS = $(OTHER_JAVACFLAGS)
# since JAVADOC_CMD runs on ALT_BOOTDIR, the doclet and all its classes must be compiled to match
DOCLET_JAVAC_FLAGS = -source 6 -target 6

include FILES.gmk
include $(BUILDDIR)/common/Release.gmk

DOCLETSRC    = $(BUILDDIR)/tools/swing-beans
DOCLETDST    = $(TEMPDIR)

FILES_java   = GenSwingBeanInfo.java GenDocletBeanInfo.java DocBeanInfo.java
FILES_class  = $(FILES_java:%.java=$(DOCLETDST)/%.class)
FAKESRC	     = $(TOPDIR)/src/share/classes
BEANSRCDIR  =  $(TEMPDIR)/$(PREFIX)src
BEANCLASSDIR = $(TEMPDIR)/$(PREFIX)classes
FILES_beans =  $(BEANS:%=$(BEANSRCDIR)/%BeanInfo.java) \
	       $(BEANS_TEXT:%=$(BEANSRCDIR)/text/%BeanInfo.java)  \
	       $(BEANSRCDIR)/SwingBeanInfoBase.java \
	       $(BEANSRCDIR)/BeanInfoUtils.java
               
FILES_bclass = $(FILES_beans:$(BEANSRCDIR)/%.java=$(BEANCLASSDIR)/$(SWINGPKG)/%.class)
DOCLETFLAGS  = -doclet GenDocletBeanInfo
LOCAL_CLASSPATH = "$(CLASSBINDIR)$(CLASSPATH_SEPARATOR)$(BEANCLASSDIR)$(CLASSPATH_SEPARATOR)."

#
# Main target.
#
make-swing-beans: mkdoclet mkbeaninfo mkclasses mkpackaging

#
# Make the doclet.
#
mkdoclet: $(DOCLETDST) $(FILES_class) .SwingBeanInfo

$(OBJDIR) $(BEANCLASSDIR) $(BEANSRCDIR) $(DOCLETDST)::
	@$(ECHO) "Making directory..." $@
	@$(MKDIR) -p $@

$(DOCLETDST)/%.class: $(DOCLETSRC)/%.java
	$(JAVAC_CMD) $(LOCAL_JAVAC_FLAGS) $(DOCLET_JAVAC_FLAGS) -classpath "$(CLASSBINDIR)$(CLASSPATH_SEPARATOR)$(DOCLETSRC)" -d $(DOCLETDST) $?
	@$(java-vm-cleanup)

# To run, the doclet needs SwingBeanInfoBase class.  Also Notice the lie
# here, SwingBeanInfoBase.class goes elswhere.

.SwingBeanInfo: $(OBJDIR) $(BEANCLASSDIR) $(BEANSRCDIR) $(SWINGPKG)/BeanInfoUtils.class $(SWINGPKG)/SwingBeanInfoBase.class 

$(SWINGPKG)/BeanInfoUtils.class: $(BEANSRCDIR)/BeanInfoUtils.java
	$(JAVAC_CMD) $(LOCAL_JAVAC_FLAGS) $(DOCLET_JAVAC_FLAGS) -d $(BEANCLASSDIR) $<
	@$(java-vm-cleanup)

$(SWINGPKG)/SwingBeanInfoBase.class: $(BEANSRCDIR)/SwingBeanInfoBase.java $(BEANSRCDIR)/BeanInfoUtils.java
	$(JAVAC_CMD) $(LOCAL_JAVAC_FLAGS) $(DOCLET_JAVAC_FLAGS) -classpath $(BEANCLASSDIR) -d $(BEANCLASSDIR) $<
	@$(java-vm-cleanup)

#
# Stage 1: Generate *BeanInfo.java files.
#
mkbeaninfo: $(BEANSRCDIR) .delete.beanlist $(FILES_beans) .javadoc.beanlist

.delete.beanlist: 
	@$(RM) $(TEMPDIR)/.beans.list

.javadoc.beanlist:
	if [ -s $(TEMPDIR)/.beans.list ]; \
	then $(JAVADOC_CMD) $(DOCLETFLAGS) -x $(DEBUG_FLAG) -d $(BEANSRCDIR) -t $(DOCLETSRC)/SwingBeanInfo.template -docletpath $(DOCLETDST) \
	    $(shell if [ -s $(TEMPDIR)/.beans.list ]; then $(CAT) $(TEMPDIR)/.beans.list; fi); \
	fi
	@$(java-vm-cleanup)

$(BEANSRCDIR)/text/%BeanInfo.java: $(FAKESRC)/$(SWINGPKG)/text/%.java
	@$(ECHO) $< >> $(TEMPDIR)/.beans.list

$(BEANSRCDIR)/%BeanInfo.java: $(FAKESRC)/$(SWINGPKG)/%.java
	@$(ECHO) $< >> $(TEMPDIR)/.beans.list

$(BEANSRCDIR)/SwingBeanInfoBase.java: $(DOCLETSRC)/javax/swing/SwingBeanInfoBase.java
	$(CP) $< $@

$(BEANSRCDIR)/BeanInfoUtils.java: $(DOCLETSRC)/sun/swing/BeanInfoUtils.java
	$(CP) $< $@

#
# Compile the generated *BeanInfo.java files.
#
mkclasses: .delete.classlist $(BEANCLASSDIR)/$(SWINGPKG)/SwingBeanInfoBase.class \
	$(BEANCLASSDIR)/$(SWINGPKG)/text/JTextComponentBeanInfo.class \
	.create.classlist $(FILES_bclass) .compile.classlist

$(BEANCLASSDIR)/$(SWINGPKG)/SwingBeanInfoBase.class:: \
	$(BEANSRCDIR)/SwingBeanInfoBase.java

$(BEANCLASSDIR)/$(SWINGPKG)/text/JTextComponentBeanInfo.class:: \
	$(BEANSRCDIR)/JTextComponentBeanInfo.java

$(FILES_bclass):: $(FILES_beans)

# all the sources are in one directory, so make sure that the list does
# not have the /text direcotry in it. Kludgy, this is...
.create.classlist:
	@$(ECHO) $(subst /text/,/,$(FILES_beans)) >> $(TEMPDIR)/.classes.list

.delete.classlist:
	@$(ECHO) "Deleting classes.list..."
	@$(RM) $(TEMPDIR)/.classes.list

.compile.classlist:
	if [ -s $(TEMPDIR)/.classes.list ] ; then \
	    $(JAVAC_CMD) $(LOCAL_JAVAC_FLAGS) -classpath $(LOCAL_CLASSPATH) -d $(BEANCLASSDIR) \
	    $(shell if [ -s $(TEMPDIR)/.classes.list ] ; then $(CAT) $(TEMPDIR)/.classes.list; fi ) ; \
	fi
	@$(java-vm-cleanup)

#
# Packaging
#
mkpackaging: 
	$(RM) -r $(BEANCLASSDIR)/$(SWINGPKG)/beaninfo/images
	$(MKDIR) -p $(BEANCLASSDIR)/$(SWINGPKG)/beaninfo/images
	$(CP) $(DOCLETSRC)/beaninfo/images/*.gif $(BEANCLASSDIR)/$(SWINGPKG)/beaninfo/images
	$(BOOT_JAR_CMD) cf $(TEMPDIR)/tmp.jar \
	     -C $(BEANCLASSDIR) javax \
	     -C $(BEANCLASSDIR) sun \
	     $(BOOT_JAR_JFLAGS)
	$(MV) $(TEMPDIR)/tmp.jar $(JDK_IMAGE_DIR)/lib/dt.jar
	@$(java-vm-cleanup)

#
# Cleanliness.
#
swingbeans.clean swingbeans.clobber::
	$(RM) -r 1.2src 1.2classes
	$(RM) -r java javax
	$(RM) *.class
	$(RM) $(TEMPDIR)/.beans.list $(TEMPDIR)/.classes.list beaninfo.jar

#
# Utility.
#


#
# Debugging targets for looking at variables.
#
show-vars:
	@$(ECHO) FILES_beans = $(FILES_beans)
	@$(ECHO) FILES_bclass = $(FILES_bclass)

.PRECIOUS: $(FILES_beans) 

.PHONY: swing-1.2-beans swing-1.2-beans-debug \
	make-swing-beans mkdoclet .SwingBeanInfo mkbeaninfo .delete.beanlist \
	.javadoc.beanlist mkclasses .create.classlist .delete.classlist \
	.compile.classlist mkpackaging mkpackaging swingbeans.clean \
	swingbeans.clobber show-vars  
