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

#
# Java Launcher Infrastructure Library (libjli)
#
# This library provides shared support for the Java launcher in all of
# its manifestations (java, javaw, javac, ...).
#
BUILDDIR = ../..
MODULE  = base
LIBRARY = jli
PRODUCT = java

#
# Must be included before Defs.gmk to be functional.
#
# Note that for Windows, both a dynamic and static version are built.
# Doing the compiles with the static library specified can be overridden
# by the link step, but not the reverse.
#
MS_RUNTIME_STATIC = true

include $(BUILDDIR)/common/Defs.gmk

ZIP_SRC = $(SHARE_SRC)/native/java/util/zip/zlib-$(ZLIB_VERSION)
LAUNCHER_SHARE_SRC = $(SHARE_SRC)/bin
LAUNCHER_PLATFORM_SRC = $(PLATFORM_SRC)/bin

ifeq ($(ZERO_BUILD), true)
ERGO_FAMILY=zero
else
ifeq ($(ARCH_FAMILY), amd64)
ERGO_FAMILY=i586
else
ERGO_FAMILY=$(ARCH_FAMILY)
endif
endif


#
# Files to compile.
#
FILES_c = \
	java.c \
	splashscreen_stubs.c \
	java_md.c \
	parse_manifest.c \
	version_comp.c \
	wildcard.c \
	jli_util.c \
	inflate.c \
	inftrees.c \
	inffast.c \
	zadler32.c \
	zcrc32.c \
	zutil.c

ifneq ($(PLATFORM), windows)

FILES_c += \
	$(CTARGDIR)ergo.c \
	$(CTARGDIR)ergo_$(ERGO_FAMILY).c
endif


# Names of arch directories
LIBARCH_DEFINES = -DLIBARCHNAME='"$(LIBARCH)"'
ifeq ($(PLATFORM), solaris)
  LIBARCH_DEFINES += -DLIBARCH32NAME='"$(LIBARCH32)"'
  LIBARCH_DEFINES += -DLIBARCH64NAME='"$(LIBARCH64)"'
endif

OTHER_CPPFLAGS += $(LIBARCH_DEFINES)


ifneq ($(PLATFORM), windows)	# UNIX systems
        LD_RUNPATH_EXTRAS += ..
	LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli
	# Note: its important to keep this order meaning -lc is the
	# last library otherwise it could cause compatibility issues
	# by pulling in SUNW_private symbols from libc
	LDLIBS = -ldl -lc
ifeq ($(USE_PTHREADS),true)
	LDLIBS += -lpthread
endif # USE_PTHREADS 
endif # PLATFORM

ifeq ($(PLATFORM), windows)
	EXTRA_LIBS = advapi32.lib \
		     comctl32.lib \
		     user32.lib

	JAVALIB =
	OTHER_LCF =  -export:JLI_Launch \
		     -export:JLI_ManifestIterate \
		     -export:JLI_SetTraceLauncher \
		     -export:JLI_ReportErrorMessage \
		     -export:JLI_ReportErrorMessageSys \
		     -export:JLI_ReportMessage \
		     -export:JLI_ReportExceptionDescription

endif

OTHER_INCLUDES += -I$(LAUNCHER_SHARE_SRC)
OTHER_INCLUDES += -I$(LAUNCHER_PLATFORM_SRC)
OTHER_INCLUDES += -I$(ZIP_SRC)

#
# Library to compile.
#
include $(BUILDDIR)/common/Mapfile-vers.gmk
include $(BUILDDIR)/common/Library.gmk

#
# On Windows, some executable objects need to be statically linked against
# the jli library.  Hence, we need both a standard library (archive) and
# an import library (associated with a dll).  These both usually have the
# extension .LIB, so they need to be placed in different directories.  The
# import library is build (as usual) in the $(OBJDIR) directory while the
# standard library is built in a "static" subdirectory.  The standard library
# is not delivered as part of the product, but is only needed as part of
# the build process.  The import library is built by the standard rules
# in Library.gmk.  The additional rules which follow build the standard
# library.
#
ifeq ($(PLATFORM), windows)

STATIC_LIBRARY_DIR = $(OBJDIR)/static
STATIC_LIBRARY_NAME = $(LIBPREFIX)$(LIBRARY).lib
STATIC_LIBRARY = $(STATIC_LIBRARY_DIR)/$(STATIC_LIBRARY_NAME)

$(STATIC_LIBRARY_DIR): $(OBJDIR)
	@$(MKDIR) $(STATIC_LIBRARY_DIR)

$(STATIC_LIBRARY): $(STATIC_LIBRARY_DIR)
	@$(prep-target)
	$(LIBEXE) -nologo -out:$@ $(FILES_o)

library:: $(STATIC_LIBRARY)

endif	# PLATFORM

#
# Add to ambient vpath so we pick up the library files
#
vpath %.c $(LAUNCHER_SHARE_SRC) $(ZIP_SRC) $(LAUNCHER_PLATFORM_SRC)
