duke@1: # duke@1: # Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. duke@1: # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: # duke@1: # This code is free software; you can redistribute it and/or modify it duke@1: # under the terms of the GNU General Public License version 2 only, as duke@1: # published by the Free Software Foundation. Sun designates this duke@1: # particular file as subject to the "Classpath" exception as provided duke@1: # by Sun in the LICENSE file that accompanied this code. duke@1: # duke@1: # This code is distributed in the hope that it will be useful, but WITHOUT duke@1: # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: # version 2 for more details (a copy is included in the LICENSE file that duke@1: # accompanied this code). duke@1: # duke@1: # You should have received a copy of the GNU General Public License version duke@1: # 2 along with this work; if not, write to the Free Software Foundation, duke@1: # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: # duke@1: # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: # CA 95054 USA or visit www.sun.com if you need additional information or duke@1: # have any questions. duke@1: # duke@1: duke@1: # duke@1: # duke@1: # Rules shared by all Java makefiles. duke@1: # duke@1: # Used to apply to source file $<, checks code conventions, issues warnings. duke@1: define check-conventions duke@1: if [ "$(CONVENTION_WATCH)" = "true" ] ; then \ duke@1: if [ "`$(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]'`" != "" ] ; then \ duke@1: $(ECHO) "WARNING: File contains tabs, ^M, or ^L characters: $<"; \ duke@1: if [ "$(CONVENTION_DETAILS)" = "true" ] ; then \ duke@1: $(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]' ; \ duke@1: fi; \ duke@1: fi; \ duke@1: fi duke@1: endef duke@1: duke@1: # Make sure the default rule is all duke@1: rules_default_rule: all duke@1: duke@1: # duke@1: # Directory set up. (Needed by deploy workspace) duke@1: # duke@1: $(CLASSDESTDIR) $(CLASSHDRDIR) $(OBJDIR) $(OUTPUTDIR) $(BINDIR) $(LIBDIR) $(LIBDIR)/$(LIBARCH) $(TEMPDIR) $(EXTDIR): duke@1: $(MKDIR) -p $@ duke@1: duke@1: # duke@1: # All source tree areas for java/properties files duke@1: # duke@1: ALL_CLASSES_SRC = $(SHARE_SRC)/classes $(PLATFORM_SRC)/classes duke@1: duke@1: # duke@1: # If AUTO_FILES_PROPERTIES_DIRS used, automatically find properties files duke@1: # duke@1: ifdef AUTO_FILES_PROPERTIES_DIRS duke@1: AUTO_FILES_PROPERTIES_FILTERS1 = $(SCM_DIRs) 'X-*' '*-X-*' ',*' duke@1: AUTO_FILES_PROPERTIES_FILTERS1 += $(AUTO_PROPERTIES_PRUNE) duke@1: FILES_properties_find_filters1 = $(AUTO_FILES_PROPERTIES_FILTERS1:%=-name % -prune -o) duke@1: FILES_properties_auto1 := \ duke@1: $(shell \ duke@1: for dir in $(ALL_CLASSES_SRC) ; do \ duke@1: if [ -d $$dir ] ; then \ duke@1: ( $(CD) $$dir; \ duke@1: for sdir in $(AUTO_FILES_PROPERTIES_DIRS); do \ duke@1: if [ -d $$sdir ] ; then \ duke@1: $(FIND) $$sdir $(FILES_properties_find_filters1) \ duke@1: -name '*.properties' -print ; \ duke@1: fi ; \ duke@1: done \ duke@1: ); \ duke@1: fi; \ duke@1: done \ duke@1: ) duke@1: else duke@1: FILES_properties_auto1 = duke@1: endif # AUTO_FILES_PROPERTIES_DIRS duke@1: duke@1: # Add any automatically found properties files to the properties file list duke@1: FILES_properties += $(FILES_properties_auto1) duke@1: duke@1: # duke@1: # Get Resources help duke@1: # duke@1: include $(TOPDIR)/make/common/internal/Resources.gmk duke@1: duke@1: # duke@1: # Compiling .java files. duke@1: # duke@1: duke@1: # duke@1: # Automatically add to FILES_java if AUTO_FILES_JAVA_DIRS is defined duke@1: # duke@1: # There are two basic types of sources, normal source files and the duke@1: # generated ones. The Normal sources will be located in: duke@1: # $(ALL_CLASSES_SRC) duke@1: # The generated sources, which might show up late to dinner, are at: duke@1: # $(GENSRCDIR) duke@1: # and since they could be generated late, we need to be careful that duke@1: # we look for these sources late and not use the ':=' assignment which duke@1: # might miss their generation. duke@1: duke@1: ifdef AUTO_FILES_JAVA_DIRS duke@1: # Filter out these files or directories duke@1: AUTO_FILES_JAVA_SOURCE_FILTERS1 = $(SCM_DIRs) 'X-*' '*-X-*' '*-template.java' ',*' duke@1: AUTO_FILES_JAVA_SOURCE_FILTERS2 = duke@1: AUTO_FILES_JAVA_SOURCE_FILTERS1 += $(AUTO_JAVA_PRUNE) duke@1: AUTO_FILES_JAVA_SOURCE_FILTERS2 += $(AUTO_JAVA_PRUNE) duke@1: duke@1: # First list is the normal sources that should always be there, duke@1: # by using the ':=', which means we do this processing once. duke@1: FILES_java_find_filters1 = $(AUTO_FILES_JAVA_SOURCE_FILTERS1:%=-name % -prune -o) duke@1: FILES_java_auto1 := \ duke@1: $(shell \ duke@1: for dir in $(ALL_CLASSES_SRC) ; do \ duke@1: if [ -d $$dir ] ; then \ duke@1: ( $(CD) $$dir; \ duke@1: for sdir in $(AUTO_FILES_JAVA_DIRS); do \ duke@1: if [ -d $$sdir ] ; then \ duke@1: $(FIND) $$sdir $(FILES_java_find_filters1) \ duke@1: -name '*.java' -print ; \ duke@1: fi ; \ duke@1: done \ duke@1: ); \ duke@1: fi; \ duke@1: done \ duke@1: ) duke@1: # Second list is the generated sources that should be rare, but will likely duke@1: # show up late and we need to look for them at the last minute, so we duke@1: # cannot use the ':=' assigment here. But if this gets expanded multiple duke@1: # times, the if tests should make them relatively cheap. duke@1: FILES_java_find_filters2 = $(AUTO_FILES_JAVA_SOURCE_FILTERS2:%=-name % -prune -o) duke@1: FILES_java_auto2 = \ duke@1: $(shell \ duke@1: for dir in $(GENSRCDIR); do \ duke@1: if [ -d $$dir ] ; then \ duke@1: ( $(CD) $$dir; \ duke@1: for sdir in $(AUTO_FILES_JAVA_DIRS); do \ duke@1: if [ -d $$sdir ] ; then \ duke@1: $(FIND) $$sdir $(FILES_java_find_filters2) \ duke@1: -name '*.java' -print ; \ duke@1: fi ; \ duke@1: done \ duke@1: ); \ duke@1: fi; \ duke@1: done \ duke@1: ) duke@1: else duke@1: FILES_java_auto1 = duke@1: FILES_java_auto2 = duke@1: endif duke@1: duke@1: # Add all found java sources to FILES_java macro (if AUTO_FILES_JAVA_DIRS used) duke@1: FILES_java += $(FILES_java_auto1) $(FILES_java_auto2) duke@1: duke@1: # File that will hold java source names that need compiling duke@1: JAVA_SOURCE_LIST=$(TEMPDIR)/.classes.list duke@1: duke@1: # Add a java source to the list duke@1: define add-java-file duke@1: $(ECHO) "$?" >> $(JAVA_SOURCE_LIST) duke@1: $(check-conventions) duke@1: endef duke@1: duke@1: $(CLASSDESTDIR)/%.class: $(GENSRCDIR)/%.java duke@1: @$(add-java-file) duke@1: $(CLASSDESTDIR)/%.class: $(PLATFORM_SRC)/classes/%.java duke@1: @$(add-java-file) duke@1: $(CLASSDESTDIR)/%.class: $(SHARE_SRC)/classes/%.java duke@1: @$(add-java-file) duke@1: duke@1: # List of class files needed duke@1: FILES_class = $(FILES_java:%.java=$(CLASSDESTDIR)/%.class) duke@1: duke@1: # Got to include exported files. duke@1: FILES_class += $(FILES_export:%.java=$(CLASSDESTDIR)/%.class) duke@1: duke@1: # Construct list of java sources we need to compile duke@1: source_list_prime: duke@1: @$(MKDIR) -p $(TEMPDIR) duke@1: # Note that we slip resources in so that compiled properties files get created: duke@1: $(JAVA_SOURCE_LIST) : source_list_prime resources $(FILES_class) duke@1: @$(TOUCH) $@ duke@1: duke@1: .delete.classlist: duke@1: @$(RM) $(JAVA_SOURCE_LIST) duke@1: duke@1: # Make sure all newer sources are compiled (in a batch) duke@1: classes : $(CLASSES_INIT) .delete.classlist .compile.classlist duke@1: ohair@56: # Use this javac option to force it to favor the sourcepath file classes ohair@56: # rather than any bootclasspath classes. ohair@56: JAVAC_PREFER_SOURCE = -Xprefer:source ohair@56: duke@1: .compile.classlist : $(JAVA_SOURCE_LIST) duke@1: @$(MKDIR) -p $(CLASSDESTDIR) duke@1: @if [ `$(CAT) $(JAVA_SOURCE_LIST) | $(WC) -l` -ge 1 ] ; then \ duke@1: $(ECHO) "# Java sources to be compiled: (listed in file $(JAVA_SOURCE_LIST))"; \ duke@1: $(CAT) $(JAVA_SOURCE_LIST); \ duke@1: $(ECHO) "# Running javac:"; \ ohair@56: $(ECHO) $(JAVAC_CMD) $(JAVAC_PREFER_SOURCE) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$(JAVA_SOURCE_LIST); \ ohair@56: $(JAVAC_CMD) $(JAVAC_PREFER_SOURCE) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$(JAVA_SOURCE_LIST); \ duke@1: fi duke@1: @$(java-vm-cleanup) duke@1: duke@1: clobber clean:: duke@1: $(RM) $(JAVA_SOURCE_LIST) duke@1: duke@1: ifndef DONT_CLOBBER_CLASSES duke@1: ifndef PACKAGE duke@1: DONT_CLOBBER_CLASSES = true duke@1: else duke@1: DONT_CLOBBER_CLASSES = false duke@1: endif duke@1: endif duke@1: duke@1: packages.clean: duke@1: ifeq ($(DONT_CLOBBER_CLASSES),false) duke@1: ifdef AUTO_FILES_JAVA_DIRS duke@1: @for sdir in $(AUTO_FILES_JAVA_DIRS); do \ duke@1: $(ECHO) "$(RM) -r $(CLASSDESTDIR)/$$sdir"; \ duke@1: $(RM) -r $(CLASSDESTDIR)/$$sdir; \ duke@1: done duke@1: else duke@1: $(RM) -r $(CLASSDESTDIR)/$(PKGDIR) duke@1: endif duke@1: endif duke@1: duke@1: classes.clean: packages.clean duke@1: $(RM) $(JAVA_SOURCE_LIST) duke@1: duke@1: # duke@1: # C and C++ make dependencies duke@1: # duke@1: include $(TOPDIR)/make/common/internal/NativeCompileRules.gmk duke@1: duke@1: # duke@1: # Running Javah to generate stuff into CClassHeaders. duke@1: # duke@1: duke@1: ifdef FILES_export duke@1: duke@1: CLASSES.export = $(subst /,.,$(FILES_export:%.java=%)) duke@1: CLASSES.export += $(subst /,.,$(FILES_export2:%.java=%)) duke@1: CLASSES.export += $(subst /,.,$(FILES_export3:%.java=%)) duke@1: CLASSES_export = $(FILES_export:%.java=$(CLASSDESTDIR)/%.class) duke@1: CLASSES_export += $(FILES_export2:%.java=$(CLASSDESTDIR)/%.class) duke@1: CLASSES_export += $(FILES_export3:%.java=$(CLASSDESTDIR)/%.class) duke@1: duke@1: # Fix when deploy workspace makefiles don't depend on this name duke@1: #CLASSHDR_DOTFILE=$(CLASSHDRDIR)/.classheaders duke@1: duke@1: CLASSHDR_DOTFILE=$(OBJDIR)/.class.headers.$(ARCH) duke@1: duke@1: classheaders: classes $(CLASSHDR_DOTFILE) duke@1: duke@1: $(CLASSHDR_DOTFILE): $(CLASSES_export) duke@1: $(prep-target) duke@1: @$(ECHO) "# Running javah:" duke@1: $(JAVAH_CMD) -d $(CLASSHDRDIR)/ \ duke@1: $(CLASSES.export) $(subst $$,\$$,$(EXPORTED_inner)) duke@1: @$(java-vm-cleanup) duke@1: @$(TOUCH) $@ duke@1: duke@1: classheaders.clean: duke@1: $(RM) $(CLASSHDR_DOTFILE) duke@1: $(RM) -r $(CLASSHDRDIR) duke@1: duke@1: else # FILES_export duke@1: duke@1: classheaders: classes duke@1: duke@1: classheaders.clean: duke@1: duke@1: endif # FILES_export duke@1: duke@1: clean clobber:: classheaders.clean classes.clean .delete.classlist duke@1: duke@1: # duke@1: # Default dependencies duke@1: # duke@1: duke@1: all: build duke@1: duke@1: build: classheaders duke@1: duke@1: default: all duke@1: duke@1: .PHONY: all build clean clobber \ duke@1: .delete.classlist classes .compile.classlist classes.clean \ duke@1: classheaders classheaders.clean \ duke@1: batch_compile duke@1: