1 # 2 # Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. 3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 # 5 # This code is free software; you can redistribute it and/or modify it 6 # under the terms of the GNU General Public License version 2 only, as 7 # published by the Free Software Foundation. Oracle designates this 8 # particular file as subject to the "Classpath" exception as provided 9 # by Oracle in the LICENSE file that accompanied this code. 10 # 11 # This code is distributed in the hope that it will be useful, but WITHOUT 12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 # version 2 for more details (a copy is included in the LICENSE file that 15 # accompanied this code). 16 # 17 # You should have received a copy of the GNU General Public License version 18 # 2 along with this work; if not, write to the Free Software Foundation, 19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 # 21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 # or visit www.oracle.com if you need additional information or have any 23 # questions. 24 # 25 26 # 27 # Generic makefile for building executables. 28 # 29 30 # WARNING: This file is shared with other workspaces. 31 # So when it includes other files, it must use JDK_TOPDIR. 32 # 33 34 # 35 # If building programs, use a normal compile approach 36 # 37 ifeq ($(COMPILE_APPROACH),batch) 38 override COMPILE_APPROACH = normal 39 endif 40 41 ifndef LAUNCHER_PLATFORM_SRC 42 LAUNCHER_PLATFORM_SRC = $(PLATFORM_SRC) 43 endif 44 45 ifndef LAUNCHER_SHARE_SRC 46 LAUNCHER_SHARE_SRC = $(SHARE_SRC) 47 endif 48 49 ACTUAL_PROGRAM_NAME = $(PROGRAM)$(EXE_SUFFIX) 50 ACTUAL_PROGRAM_DIR = $(BINDIR) 51 ACTUAL_PROGRAM = $(ACTUAL_PROGRAM_DIR)/$(ACTUAL_PROGRAM_NAME) 52 53 # Make sure the default rule is all 54 program_default_rule: all 55 56 program: $(ACTUAL_PROGRAM) 57 58 # Work-around for missing processor specific mapfiles 59 ifndef CROSS_COMPILE_ARCH 60 # reuse the mapfiles in the launcher's directory, the same should 61 # be applicable to the tool launchers as well. 62 FILES_m = $(BUILDDIR)/java/main/java/mapfile-$(ARCH) 63 include $(BUILDDIR)/common/Mapfile-vers.gmk 64 endif 65 66 include $(JDK_TOPDIR)/make/common/Rules.gmk 67 68 ifdef NEVER_ACT_AS_SERVER_CLASS_MACHINE 69 OTHER_CPPFLAGS += -DNEVER_ACT_AS_SERVER_CLASS_MACHINE 70 endif 71 72 # 73 # Create a dependency on libjli (Java Launcher Infrastructure) 74 # 75 # On UNIX, this is a relative dependency using $ORIGIN. Unfortunately, to 76 # do this reliably on Linux takes a different syntax than Solaris. 77 # 78 # On Windows, this is done by using the same directory as the executable 79 # itself, as with all the Windows libraries. 80 # 81 ifneq (,$(findstring $(PLATFORM), linux solaris)) # UNIX systems 82 LDFLAGS += -L $(LIBDIR)/$(LIBARCH)/jli 83 OTHER_LDLIBS += -ljli 84 ifeq ($(PLATFORM), solaris) 85 ifeq ($(ARCH_DATA_MODEL), 32) 86 LDFLAGS += -R \$$ORIGIN/../lib/$(LIBARCH)/jli 87 LDFLAGS += -R \$$ORIGIN/../jre/lib/$(LIBARCH)/jli 88 else 89 LDFLAGS += -R \$$ORIGIN/../../lib/$(LIBARCH)/jli 90 LDFLAGS += -R \$$ORIGIN/../../jre/lib/$(LIBARCH)/jli 91 endif 92 endif 93 ifeq ($(PLATFORM), linux) 94 LDFLAGS += $(LDFLAG_Z_ORIGIN) 95 LDFLAGS += -Wl,--allow-shlib-undefined 96 LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)/jli 97 LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../jre/lib/$(LIBARCH)/jli 98 endif 99 endif 100 ifeq ($(PLATFORM), windows) 101 JLI_LCF = $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/jli.lcf 102 ifdef STATIC_JLI 103 LDFLAGS += -libpath:$(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static 104 else 105 LDFLAGS += -libpath:$(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME) 106 endif 107 OTHER_LDLIBS += jli.lib 108 endif 109 110 # 111 # Launcher specific files. 112 # 113 FILES_o = \ 114 $(OBJDIR)/main.$(OBJECT_SUFFIX) 115 116 $(ACTUAL_PROGRAM):: classes $(INIT) 117 118 # 119 # Windows only 120 # 121 ifeq ($(PLATFORM), windows) 122 123 # JDK name required here 124 RC_FLAGS += /D "JDK_FNAME=$(PROGRAM)$(EXE_SUFFIX)" \ 125 /D "JDK_INTERNAL_NAME=$(PROGRAM)" \ 126 /D "JDK_FTYPE=0x1L" 127 128 $(OBJDIR)/$(PROGRAM).res: $(VERSIONINFO_RESOURCE) 129 @$(prep-target) 130 ifndef LOCAL_RESOURCE_FILE 131 $(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE) 132 endif 133 134 $(OBJDIR)/$(PROGRAM).lcf: $(OBJDIR)/$(PROGRAM).res $(FILES_o) 135 @$(prep-target) 136 @$(ECHO) $(FILES_o) > $@ 137 ifndef LOCAL_RESOURCE_FILE 138 @$(ECHO) $(OBJDIR)/$(PROGRAM).res >> $@ 139 endif 140 @$(ECHO) setargv.obj >> $@ 141 @$(ECHO) Created $@ 142 143 $(ACTUAL_PROGRAM):: $(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX) 144 @$(install-file) 145 146 ifeq ($(ARCH_DATA_MODEL), 32) 147 STACK_SIZE=327680 148 else 149 # We need more Stack for Windows 64bit 150 STACK_SIZE=1048576 151 endif 152 153 IMVERSION=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VER).$(COOKED_BUILD_NUMBER) 154 $(OBJDIR)/$(PROGRAM).exe.manifest: $(JDK_TOPDIR)/src/windows/resource/java.manifest 155 @$(prep-target) 156 $(SED) 's%IMVERSION%$(IMVERSION)%g;s%PROGRAM%$(PROGRAM)%g' $< > $@ 157 158 # We used a hand-crafted manifest file for all executables. 159 # It is tweaked to embed the build number and executable name. 160 # Use ";#2" for .dll and ";#1" for .exe in the MT command below: 161 $(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX):: $(OBJDIR)/$(PROGRAM).lcf $(FILES_o) $(JLI_LCF) $(OBJDIR)/$(PROGRAM).exe.manifest 162 @$(prep-target) 163 @set -- $?; \ 164 $(ECHO) Rebuilding $@ because of $$1 $$2 $$3 $$4 $$5 $$6 $${7:+...}; 165 $(LINK) -out:$@ /STACK:$(STACK_SIZE) \ 166 -map:$(OBJDIR)/$(PROGRAM).map $(LFLAGS) $(LDFLAGS) \ 167 @$(OBJDIR)/$(PROGRAM).lcf $(LDLIBS) 168 ifdef MT 169 $(MT) /manifest $(OBJDIR)/$(PROGRAM).exe.manifest /outputresource:$@;#1 170 endif 171 @$(call binary_file_verification,$@) 172 173 else # PLATFORM 174 175 # 176 # Note that we have to link -lthread even when USE_PTHREADS is true. 177 # This is becuase checkForCorrectLibthread() croaks otherwise. 178 # 179 LIBTHREAD = -lthread 180 ifeq ($(USE_PTHREADS),true) 181 THREADLIBS = -lpthread $(LIBTHREAD) 182 else # USE_PTHREADS 183 THREADLIBS = $(LIBTHREAD) 184 endif # USE_PTHREADS 185 186 # 187 # This rule only applies on unix. It supports quantify and its ilk. 188 # 189 $(ACTUAL_PROGRAM):: $(FILES_o) 190 @$(prep-target) 191 @set -- $?; \ 192 $(ECHO) Rebuilding $@ because of $$1 $$2 $$3 $$4 $$5 $$6 $${7:+...}; 193 @$(MKDIR) -p $(TEMPDIR) 194 $(LINK_PRE_CMD) $(CC) $(CC_OBJECT_OUTPUT_FLAG)$@ $(LDFLAGS) \ 195 $(FILES_o) $(THREADLIBS) $(LDLIBS) 196 @$(call binary_file_verification,$@) 197 $(install-module-file) 198 199 endif # PLATFORM 200 201 clean:: 202 ifeq ($(PLATFORM), windows) 203 $(RM) $(OBJDIR)/$(PROGRAM).rc 204 $(RM) $(OBJDIR)/$(PROGRAM).ico 205 $(RM) $(OBJDIR)/$(PROGRAM).lcf 206 $(RM) $(OBJDIR)/$(PROGRAM).map 207 $(RM) $(OBJDIR)/$(PROGRAM).exp 208 $(RM) $(OBJDIR)/$(PROGRAM).lib 209 $(RM) $(OBJDIR)/$(PROGRAM)$(EXE_SUFFIX) 210 $(RM) $(OBJDIR)/$(PROGRAM).ilk 211 $(RM) *.pdb 212 endif 213 214 215 clobber:: 216 $(RM) $(ACTUAL_PROGRAM) 217 218 # 219 # Now include make dependencies (created during compilation, see Rules.gmk) 220 # 221 ifeq ($(INCREMENTAL_BUILD),true) 222 # Workaround: gnumake sometimes says files is empty when it shouldn't 223 # was: files := $(foreach file, $(wildcard */$(ARCH)/*.$(DEPEND_SUFFIX)), $(file)) 224 files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null) 225 ifneq ($(strip $(files)),) 226 include $(files) 227 endif # files 228 endif # INCREMENTAL_BUILD 229 230 ifdef JAVA_ARGS 231 OTHER_CPPFLAGS += -DJAVA_ARGS='$(JAVA_ARGS)' 232 OTHER_CPPFLAGS += -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"' 233 endif 234 235 ifdef PROGRAM_MODULE 236 OTHER_CPPFLAGS += -DMODULE_NAME='"$(PROGRAM_MODULE)"' 237 OTHER_CPPFLAGS += -DMODULE_VERSION='"$(MODULE_VERSION)"' 238 endif 239 240 ifeq ($(PLATFORM), windows) 241 ifdef RELEASE 242 OTHER_CPPFLAGS += -DVERSION='"$(RELEASE)"' 243 endif 244 endif 245 246 247 ifneq ($(PLATFORM), windows) 248 HAVE_GETHRTIME=true 249 endif 250 251 ifeq ($(HAVE_GETHRTIME),true) 252 OTHER_CPPFLAGS += -DHAVE_GETHRTIME 253 endif 254 255 OTHER_INCLUDES += -I$(LAUNCHER_SHARE_SRC)/bin -I$(LAUNCHER_PLATFORM_SRC)/bin 256 OTHER_INCLUDES += -I$(SHARE_SRC)/native/java/util/zip/zlib-1.1.3 257 258 OTHER_CPPFLAGS += -DPROGNAME='"$(PROGRAM)"' 259 VERSION_DEFINES += -DFULL_VERSION='"$(FULL_VERSION)"' 260 261 VERSION_DEFINES += -DJDK_MAJOR_VERSION='"$(JDK_MAJOR_VERSION)"' \ 262 -DJDK_MINOR_VERSION='"$(JDK_MINOR_VERSION)"' 263 264 265 266 $(OBJDIR)/main.$(OBJECT_SUFFIX): $(LAUNCHER_SHARE_SRC)/bin/main.c 267 @$(prep-target) 268 $(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$(OBJDIR)/main.$(OBJECT_SUFFIX) \ 269 $(VERSION_DEFINES) $< 270 271 # 272 # Default dependencies 273 # 274 275 all: build 276 277 build: program 278 279 debug: 280 $(MAKE) VARIANT=DBG build 281 282 fastdebug: 283 $(MAKE) VARIANT=DBG FASTDEBUG=true build 284 285 .PHONY: all build program clean clobber debug fastdebug