# # 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) 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) \ $(sort $(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