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

# WARNING: This file is shared with other workspaces.
#          So when it includes other files, it must use JDK_TOPDIR.
#

include $(JDK_TOPDIR)/make/common/Classes.gmk

#
# It is important to define these *after* including Classes.gmk
# in order to override the values defined inthat makefile.
#

ifeq ($(LIBRARY), fdlibm)
ifeq ($(PLATFORM),windows)
ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(FDDLIBM_SUFFIX)
ACTUAL_LIBRARY_DIR = $(OBJDIR)
else # PLATFORM
ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(ARCH).$(FDDLIBM_SUFFIX)
ACTUAL_LIBRARY_DIR = $(OBJDIR)
endif #PLATFORM
else # LIBRARY
ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX)
ACTUAL_LIBRARY_DIR = $(LIB_LOCATION)
endif
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

# FIXUP: unpack needs the zip .o files. So we must build zip?
#     or fix unpack makefile so it uses Program.gmk.
ifneq ($(IMPORT_NATIVE_BINARIES),true)
  COMPILE_IT=true
else
  ifeq ($(LIBRARY),zip)
    COMPILE_IT=true
  else
    COMPILE_IT=false
  endif
endif

# If a Makefile has specified a pre-compiled closed src lib, just copy it.
ifdef USE_BINARY_PLUG_LIBRARY
  COMPILE_IT=false
endif

# We either need to import (copy) libraries in, or build them
ifeq ($(COMPILE_IT),true)

$(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)

ifeq ($(LIBRARY), fdlibm)
$(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lib

$(OBJDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lcf
	@$(prep-target)
	$(LIBEXE) -NODEFAULTLIB:MSVCRT -out:$@ -nologo \
		@$(OBJDIR)/$(LIBRARY).lcf $(OTHER_LCF) $(LDLIBS_COMMON)
else # LIBRARY
# 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)

endif # LIBRARY

$(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 $@ 

# J2SE name required here
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 $?"
ifeq ($(LIBRARY), fdlibm)
	$(AR) -r $@ $(FILES_o)
else # LIBRARY
	$(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS)
ifeq ($(WRITE_LIBVERSION),true)
	$(MCS) -d -a "$(FULL_VERSION)" $@
endif # WRITE_LIBVERSION
endif # LIBRARY

endif # PLATFORM

#
# Cross check all linted files against each other
#
ifeq ($(PLATFORM),solaris)
lint.errors : $(FILES_ln)
	$(LINT.c) $(FILES_ln) $(LDLIBS) 
endif

else  # COMPILE_IT

# OpenJDK rule is first so any lib is preferentially copied from that location.
ifndef USE_BINARY_PLUG_LIBRARY

# In this case we are just copying the file.
ifneq ($(LIBRARY), fdlibm)
# Copies in the file from the JDK_IMPORT_PATH area
$(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/%
	$(install-import-file)
$(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/native_threads/%
	$(install-import-file)
$(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/headless/%
	$(install-import-file)
$(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/xawt/%
	$(install-import-file)
else # fdlibm
$(ACTUAL_LIBRARY_DIR)/%:
	$(prep-target)
endif # fdlibm

endif # USE_BINARY_PLUG_LIBRARY

endif # COMPILE_IT

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

openjdk:
	$(MAKE) OPENJDK=true build

.PHONY: all build debug fastdebug

