text: #
  # Copyright 1995-2007 Sun Microsystems, Inc.  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.  Sun designates this
  # particular file as subject to the "Classpath" exception as provided
  # by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  # CA 95054 USA or visit www.sun.com if you need additional information or
  # have any questions.
  #
  
  #
  # Generic makefile for building shared libraries.
  #
  
  include $(TOPDIR)/make/common/Classes.gmk
  
  #
  # It is important to define these *after* including Classes.gmk
  # in order to override the values defined inthat makefile.
  #
  
  ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX)
  ACTUAL_LIBRARY_DIR = $(LIB_LOCATION)
  ACTUAL_LIBRARY = $(ACTUAL_LIBRARY_DIR)/$(ACTUAL_LIBRARY_NAME)
  
  library:: $(ACTUAL_LIBRARY)
  
  FILES_o   = $(patsubst %.c,   %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c))))
  FILES_o  += $(patsubst %.s,   %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_s))))
  FILES_o  += $(patsubst %.cpp, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp))))
  
  ifeq ($(INCREMENTAL_BUILD),true)
  FILES_d   = $(patsubst %.c,   %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c))))
  FILES_d  += $(patsubst %.cpp, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp))))
  endif # INCREMENTAL_BUILD
  
  ifeq ($(PLATFORM),solaris)
  # List of all lint files, one for each .c file (only for C)
  FILES_ln   = $(patsubst %.c,   %.$(LINT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c))))
  endif
  
  #
  # C++ libraries must be linked with CC.
  #
  ifdef CPLUSPLUSLIBRARY
  LINKER=$(LINK.cc)
  else
  LINKER=$(LINK.c)
  endif
  
  # We either need to import (copy) libraries in, or build them
  $(ACTUAL_LIBRARY):: $(INIT) $(TEMPDIR) $(LIBDIR) $(BINDIR) $(EXTDIR) classheaders
  
  #
  # COMPILE_APPROACH: Different approaches to compile up the native object
  #   files as quickly as possible.
  #   The setting of parallel works best on Unix, batch on Windows.
  #
  
  COMPILE_FILES_o = $(OBJDIR)/.files_compiled
  $(COMPILE_FILES_o): $(FILES_d) $(FILES_o)
  	@$(ECHO) "$<" >> $@
  clean::
  	$(RM) $(COMPILE_FILES_o)
  
  #
  # COMPILE_APPROACH=parallel: Will trigger compilations (just compilations) to
  #   happen in parallel. Greatly decreases Unix build time, even on single CPU
  #   machines, more so on multiple CPU machines. Default is 2 compiles
  #   at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS.
  #   Note that each .d file will also be dependent on it's .o file, see
  #   Rules.gmk.
  #   Note this does not depend on Rules.gmk to work like batch (below)
  #   and this technique doesn't seem to help Windows build time nor does
  #   it work very well, it's possible the Windows Visual Studio compilers
  #   don't work well in a parallel situation, this needs investigation.
  #
  
  ifeq ($(COMPILE_APPROACH),parallel)
  
  .PHONY: library_parallel_compile
  
  library_parallel_compile:
  	@$(ECHO) "Begin parallel compiles: $(shell $(PWD))"
  	@$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(COMPILE_FILES_o)
  	@$(ECHO) "Done with parallel compiles: $(shell $(PWD))"
  
  $(ACTUAL_LIBRARY):: library_parallel_compile
  
  endif
  
  #
  # COMPILE_APPROACH=batch: Will trigger compilations (just compilations) to
  #   happen in batch mode. Greatly decreases Windows build time.
  #   See logic in Rules.gmk for how compiles happen, the $(MAKE) in
  #   library_batch_compile below triggers the actions in Rules.gmk.
  #   Note that each .d file will also be dependent on it's .o file, see
  #   Rules.gmk.
  #
  ifeq ($(COMPILE_APPROACH),batch)
  
  .PHONY: library_batch_compile
  
  library_batch_compile:
  	@$(ECHO) "Begin BATCH compiles: $(shell $(PWD))"
  	$(MAKE) $(COMPILE_FILES_o)
  	$(MAKE) batch_compile
  	@$(ECHO) "Done with BATCH compiles: $(shell $(PWD))"
  	$(MAKE) COMPILE_APPROACH=normal $(COMPILE_FILES_o)
  
  $(ACTUAL_LIBRARY):: library_batch_compile
  
  endif
  
  ifeq ($(PLATFORM), windows)
  
  #
  # Library building rules.
  #
  
  $(LIBRARY).lib:: $(OBJDIR)
  
  # build it into $(OBJDIR) so that the other generated files get put 
  # there, then copy just the DLL (and MAP file) to the requested directory.
  #
  $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf
  	@$(prep-target)
  	@$(MKDIR) -p $(OBJDIR)
  	$(LINK) -dll -out:$(OBJDIR)/$(@F) \
  	  -map:$(OBJDIR)/$(LIBRARY).map \
  	  $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \
  	  $(OTHER_LCF) $(JAVALIB) $(LDLIBS)
  	$(CP) $(OBJDIR)/$(@F) $@
  	$(CP) $(OBJDIR)/$(LIBRARY).map $(@D)
  	$(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D)
  
  $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m)
  	@$(prep-target)
  	@$(MKDIR) -p $(TEMPDIR)
  	@$(ECHO) $(FILES_o) > $@ 
  ifndef LOCAL_RESOURCE_FILE
  	@$(ECHO) $(OBJDIR)/$(LIBRARY).res >> $@
  endif
  	@$(ECHO) Created $@ 
  
  RC_FLAGS += /D "J2SE_FNAME=$(LIBRARY).dll" \
              /D "J2SE_INTERNAL_NAME=$(LIBRARY)" \
              /D "J2SE_FTYPE=0x2L"
  
  $(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE)
  ifndef LOCAL_RESOURCE_FILE
  	@$(prep-target)
  	$(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE)
  endif
  
  #
  # Install a .lib file if required.
  #
  ifeq ($(INSTALL_DOT_LIB), true)
  $(ACTUAL_LIBRARY):: $(LIBDIR)/$(LIBRARY).lib
  
  clean:: 
  	-$(RM) $(LIBDIR)/$(LIBRARY).lib
  
  $(LIBDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lib
  	$(install-file)
  
  $(LIBDIR)/$(LIBRARY).dll:: $(OBJDIR)/$(LIBRARY).dll
  	$(install-file)
  
  endif # INSTALL_DOT_LIB
  
  else # PLATFORM
  
  #
  # On Solaris, use mcs to write the version into the comment section of
  # the shared library.  On other platforms set this to false at the
  # make command line.
  #
  $(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder)
  	@$(prep-target)
  	@$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), _OPT=$(_OPT)"
  	@$(ECHO) "Rebuilding $@ because of $?"
  	$(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS)
  ifeq ($(WRITE_LIBVERSION),true)
  	$(MCS) -d -a "$(FULL_VERSION)" $@
  endif # WRITE_LIBVERSION
  
  endif # PLATFORM
  
  #
  # Cross check all linted files against each other
  #
  ifeq ($(PLATFORM),solaris)
  lint.errors : $(FILES_ln)
  	$(LINT.c) $(FILES_ln) $(LDLIBS) 
  endif
  
  #
  # Class libraries with JNI native methods get a include to the package.
  #
  ifdef PACKAGE
  vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)
  vpath %.c $(SHARE_SRC)/native/$(PKGDIR)
  OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common
  OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \
  		  -I$(PLATFORM_SRC)/native/$(PKGDIR)
  endif
  
  #
  # Clean/clobber rules
  #
  clean::
  	$(RM) -r $(ACTUAL_LIBRARY)
  
  clobber:: clean
  
  #
  # INCREMENTAL_BUILD means that this workspace will be built over and over
  #   possibly incrementally. This means tracking the object file dependencies
  #   on include files so that sources get re-compiled when the include files
  #   change. When building from scratch and doing a one time build (like
  #   release engineering or nightly builds) set INCREMENTAL_BUILD=false.
  #
  
  ifeq ($(INCREMENTAL_BUILD),true)
  
  #
  # Workaround: gnumake sometimes says files is empty when it shouldn't
  #    was:  files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file))
  #
  files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null)
  
  #
  # Only include these files if we have any.
  #
  ifneq ($(strip $(files)),)
  
  include $(files)
  
  endif # files
  
  endif # INCREMENTAL_BUILD
  
  #
  # Default dependencies
  #
  
  all: build
  
  build: library
  
  debug:
  	$(MAKE) VARIANT=DBG build
  
  fastdebug:
  	$(MAKE) VARIANT=DBG FASTDEBUG=true build
  
  .PHONY: all build debug fastdebug
  
  