#
# Copyright (c) 2011, 2013, 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.
#

default: all

include $(SPEC)
include MakeBase.gmk
include RMICompilation.gmk
include JavaCompilation.gmk
include Setup.gmk

##########################################################################################

RMIC_PKGS := \
    sun/rmi/rmic \
    sun/tools/asm \
    sun/tools/java \
    sun/tools/javac \
    sun/tools/tree \
    sun/tools/util \
    #

$(eval $(call SetupJavaCompilation,BUILD_BOOTSTRAP_RMIC, \
    SETUP := GENERATE_OLDBYTECODE, \
    SRC := $(JDK_TOPDIR)/src/share/classes, \
    INCLUDES := $(RMIC_PKGS), \
    BIN := $(JDK_OUTPUTDIR)/btclasses_rmic, \
    COPY := .properties, \
    JAVAC_SOURCE_PATH_OVERRIDE := $(addprefix $(JDK_TOPDIR)/src/share/classes/, $(RMIC_PKGS))))

##########################################################################################

BTRMIC_CP := $(CORBA_OUTPUTDIR)/btjars/btcorba.jar$(PATH_SEP)$(JDK_OUTPUTDIR)/btclasses_rmic$(PATH_SEP)$(BOOTSTRAP_JAVAC_JAR)
BTRMIC_ARGS := "-Xbootclasspath/p:$(BTRMIC_CP)" -cp "$(BTRMIC_CP)"
RMIC := $(JAVA) $(BTRMIC_ARGS) sun.rmi.rmic.Main

CLASSES_DIR := $(JDK_OUTPUTDIR)/classes
# NOTE: If the smart javac dependency management is reintroduced, these classes risk
# interfering with the dependency checking. In that case they will need to be kept separate.
STUB_CLASSES_DIR := $(JDK_OUTPUTDIR)/classes
RMIC_GENSRC_DIR := $(JDK_OUTPUTDIR)/gendocsrc_rmic

GENCLASSES := 

##########################################################################################
#
# Generate RMI stubs
#

$(eval $(call SetupRMICompilation,RMI_12, \
    CLASSES := sun.rmi.server.Activation$$$$ActivationSystemImpl \
        java.rmi.activation.ActivationGroup \
        com.sun.jndi.rmi.registry.ReferenceWrapper, \
    CLASSES_DIR := $(CLASSES_DIR), \
    STUB_CLASSES_DIR := $(STUB_CLASSES_DIR), \
    RUN_V12 := true))
GENCLASSES += $(RMI_12)

# For RMI/IIOP call rmic a second time with -standardPackage option
# so that *_tie classes are generated in package without the prefix
# org.omg.stub (6375696)
JMAN_RMI_CLASSES := javax.management.remote.rmi.RMIConnectionImpl \
    javax.management.remote.rmi.RMIServerImpl
$(eval $(call SetupRMICompilation,RMI_IIOP, \
    CLASSES := $(JMAN_RMI_CLASSES), \
    CLASSES_DIR := $(CLASSES_DIR), \
    STUB_CLASSES_DIR := $(STUB_CLASSES_DIR), \
    RUN_V12 := true, \
    RUN_IIOP := true, \
    RUN_IIOP_STDPKG := true))
GENCLASSES += $(RMI_IIOP)

# Keep generated RMI/JRMP Stub source files and copy them to RMIC_GENSRC_DIR
# so that javadoc can include them in the API (4997471)
$(eval $(call SetupRMICompilation,RMI_SRC, \
    CLASSES := $(JMAN_RMI_CLASSES), \
    CLASSES_DIR := $(CLASSES_DIR), \
    STUB_CLASSES_DIR := $(RMIC_GENSRC_DIR), \
    RUN_V12 := true, \
    KEEP_GENERATED := true))
GENCLASSES += $(filter %.java, $(RMI_SRC))

##########################################################################################

$(RMI_12) $(RMI_IIOP) $(RMI_SRC): $(BUILD_BOOTSTRAP_RMIC)

$(RMIC_GENSRC_DIR)/_the.classes.removed: $(GENCLASSES)
	$(FIND) $(RMIC_GENSRC_DIR) -name "*.class" $(FIND_DELETE)
	$(TOUCH) $@

all: $(RMIC_GENSRC_DIR)/_the.classes.removed $(GENCLASSES)

.PHONY: all
