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

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

#
# If building programs, use a normal compile approach
#
ifeq ($(COMPILE_APPROACH),batch)
  override COMPILE_APPROACH = normal
endif

ifndef LAUNCHER_PLATFORM_SRC
LAUNCHER_PLATFORM_SRC = $(PLATFORM_SRC)
endif

ifndef LAUNCHER_SHARE_SRC
LAUNCHER_SHARE_SRC = $(SHARE_SRC)
endif

ACTUAL_PROGRAM_NAME = $(PROGRAM)$(EXE_SUFFIX)
ACTUAL_PROGRAM_DIR  = $(BINDIR)
ACTUAL_PROGRAM      = $(ACTUAL_PROGRAM_DIR)/$(ACTUAL_PROGRAM_NAME)

JVMCFG = $(LIBDIR)/$(LIBARCH)/jvm.cfg

# Make sure the default rule is all
program_default_rule: all

program: $(ACTUAL_PROGRAM)

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

ifdef NEVER_ACT_AS_SERVER_CLASS_MACHINE
OTHER_CPPFLAGS += -DNEVER_ACT_AS_SERVER_CLASS_MACHINE
endif

#
# Create a dependency on libjli (Java Launcher Infrastructure)
#
# On UNIX, this is a relative dependency using $ORIGIN. Unfortunately, to
# do this reliably on Linux takes a different syntax than Solaris.
#
# On Windows, this is done by using the same directory as the executable
# itself, as with all the Windows libraries.
#
ifneq (,$(findstring $(PLATFORM), linux solaris))	# UNIX systems
    LDFLAGS += -L $(LIBDIR)/$(LIBARCH)/jli
    OTHER_LDLIBS += -ljli
    ifeq ($(PLATFORM), solaris)
	ifeq ($(ARCH_DATA_MODEL), 32)
		LDFLAGS += -R \$$ORIGIN/../lib/$(LIBARCH)/jli
		LDFLAGS += -R \$$ORIGIN/../jre/lib/$(LIBARCH)/jli
	else
		LDFLAGS += -R \$$ORIGIN/../../lib/$(LIBARCH)/jli
		LDFLAGS += -R \$$ORIGIN/../../jre/lib/$(LIBARCH)/jli
	endif
    endif
    ifeq ($(PLATFORM), linux)
	LDFLAGS += -z origin
	LDFLAGS += -Wl,--allow-shlib-undefined
	LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)/jli
	LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../jre/lib/$(LIBARCH)/jli
    endif
endif
ifeq ($(PLATFORM), windows)
	JLI_LCF = $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/jli.lcf
	ifdef STATIC_JLI
	    LDFLAGS += -libpath:$(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static
	else
	    LDFLAGS += -libpath:$(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)
	endif
	OTHER_LDLIBS += jli.lib
endif

#
# Launcher specific files.
#
FILES_o = \
	$(OBJDIR)/main.$(OBJECT_SUFFIX)

# We either need to import (copy) binaries in, or build them
ifneq ($(IMPORT_NATIVE_BINARIES),true)
  COMPILE_IT=true
else
  COMPILE_IT=false
endif

ifeq ($(COMPILE_IT),true)

$(ACTUAL_PROGRAM):: classes $(JVMCFG) $(INIT) 

#
# Windows only
#
ifeq ($(PLATFORM), windows)

# J2SE name required here
RC_FLAGS += /D "J2SE_FNAME=$(PROGRAM)$(EXE_SUFFIX)" \
	    /D "J2SE_INTERNAL_NAME=$(PROGRAM)" \
	    /D "J2SE_FTYPE=0x1L"

$(OBJDIR)/$(PROGRAM).res: $(VERSIONINFO_RESOURCE)
	@$(prep-target)
ifndef LOCAL_RESOURCE_FILE
	$(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE)
endif

$(OBJDIR)/$(PROGRAM).lcf: $(OBJDIR)/$(PROGRAM).res $(FILES_o)
	@$(prep-target)
	@$(ECHO) $(FILES_o) > $@ 
  ifndef LOCAL_RESOURCE_FILE
	@$(ECHO) $(OBJDIR)/$(PROGRAM).res >> $@
  endif
	@$(ECHO) setargv.obj >> $@
	@$(ECHO) Created $@ 

$(ACTUAL_PROGRAM):: $(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX)
	@$(install-file)

ifeq ($(ARCH_DATA_MODEL), 32)
  STACK_SIZE=327680
else
# We need more Stack for Windows 64bit
  STACK_SIZE=1048576
endif

$(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX):: $(OBJDIR)/$(PROGRAM).lcf $(FILES_o) $(JLI_LCF) 
	@$(prep-target)
	@set -- $?; \
	    $(ECHO) Rebuilding $@ because of $$1 $$2 $$3 $$4 $$5 $$6 $${7:+...};
	$(LINK) -out:$@ /STACK:$(STACK_SIZE) \
	    -map:$(OBJDIR)/$(PROGRAM).map $(LFLAGS) $(LDFLAGS) \
	    @$(OBJDIR)/$(PROGRAM).lcf $(LDLIBS)

else # PLATFORM

#
# Note that we have to link -lthread even when USE_PTHREADS is true.
# This is becuase checkForCorrectLibthread() croaks otherwise.
#
LIBTHREAD = -lthread
ifeq ($(USE_PTHREADS),true)
  THREADLIBS = -lpthread $(LIBTHREAD)
else # USE_PTHREADS
  THREADLIBS = $(LIBTHREAD)
endif # USE_PTHREADS

#
# This rule only applies on unix.  It supports quantify and its ilk.
#
$(ACTUAL_PROGRAM):: $(FILES_o)
	@$(prep-target)
	@set -- $?; \
	    $(ECHO) Rebuilding $@ because of $$1 $$2 $$3 $$4 $$5 $$6 $${7:+...};
	@$(MKDIR) -p $(TEMPDIR)
	$(LINK_PRE_CMD) $(CC) $(CC_OBJECT_OUTPUT_FLAG)$@ $(LDFLAGS) \
	    $(FILES_o) $(THREADLIBS) $(LDLIBS)

endif # PLATFORM

else  # COMPILE_IT

$(ACTUAL_PROGRAM):: $(JVMCFG)

# Copies in the file from the JDK_IMPORT_PATH area
$(ACTUAL_PROGRAM_DIR)/%: $(JDK_IMPORT_PATH)/jre/bin/%
	@$(install-import-file)
$(ACTUAL_PROGRAM_DIR)/%: $(JDK_IMPORT_PATH)/bin/%
	@$(install-import-file)

endif # COMPILE_IT


clean:: 
ifeq ($(PLATFORM), windows)
	$(RM) $(OBJDIR)/$(PROGRAM).rc
	$(RM) $(OBJDIR)/$(PROGRAM).ico
	$(RM) $(OBJDIR)/$(PROGRAM).lcf
	$(RM) $(OBJDIR)/$(PROGRAM).map
	$(RM) $(OBJDIR)/$(PROGRAM).exp
	$(RM) $(OBJDIR)/$(PROGRAM).lib
	$(RM) $(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX)
	$(RM) $(OBJDIR)/$(PROGRAM).ilk
	$(RM) *.pdb
endif


clobber:: 
	$(RM) $(ACTUAL_PROGRAM)

#
# Now include make dependencies (created during compilation, see Rules.gmk)
#
ifeq ($(INCREMENTAL_BUILD),true)
# Workaround: gnumake sometimes says files is empty when it shouldn't
#    was:  files := $(foreach file, $(wildcard */$(ARCH)/*.$(DEPEND_SUFFIX)), $(file))
files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null)
ifneq ($(strip $(files)),)
include $(files)
endif # files
endif # INCREMENTAL_BUILD

ifdef JAVA_ARGS
OTHER_CPPFLAGS += -DJAVA_ARGS=$(JAVA_ARGS)
OTHER_CPPFLAGS += -DLAUNCHER_NAME=\"$(LAUNCHER_NAME)\"
endif

ifeq ($(PLATFORM), windows)
ifdef RELEASE
OTHER_CPPFLAGS += -DVERSION="$(RELEASE)"
endif
endif


ifneq ($(PLATFORM), windows)
HAVE_GETHRTIME=true
endif

ifeq ($(HAVE_GETHRTIME),true)
OTHER_CPPFLAGS += -DHAVE_GETHRTIME
endif

OTHER_INCLUDES += -I$(LAUNCHER_SHARE_SRC)/bin -I$(LAUNCHER_PLATFORM_SRC)/bin
OTHER_INCLUDES += -I$(SHARE_SRC)/native/java/util/zip/zlib-1.1.3

# this may not be necessary...
ifeq ($(PLATFORM), windows)
OTHER_CPPFLAGS += -DPROGNAME="\"$(PROGRAM)\""
VERSION_DEFINES += -DFULL_VERSION="\"$(FULL_VERSION)\""
else
OTHER_CPPFLAGS += -DPROGNAME='"$(PROGRAM)"'
VERSION_DEFINES += -DFULL_VERSION='"$(FULL_VERSION)"'
endif

VERSION_DEFINES += -DJDK_MAJOR_VERSION='"$(JDK_MAJOR_VERSION)"' \
		   -DJDK_MINOR_VERSION='"$(JDK_MINOR_VERSION)"'



$(OBJDIR)/main.$(OBJECT_SUFFIX): $(LAUNCHER_SHARE_SRC)/bin/main.c
	@$(prep-target)
	$(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$(OBJDIR)/main.$(OBJECT_SUFFIX) \
		$(VERSION_DEFINES) $<

#
# How to install jvm.cfg. 
# 
$(JVMCFG): $(LAUNCHER_PLATFORM_SRC)/bin/$(ARCH)/jvm.cfg 
	$(install-file)

#
# Default dependencies
#

all: build

build: program

debug:
	$(MAKE) VARIANT=DBG build

fastdebug:
	$(MAKE) VARIANT=DBG FASTDEBUG=true build

.PHONY: all build program clean clobber debug fastdebug
