1 #
   2 # Copyright (c) 1999, 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 # Makefile to specify compiler flags for programs and libraries
  28 # targeted to Linux.  Should not contain any rules.
  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 # Warning: the following variables are overriden by Defs.gmk. Set
  35 # values will be silently ignored:
  36 #   CFLAGS        (set $(OTHER_CFLAGS) instead)
  37 #   CPPFLAGS      (set $(OTHER_CPPFLAGS) instead)
  38 #   CXXFLAGS      (set $(OTHER_CXXFLAGS) instead)
  39 #   LDFLAGS       (set $(OTHER_LDFAGS) instead)
  40 #   LDLIBS        (set $(EXTRA_LIBS) instead)
  41 #   LDLIBS_COMMON (set $(EXTRA_LIBS) instead)
  42 
  43 # Get shared JDK settings
  44 include $(JDK_MAKE_SHARED_DIR)/Defs.gmk
  45 
  46 # Part of INCREMENTAL_BUILD mechanism.
  47 #   Compiler emits things like:  path/file.o: file.h
  48 #   We want something like: relative_path/file.o relative_path/file.d: file.h
  49 CC_DEPEND        = -MM
  50 CC_DEPEND_FILTER = $(SED) -e 's!$*\.$(OBJECT_SUFFIX)!$(dir $@)& $(dir $@)$*.$(DEPEND_SUFFIX)!g'
  51 
  52 ifndef PLATFORM_SRC
  53   PLATFORM_SRC = $(BUILDDIR)/../src/solaris
  54 endif # PLATFORM_SRC
  55 
  56 # Platform specific closed sources
  57 ifndef OPENJDK
  58   ifndef CLOSED_PLATFORM_SRC
  59     CLOSED_PLATFORM_SRC = $(BUILDDIR)/../src/closed/solaris
  60   endif
  61 endif
  62 
  63 # platform specific include files
  64 PLATFORM_INCLUDE_NAME = $(PLATFORM)
  65 PLATFORM_INCLUDE      = $(INCLUDEDIR)/$(PLATFORM_INCLUDE_NAME)
  66 
  67 # suffix used for make dependencies files.
  68 DEPEND_SUFFIX = d
  69 # The suffix applied to the library name for FDLIBM
  70 FDDLIBM_SUFFIX = a
  71 # The suffix applied to scripts (.bat for windows, nothing for unix)
  72 SCRIPT_SUFFIX =
  73 # CC compiler object code output directive flag value
  74 CC_OBJECT_OUTPUT_FLAG = -o #trailing blank required!
  75 CC_PROGRAM_OUTPUT_FLAG = -o #trailing blank required!
  76 
  77 # Default OBJCOPY comes from GNU Binutils on Linux:
  78 DEF_OBJCOPY=/usr/bin/objcopy
  79 ifdef CROSS_COMPILE_ARCH
  80   # don't try to generate .debuginfo files when cross compiling
  81   _JUNK_ := $(shell \
  82     echo >&2 "INFO: cross compiling for ARCH $(CROSS_COMPILE_ARCH)," \
  83       "skipping .debuginfo generation.")
  84   OBJCOPY=
  85 else
  86   OBJCOPY=$(shell test -x $(DEF_OBJCOPY) && echo $(DEF_OBJCOPY))
  87   ifneq ($(ALT_OBJCOPY),)
  88     _JUNK_ := $(shell echo >&2 "INFO: ALT_OBJCOPY=$(ALT_OBJCOPY)")
  89     # disable .debuginfo support by setting ALT_OBJCOPY to a non-existent path
  90     OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY))
  91   endif
  92 endif
  93 
  94 ifdef LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS
  95 # The setting of OBJCOPY above enables the JDK build to import
  96 # .debuginfo files from the HotSpot build. However, adding FDS
  97 # support to the JDK build will occur in phases so a different
  98 # make variable is used to indicate that a particular library
  99 # supports FDS.
 100 
 101 ifeq ($(OBJCOPY),)
 102   _JUNK_ := $(shell \
 103     echo >&2 "INFO: no objcopy cmd found so cannot create .debuginfo files.")
 104 else
 105   _JUNK_ := $(shell \
 106     echo >&2 "INFO: $(OBJCOPY) cmd found so will create .debuginfo files.")
 107 
 108   # Library stripping policies for .debuginfo configs:
 109   #   all_strip - strips everything from the library
 110   #   min_strip - strips most stuff from the library; leaves minimum symbols
 111   #   no_strip  - does not strip the library at all
 112   #
 113   # Oracle security policy requires "all_strip". A waiver was granted on
 114   # 2011.09.01 that permits using "min_strip" in the Java JDK and Java JRE.
 115   #
 116   DEF_STRIP_POLICY="min_strip"
 117   ifeq ($(ALT_STRIP_POLICY),)
 118     STRIP_POLICY=$(DEF_STRIP_POLICY)
 119   else
 120     STRIP_POLICY=$(ALT_STRIP_POLICY)
 121   endif
 122 
 123   _JUNK_ := $(shell \
 124     echo >&2 "INFO: STRIP_POLICY=$(STRIP_POLICY)")
 125 endif
 126 endif
 127 
 128 #
 129 # Default optimization
 130 #
 131 
 132 ifndef OPTIMIZATION_LEVEL
 133   ifeq ($(PRODUCT), java)
 134     OPTIMIZATION_LEVEL = HIGHER
 135   else
 136     OPTIMIZATION_LEVEL = LOWER
 137   endif
 138 endif
 139 ifndef FASTDEBUG_OPTIMIZATION_LEVEL
 140   FASTDEBUG_OPTIMIZATION_LEVEL = LOWER
 141 endif
 142 
 143 CC_OPT/NONE     = 
 144 CC_OPT/LOWER    = -O2
 145 CC_OPT/HIGHER   = -O3
 146 CC_OPT/HIGHEST  = -O3
 147 
 148 CC_OPT          = $(CC_OPT/$(OPTIMIZATION_LEVEL))
 149 
 150 # For all platforms, do not omit the frame pointer register usage. 
 151 #    We need this frame pointer to make it easy to walk the stacks.
 152 #    This should be the default on X86, but ia64 and amd64 may not have this
 153 #    as the default.
 154 CFLAGS_REQUIRED_amd64   += -fno-omit-frame-pointer -D_LITTLE_ENDIAN
 155 CFLAGS_REQUIRED_i586    += -fno-omit-frame-pointer -D_LITTLE_ENDIAN
 156 CFLAGS_REQUIRED_ia64    += -fno-omit-frame-pointer -D_LITTLE_ENDIAN
 157 CFLAGS_REQUIRED_sparcv9 += -m64 -mcpu=v9
 158 LDFLAGS_COMMON_sparcv9  += -m64 -mcpu=v9
 159 CFLAGS_REQUIRED_sparc   += -m32 -mcpu=v9
 160 LDFLAGS_COMMON_sparc    += -m32 -mcpu=v9
 161 CFLAGS_REQUIRED_arm     += -fsigned-char -D_LITTLE_ENDIAN
 162 CFLAGS_REQUIRED_ppc     += -fsigned-char -D_BIG_ENDIAN
 163 ifeq ($(ZERO_BUILD), true)
 164   CFLAGS_REQUIRED       =  $(ZERO_ARCHFLAG)
 165   ifeq ($(ZERO_ENDIANNESS), little)
 166     CFLAGS_REQUIRED     += -D_LITTLE_ENDIAN
 167   endif
 168   LDFLAGS_COMMON        += $(ZERO_ARCHFLAG)
 169 else
 170   CFLAGS_REQUIRED       =  $(CFLAGS_REQUIRED_$(ARCH))
 171   LDFLAGS_COMMON        += $(LDFLAGS_COMMON_$(ARCH))
 172 endif
 173 
 174 # If this is a --hash-style=gnu system, use --hash-style=both
 175 #   The gnu .hash section won't work on some Linux systems like SuSE 10.
 176 _HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | $(GREP) -- '--hash-style=gnu')
 177 ifneq ($(_HAS_HASH_STYLE_GNU),)
 178   LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
 179 endif
 180 LDFLAGS_COMMON          += $(LDFLAGS_HASH_STYLE)
 181 
 182 #
 183 # Selection of warning messages
 184 #
 185 GCC_INHIBIT     = -Wno-unused -Wno-parentheses
 186 GCC_STYLE       = 
 187 GCC_WARNINGS    = -W -Wall $(GCC_STYLE) $(GCC_INHIBIT)
 188 
 189 #
 190 # Treat compiler warnings as errors, if warnings not allowed
 191 #
 192 ifeq ($(COMPILER_WARNINGS_FATAL),true)
 193   GCC_WARNINGS += -Werror
 194 endif
 195 
 196 #
 197 # Misc compiler options
 198 #
 199 ifneq ($(ARCH),ppc)
 200   CFLAGS_COMMON   = -fno-strict-aliasing
 201 endif 
 202 PIC_CODE_LARGE = -fPIC
 203 PIC_CODE_SMALL = -fpic
 204 GLOBAL_KPIC = $(PIC_CODE_LARGE)
 205 CFLAGS_COMMON   += $(GLOBAL_KPIC) $(GCC_WARNINGS)
 206 ifeq ($(ARCH), amd64)
 207  CFLAGS_COMMON += -pipe
 208 endif
 209 
 210 # Linux 64bit machines use Dwarf2, which can be HUGE, have fastdebug use -g1
 211 DEBUG_FLAG = -g
 212 ifeq ($(FASTDEBUG), true)
 213   ifeq ($(ARCH_DATA_MODEL), 64)
 214     DEBUG_FLAG = -g1
 215   endif
 216 endif
 217 
 218 # DEBUG_BINARIES overrides everything, use full -g debug information
 219 ifeq ($(DEBUG_BINARIES), true)
 220   DEBUG_FLAG = -g
 221   CFLAGS_REQUIRED += $(DEBUG_FLAG)
 222 endif
 223 
 224 CFLAGS_OPT      = $(CC_OPT)
 225 CFLAGS_DBG      = $(DEBUG_FLAG)
 226 CFLAGS_COMMON += $(CFLAGS_REQUIRED)
 227 
 228 CXXFLAGS_COMMON = $(GLOBAL_KPIC) -DCC_NOEX $(GCC_WARNINGS)
 229 CXXFLAGS_OPT    = $(CC_OPT)
 230 CXXFLAGS_DBG    = $(DEBUG_FLAG)
 231 CXXFLAGS_COMMON += $(CFLAGS_REQUIRED)
 232 
 233 # FASTDEBUG: Optimize the code in the -g versions, gives us a faster debug java
 234 ifeq ($(FASTDEBUG), true)
 235   CFLAGS_DBG    += $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL))
 236   CXXFLAGS_DBG  += $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL))
 237 endif
 238 
 239 CPP_ARCH_FLAGS = -DARCH='"$(ARCH)"'
 240 
 241 # Alpha arch does not like "alpha" defined (potential general arch cleanup issue here)
 242 ifneq ($(ARCH),alpha)
 243   CPP_ARCH_FLAGS += -D$(ARCH)
 244 else
 245   CPP_ARCH_FLAGS += -D_$(ARCH)_
 246 endif
 247 
 248 CPPFLAGS_COMMON = $(CPP_ARCH_FLAGS) -DLINUX $(VERSION_DEFINES) \
 249                   -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -D_REENTRANT
 250 
 251 ifeq ($(ARCH_DATA_MODEL), 64)
 252 CPPFLAGS_COMMON += -D_LP64=1
 253 endif
 254 
 255 CPPFLAGS_OPT    = -DNDEBUG
 256 CPPFLAGS_DBG    = -DDEBUG
 257 ifneq ($(PRODUCT), java)
 258   CPPFLAGS_DBG    += -DLOGGING 
 259 endif
 260 
 261 ifdef LIBRARY
 262   # Libraries need to locate other libraries at runtime, and you can tell
 263   #   a library where to look by way of the dynamic runpaths (RPATH or RUNPATH)
 264   #   buried inside the .so. The $ORIGIN says to look relative to where
 265   #   the library itself is and it can be followed with relative paths from
 266   #   that. By default we always look in $ORIGIN, optionally we add relative
 267   #   paths if the Makefile sets LD_RUNPATH_EXTRAS to those relative paths.
 268   #   On Linux we add a flag -z origin, not sure if this is necessary, but 
 269   #   doesn't seem to hurt.
 270   #   The environment variable LD_LIBRARY_PATH will over-ride these runpaths.
 271   #   Try: 'readelf -d lib*.so' to see these settings in a library.
 272   #
 273   Z_ORIGIN_FLAG/sparc = -Xlinker -z -Xlinker origin
 274   Z_ORIGIN_FLAG/i586  = -Xlinker -z -Xlinker origin
 275   Z_ORIGIN_FLAG/amd64 = -Xlinker -z -Xlinker origin 
 276   Z_ORIGIN_FLAG/ia64  = -Xlinker -z -Xlinker origin
 277   Z_ORIGIN_FLAG/arm   = 
 278   Z_ORIGIN_FLAG/ppc   =
 279   Z_ORIGIN_FLAG/zero  = -Xlinker -z -Xlinker origin
 280 
 281   LDFLAG_Z_ORIGIN = $(Z_ORIGIN_FLAG/$(ARCH_FAMILY))
 282 
 283   LDFLAGS_COMMON += $(LDFLAG_Z_ORIGIN) -Xlinker -rpath -Xlinker \$$ORIGIN
 284   LDFLAGS_COMMON += $(LD_RUNPATH_EXTRAS:%=$(LDFLAG_Z_ORIGIN) -Xlinker -rpath -Xlinker \$$ORIGIN/%)
 285 
 286 endif
 287 
 288 EXTRA_LIBS += -lc
 289 
 290 LDFLAGS_DEFS_OPTION  = -Xlinker -z -Xlinker defs
 291 LDFLAGS_COMMON  += $(LDFLAGS_DEFS_OPTION)
 292 
 293 #
 294 # -L paths for finding and -ljava
 295 #
 296 LDFLAGS_OPT     = -Xlinker -O1
 297 LDFLAGS_COMMON += -L$(LIBDIR)/$(LIBARCH)
 298 LDFLAGS_COMMON += -Wl,-soname=$(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX)
 299 
 300 #
 301 # -static-libgcc is a gcc-3 flag to statically link libgcc, gcc-2.9x always
 302 # statically link libgcc but will print a warning with the flag. We don't 
 303 # want the warning, so check gcc version first.
 304 #
 305 ifeq ($(CC_MAJORVER),3)
 306   OTHER_LDFLAGS  += -static-libgcc
 307 endif
 308 
 309 # Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
 310 #   (See Rules.gmk) The gcc 5 compiler might have an option for this?
 311 AUTOMATIC_PCH_OPTION = 
 312 
 313 #
 314 # Post Processing of libraries/executables
 315 #
 316 ifeq ($(VARIANT), OPT)
 317   ifneq ($(NO_STRIP), true)
 318     ifneq ($(DEBUG_BINARIES), true)
 319       # Debug 'strip -g' leaves local function Elf symbols (better stack
 320       # traces)
 321       POST_STRIP_PROCESS = $(STRIP) -g
 322     endif
 323   endif
 324 endif
 325 
 326 #
 327 # Use: ld $(LD_MAPFILE_FLAG) mapfile *.o
 328 #
 329 LD_MAPFILE_FLAG = -Xlinker --version-script -Xlinker
 330 
 331 #
 332 # Support for Quantify.
 333 #
 334 ifdef QUANTIFY
 335 QUANTIFY_CMD = quantify
 336 QUANTIFY_OPTIONS = -cache-dir=/tmp/quantify -always-use-cache-dir=yes
 337 LINK_PRE_CMD = $(QUANTIFY_CMD) $(QUANTIFY_OPTIONS)
 338 endif
 339 
 340 #
 341 # Path and option to link against the VM, if you have to.  Note that
 342 # there are libraries that link against only -ljava, but they do get
 343 # -L to the -ljvm, this is because -ljava depends on -ljvm, whereas
 344 # the library itself should not.
 345 #
 346 VM_NAME         = server
 347 JVMLIB          = -L$(LIBDIR)/$(LIBARCH)/$(VM_NAME) -ljvm
 348 JAVALIB         = -ljava $(JVMLIB)
 349 
 350 #
 351 # We want to privatize JVM symbols on Solaris. This is so the user can
 352 # write a function called FindClass and this should not override the 
 353 # FindClass that is inside the JVM. At this point in time we are not
 354 # concerned with other JNI libraries because we hope that there will
 355 # not be as many clashes there.
 356 #
 357 PRIVATIZE_JVM_SYMBOLS = false
 358 
 359 USE_PTHREADS = true
 360 override ALT_CODESET_KEY         = _NL_CTYPE_CODESET_NAME
 361 override AWT_RUNPATH             =
 362 override HAVE_ALTZONE            = false
 363 override HAVE_FILIOH             = false
 364 override HAVE_GETHRTIME          = false
 365 override HAVE_GETHRVTIME         = false
 366 override HAVE_SIGIGNORE          = true
 367 override LEX_LIBRARY             = -lfl
 368 ifeq ($(STATIC_CXX),true)
 369 override LIBCXX                  = -Wl,-Bstatic -lstdc++ -lgcc -Wl,-Bdynamic
 370 else
 371 override LIBCXX                  = -lstdc++
 372 endif
 373 override LIBPOSIX4               =
 374 override LIBSOCKET               =
 375 override LIBNSL                  =
 376 override LIBSCF                  =
 377 override LIBTHREAD               =
 378 override LIBDL                   = -ldl
 379 override MOOT_PRIORITIES         = true
 380 override NO_INTERRUPTIBLE_IO     = true
 381 ifeq ($(ARCH), amd64)
 382 override OPENWIN_LIB             = $(OPENWIN_HOME)/lib64
 383 else
 384 override OPENWIN_LIB             = $(OPENWIN_HOME)/lib
 385 endif
 386 override OTHER_M4FLAGS           = -D__GLIBC__ -DGNU_ASSEMBLER
 387 override SUN_CMM_SUBDIR          =
 388 override THREADS_FLAG            = native
 389 override USE_GNU_M4              = true
 390 override USING_GNU_TAR           = true
 391 override WRITE_LIBVERSION        = false
 392 
 393 # USE_EXECNAME forces the launcher to look up argv[0] on $PATH, and put the
 394 # resulting resolved absolute name of the executable in the environment
 395 # variable EXECNAME.  That executable name is then used that to locate the
 396 # installation area.
 397 override USE_EXECNAME            = true
 398 
 399 # If your platform has DPS, it will have Type1 fonts too, in which case
 400 # it is best to enable DPS support until such time as 2D's rasteriser
 401 # can fully handle Type1 fonts in all cases. Default is "yes".
 402 # HAVE_DPS should only be "no" if the platform has no DPS headers or libs
 403 # DPS (Displayable PostScript) is available on Solaris machines
 404 HAVE_DPS = no
 405 
 406 #
 407 # Japanese manpages
 408 #
 409 JA_SOURCE_ENCODING = eucJP
 410 JA_TARGET_ENCODINGS = UTF-8
 411 
 412 # Settings for the JDI - Serviceability Agent binding.
 413 HOTSPOT_SALIB_PATH   = $(HOTSPOT_IMPORT_PATH)/jre/lib/$(LIBARCH)
 414 SALIB_NAME = $(LIB_PREFIX)saproc.$(LIBRARY_SUFFIX)
 415 SA_DEBUGINFO_NAME = $(LIB_PREFIX)saproc.debuginfo
 416 
 417 # The JDI - Serviceability Agent binding is not currently supported
 418 # on Linux-ia64.
 419 ifeq ($(ARCH), ia64)
 420   INCLUDE_SA = false
 421 else
 422   INCLUDE_SA = true
 423 endif
 424 
 425 ifdef CROSS_COMPILE_ARCH
 426   # X11 headers are not under /usr/include
 427   OTHER_CFLAGS += -I$(OPENWIN_HOME)/include
 428   OTHER_CXXFLAGS += -I$(OPENWIN_HOME)/include
 429   OTHER_CPPFLAGS += -I$(OPENWIN_HOME)/include
 430 endif