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

# set the platform specific directory for macosx, also this platform shares
# substantial family ties with its siblings (solaris and linux), thus we add
# solaris src path to its compilation dependencies.
ifeq ($(PLATFORM), macosx)
  LAUNCHER_PLATFORM_SRC = $(BUILDDIR)/../src/macosx
  LAUNCHER_SOLARIS_PLATFORM_SRC  = $(BUILDDIR)/../src/solaris
else
  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.
#
ifeq ($(PLATFORM), macosx)
  ifneq ($(ARCH), universal)
    LDFLAGS += -Wl,-all_load
  endif
  LDFLAGS += $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static/libjli.a

  ifeq ($(SYSTEM_ZLIB),true)
    OTHER_LDLIBS += -lz
  endif
endif

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

ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
  MAP_OPTION="-map:$(OBJDIR)/$(PROGRAM).map"
endif

  # 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_OPTION) $(LFLAGS) $(LDFLAGS) \
	    @$(OBJDIR)/$(PROGRAM).lcf $(LDLIBS)
  ifdef MT
	$(MT) /manifest $(OBJDIR)/$(PROGRAM).exe.manifest /outputresource:$@;#1
  endif
	@$(call binary_file_verification,$@)
  ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
    ifeq ($(ZIP_DEBUGINFO_FILES),1)
	(set -e ; \
	 $(CD) $(OBJDIR) ; \
	 $(ZIPEXE) -q $(PROGRAM).diz $(PROGRAM).map $(PROGRAM).pdb ; \
	 $(RM) $(PROGRAM).map $(PROGRAM).pdb ; \
	)
    endif
  endif
else
  #
  # 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
    THREADLIBS = $(LIBTHREAD)
  endif

  ifeq ($(PLATFORM), macosx)
    THREADLIBS = -pthread
    # Needed for linking the various launchers
    LDFLAGS += -framework Cocoa -framework Security \
               -framework ApplicationServices
    OTHER_CPPFLAGS += -DPACKAGE_PATH='"$(PACKAGE_PATH)"'

    # Default Info.plist file for the command line tools. This gets overridden by
    # some of the jvmstat tools so that they have task_for_pid() privileges
    ifndef INFO_PLIST_FILE
      INFO_PLIST_FILE = Info-cmdline.plist
    endif
    LDFLAGS += -sectcreate __TEXT __info_plist $(LAUNCHER_PLATFORM_SRC)/lib/$(INFO_PLIST_FILE)
  else 
    INFO_PLIST_FILE=
  endif

  #
  # This rule only applies on unix.  It supports quantify and its ilk.
  #

  ifeq ($(PLATFORM), solaris)
    ifeq ($(PROGRAM_SUPPORTS_FULL_DEBUG_SYMBOLS),1)
  $(ACTUAL_PROGRAM):: $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS)
    endif
  endif

  $(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)
  ifeq ($(findstring privileged, $(INFO_PLIST_FILE)), privileged)
	-codesign -s openjdk_codesign $@
  endif
	@$(call binary_file_verification,$@)
  ifneq ($(PLATFORM), macosx)
    ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
      ifeq ($(PROGRAM_SUPPORTS_FULL_DEBUG_SYMBOLS),1)
        ifeq ($(PLATFORM), solaris)
# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
# Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
# empty section headers until a fixed $(OBJCOPY) is available.
# An empty section header has sh_addr == 0 and sh_size == 0.
# This problem has only been seen on Solaris X64, but we call this tool
# on all Solaris builds just in case.
#
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
	(set -e ; \
	 $(CD) $(@D) ; \
	 $(FIX_EMPTY_SEC_HDR_FLAGS) $(@F) ; \
	 $(OBJCOPY) --only-keep-debug $(@F) $(@F).debuginfo ; \
         $(ADD_GNU_DEBUGLINK) $(@F).debuginfo $(@F) ; \
	)
        else # PLATFORM != solaris
	(set -e ; \
	 $(CD) $(@D) ; \
	 $(OBJCOPY) --only-keep-debug $(@F) $(@F).debuginfo ; \
	 $(OBJCOPY) --add-gnu-debuglink=$(@F).debuginfo $(@F) ; \
	)
        endif # PLATFORM == solaris
        ifeq ($(STRIP_POLICY),all_strip)
	  $(STRIP) $@
        else
          ifeq ($(STRIP_POLICY),min_strip)
            ifeq ($(PLATFORM), solaris)
	      $(STRIP) -x $@
            else
              # assume Linux
	      $(STRIP) -g $@
            endif
          # implied else here is no stripping at all
          endif
        endif
        ifeq ($(ZIP_DEBUGINFO_FILES),1)
	  (set -e ; \
	   $(CD) $(@D) ; \
	   $(ZIPEXE) -q $(@F).diz $(@F).debuginfo ; \
	   $(RM) $(@F).debuginfo ; \
	  )
          # save ZIP'ed debug info with rest of the program's build artifacts
	  $(MV) $@.diz $(OBJDIR)
        else
          # save debug info with rest of the program's build artifacts
	  $(MV) $@.debuginfo $(OBJDIR)
        endif
      endif # PROGRAM_SUPPORTS_FULL_DEBUG_SYMBOLS
    endif # ENABLE_FULL_DEBUG_SYMBOLS
  endif # PLATFORM-!macosx
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).pdb
	$(RM) $(OBJDIR)/$(PROGRAM).exp
	$(RM) $(OBJDIR)/$(PROGRAM).lib
	$(RM) $(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX)
	$(RM) $(OBJDIR)/$(PROGRAM).ilk
	$(RM) *.pdb
else
	$(RM) $(OBJDIR)/$(PROGRAM).debuginfo
endif
	$(RM) $(OBJDIR)/$(PROGRAM).diz


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
endif

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
ifeq ($(PLATFORM), macosx)
  OTHER_INCLUDES += -I$(LAUNCHER_SOLARIS_PLATFORM_SRC)/bin
  ifneq ($(SYSTEM_ZLIB), true)
    OTHER_INCLUDES += -I$(SHARE_SRC)/native/java/util/zip/zlib-1.1.3
  endif
else
  OTHER_INCLUDES += -I$(SHARE_SRC)/native/java/util/zip/zlib-1.1.3
endif

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
