#
# Copyright (c) 1995, 2008, 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.
#

#
# 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.
#
# In VS2005 or VS2008 the link command creates a .manifest file that we want
# to insert into the linked artifact so we do not need to track it separately.
# Use ";#2" for .dll and ";#1" for .exe in the MT command below:
$(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)
ifdef MT
	$(MT) /manifest $(OBJDIR)/$(@F).manifest /outputresource:$(OBJDIR)/$(@F);#2
endif
	$(CP) $(OBJDIR)/$(@F) $@
	$(install-module-file)
	$(CP) $(OBJDIR)/$(LIBRARY).map $(@D)
	$(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D)

$(ACTUAL_LIBRARY):: $(ACTUAL_LIBRARY_DIR)/$(LIBRARY).map $(ACTUAL_LIBRARY_DIR)/$(LIBRARY).pdb

$(ACTUAL_LIBRARY_DIR)/%.map: FORCE
	$(install-module-file)

$(ACTUAL_LIBRARY_DIR)/%.pdb: FORCE
	$(install-module-file)

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

# JDK name required here
RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \
            /D "JDK_INTERNAL_NAME=$(LIBRARY)" \
            /D "JDK_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), OPTIMIZATION_LEVEL=$(OPTIMIZATION_LEVEL)"
	@$(ECHO) "Rebuilding $@ because of $?"
ifeq ($(LIBRARY), fdlibm)
	$(AR) -r $@ $(FILES_o)
else # LIBRARY
	$(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS)
	$(install-module-file)
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

FORCE:

.PHONY: all build debug fastdebug

