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

# Make sure the default rule is all
program_default_rule: all

program: $(ACTUAL_PROGRAM)

# Work-around for missing processor specific mapfiles
ifndef CROSS_COMPILE_ARCH
  # reuse the mapfiles in the launcher's directory, the same should
  # be applicable to the tool launchers as well.
  FILES_m = $(BUILDDIR)/java/main/java/mapfile-$(ARCH)
  include $(BUILDDIR)/common/Mapfile-vers.gmk
endif

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 += $(LDFLAG_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)

$(ACTUAL_PROGRAM):: classes $(INIT) 

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

# JDK name required here
RC_FLAGS += /D "JDK_FNAME=$(PROGRAM)$(EXE_SUFFIX)" \
	    /D "JDK_INTERNAL_NAME=$(PROGRAM)" \
	    /D "JDK_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

IMVERSION=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VER).$(COOKED_BUILD_NUMBER)
$(OBJDIR)/$(PROGRAM).exe.manifest: $(JDK_TOPDIR)/src/windows/resource/java.manifest
	@$(prep-target)
	$(SED) 's%IMVERSION%$(IMVERSION)%g;s%PROGRAM%$(PROGRAM)%g' $< > $@

# We used a hand-crafted manifest file for all executables.
# It is tweaked to embed the build number and executable name.
# Use ";#2" for .dll and ";#1" for .exe in the MT command below:
$(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX):: $(OBJDIR)/$(PROGRAM).lcf $(FILES_o) $(JLI_LCF) $(OBJDIR)/$(PROGRAM).exe.manifest
	@$(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)
ifdef MT
	$(MT) /manifest $(OBJDIR)/$(PROGRAM).exe.manifest /outputresource:$@;#1
endif
	@$(call binary_file_verification,$@)

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)
	@$(call binary_file_verification,$@)

endif # PLATFORM

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

OTHER_CPPFLAGS += -DPROGNAME='"$(PROGRAM)"'
VERSION_DEFINES += -DFULL_VERSION='"$(FULL_VERSION)"'

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

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