jdk/make/common/Program.gmk
changeset 2 90ce3da70b43
child 1776 33e9405ab91b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/common/Program.gmk	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,294 @@
+#
+# 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