alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (BuildLangtools.gmk)

This example Java source code file (BuildLangtools.gmk) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

echo, full_version, jdk_version, langtools_outputdir, langtools_topdir, license, oracle, printf, propsources, release, resource_suffixes, setup, the, this

The BuildLangtools.gmk Java example source code

#
# 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.
#

# This must be the first rule
default: all

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

# The BOOT_JAVAC setup uses the bootdir compiler to compile the tools
# and the bootstrap javac, to be run by the bootdir jvm.
$(eval $(call SetupJavaCompiler,BOOT_JAVAC, \
    JAVAC := $(JAVAC), \
    SERVER_DIR := $(SJAVAC_SERVER_DIR), \
    SERVER_JVM := $(SJAVAC_SERVER_JAVA), \
    FLAGS := -XDignore.symbol.file=true -g -Xlint:all$(COMMA)-deprecation -Werror))

# javax.tools.JavaCompilerTool isn't really a suffix but this gets the file copied.
RESOURCE_SUFFIXES := .gif .xml .css .js javax.tools.JavaCompilerTool

# Now setup the compilation of the properties compilation tool. You can depend
# upon $(BUILD_TOOLS) to trigger a compilation of the tools. Note that we
# add src/share/classes to the sourcepath. This is necessary since the GenStubs
# program needs to be linked and run towards the new javac sources.
$(eval $(call SetupJavaCompilation,BUILD_TOOLS, \
    SETUP := BOOT_JAVAC, \
    DISABLE_SJAVAC := true, \
    ADD_JAVAC_FLAGS := -Xprefer:source, \
    SRC := $(LANGTOOLS_TOPDIR)/make/tools $(LANGTOOLS_TOPDIR)/src/share/classes, \
    INCLUDES := compileproperties genstubs, \
    BIN := $(LANGTOOLS_OUTPUTDIR)/btclasses))

# The compileprops tools compiles a properties file into a resource bundle.
TOOL_COMPILEPROPS_CMD := $(JAVA) -cp $(LANGTOOLS_OUTPUTDIR)/btclasses compileproperties.CompileProperties -quiet

# Lookup the properties that need to be compiled into resource bundles.
PROPSOURCES := $(shell $(FIND) $(LANGTOOLS_TOPDIR)/src/share/classes -name "*.properties")

# Strip away prefix and suffix, leaving for example only: "com/sun/tools/javac/resources/javac_zh_CN"
PROPPATHS := $(patsubst $(LANGTOOLS_TOPDIR)/src/share/classes/%.properties, %, $(PROPSOURCES))

# Generate the list of java files to be created.
PROPJAVAS := $(patsubst %, $(LANGTOOLS_OUTPUTDIR)/gensrc/%.java, $(PROPPATHS))

# Generate the package dirs for the tobe generated java files.
PROPDIRS := $(dir $(PROPJAVAS))

# Now generate a sequence of "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle"
# suitable to be fed into the CompileProperties command.
PROPCMDLINE := $(subst _SPACE_, $(SPACE), $(join $(addprefix -compile_SPACE_, $(PROPSOURCES)), \
    $(addsuffix _SPACE_java.util.ListResourceBundle, $(addprefix _SPACE_$(LANGTOOLS_OUTPUTDIR)/gensrc/, $(addsuffix .java, $(PROPPATHS))))))

# Now setup the rule for the generation of the resource bundles.
$(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d: $(PROPSOURCES) $(BUILD_TOOLS)
	$(RM) -r $(@D)/*
	$(MKDIR) -p $(@D) $(PROPDIRS)
	$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties
	$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties
	$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties
	$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/jdeps/resources/version.properties
	$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javadoc/resources/version.properties
	$(ECHO) Compiling $(words $(PROPSOURCES) v1 v2 v3) properties into resource bundles
	$(TOOL_COMPILEPROPS_CMD) $(PROPCMDLINE) \
	    -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties \
	        $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.java \
	        java.util.ListResourceBundle \
	    -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties \
	        $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.java \
	        java.util.ListResourceBundle \
	    -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties \
	        $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.java \
	        java.util.ListResourceBundle \
	    -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/jdeps/resources/version.properties \
	        $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/jdeps/resources/version.java \
	        java.util.ListResourceBundle \
	    -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javadoc/resources/version.properties \
	        $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javadoc/resources/version.java \
	        java.util.ListResourceBundle
	$(ECHO) PROPS_ARE_CREATED = yes > $@

# Trigger the generation of the resource bundles. After the resource bundles have
# been compiled, then the makefile will restart and the newly created java files
# will become part of the build further along in the makefile.
-include $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d

ifeq ($(PROPS_ARE_CREATED), yes)
  # Setup the rules to build a dist/bootstrap/lib/javac.jar, ie a smaller intermediate javac
  # that can be compiled with an old javac. The intermediate javac is then used
  # to compile javac again and to build the complete new jdk.
  $(eval $(call SetupJavaCompilation,BUILD_BOOTSTRAP_LANGTOOLS, \
      SETUP := BOOT_JAVAC, \
      DISABLE_SJAVAC := true, \
      SRC := $(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc, \
      EXCLUDES := com/sun/tools/javac/nio, \
      COPY := $(RESOURCE_SUFFIXES), \
      BIN := $(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap))

  $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAC, $(BUILD_BOOTSTRAP_LANGTOOLS), \
      SRCS := $(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap, \
      JAR := $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar, \
      SUFFIXES := .class $(RESOURCE_SUFFIXES)))

  # GenStubs is used to bootstrap any dependencies from javac to the new JDK that is not
  # yet built. It is currently not needed but might be again in the future. The following
  # exercises the functionality to verify that it works.
  TOOL_GENSTUBS_CMD = $(JAVA) \
       "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \
       -classpath $(LANGTOOLS_OUTPUTDIR)/btclasses \
       genstubs.GenStubs

  # We fetch source from the JDK...
  JDKS = $(JDK_TOPDIR)/src/share/classes

  # Build the list of classes to generate stubs from. java/util/function/Predicate.java isn't
  # currently needed, but is used as a demo for now.

  STUBSOURCES := $(shell $(FIND) $(JDKS) -name "*.java" | $(GREP) \
      -e "$(JDKS)/java/util/function/Predicate.java")

  # Rewrite the file names into class names because the GenStubs tool require this.
  STUBCLASSES := $(subst /,., $(patsubst $(JDKS)/%.java, %, $(STUBSOURCES)))

  # Now setup the build recipe for genstubs.
  $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d: $(STUBSOURCES) $(BUILD_TOOLS) \
      $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \
      $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d
	$(MKDIR) -p $(@D)
	$(MKDIR) -p $(LANGTOOLS_OUTPUTDIR)/tmpstubs
	$(ECHO) $(LOG_INFO) Generating stubs from JDK sources.
	($(TOOL_GENSTUBS_CMD) -s $(LANGTOOLS_OUTPUTDIR)/tmpstubs -sourcepath $(JDKS) $(STUBCLASSES) && $(ECHO) STUBS_ARE_CREATED = yes > $@)
	if $(DIFF) -x "_the*" -rq $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(LANGTOOLS_OUTPUTDIR)/genstubs > /dev/null 2>&1; then \
	  $(ECHO) $(LOG_INFO) No changes in the stubs!; \
	  $(RM) -r $(LANGTOOLS_OUTPUTDIR)/tmpstubs; \
	else \
	  $(ECHO) $(LOG_INFO) Changes in stubs detected!; \
	  $(RM) -r $(@D); \
	  $(MV) $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(@D); \
	fi
	$(ECHO) STUBS_ARE_CREATED = yes > $@

  # Trigger a generation of the genstubs java source code and a restart
  # of the makefile to make sure that the following build setup use the
  # newly created java files.
  -include $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d

  ifeq ($(STUBS_ARE_CREATED), yes)
    # Setup a compiler configuration using the intermediate javac in dist/bootstrap/lib/javac.jar
    # that generates code for the new jdk that is being built.
    # The code compiled by this compiler setup, cannot necessarily be run with the bootstrap jvm.
    $(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE, \
        JVM := $(JAVA), \
        JAVAC := "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \
            -cp $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \
            com.sun.tools.javac.Main, \
        FLAGS := -XDignore.symbol.file=true -Xlint:all$(COMMA)-deprecation -Werror, \
        SERVER_DIR := $(SJAVAC_SERVER_DIR), \
        SERVER_JVM := $(SJAVAC_SERVER_JAVA)))

    $(eval $(call SetupJavaCompilation,BUILD_FULL_JAVAC, \
        SETUP := GENERATE_NEWBYTECODE, \
        SRC := $(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc \
            $(LANGTOOLS_OUTPUTDIR)/genstubs, \
        EXCLUDES := java/util java/io java/nio, \
        COPY := $(RESOURCE_SUFFIXES), \
        BIN := $(LANGTOOLS_OUTPUTDIR)/classes))

    $(eval $(call SetupArchive,ARCHIVE_FULL_JAVAC, $(BUILD_FULL_JAVAC), \
        SETUP := GENERATE_NEWBYTECODE, \
        SRCS := $(LANGTOOLS_OUTPUTDIR)/classes, \
        SUFFIXES := .class $(RESOURCE_SUFFIXES), \
        JAR := $(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar))

    $(eval $(call SetupZipArchive,ZIP_FULL_JAVAC_SOURCE, \
        SRC := $(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc, \
        ZIP := $(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip))

    all: $(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar \
        $(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip \
        $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar

  endif
endif

Other Java examples (source code examples)

Here is a short list of links related to this Java BuildLangtools.gmk source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.