gcc.make 13.0 KB
Newer Older
D
duke 已提交
1
#
2
# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
D
duke 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 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.
#
# 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.
#
19 20 21
# 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.
D
duke 已提交
22 23 24 25
#  
#

#------------------------------------------------------------------------
26
# CC, CXX & AS
D
duke 已提交
27

28 29 30 31 32 33 34 35 36 37 38
# If a SPEC is not set already, then use these defaults.
ifeq ($(SPEC),)
  # When cross-compiling the ALT_COMPILER_PATH points
  # to the cross-compilation toolset
  ifdef CROSS_COMPILE_ARCH
    CXX = $(ALT_COMPILER_PATH)/g++
    CC  = $(ALT_COMPILER_PATH)/gcc
    HOSTCXX = g++
    HOSTCC  = gcc
    STRIP = $(ALT_COMPILER_PATH)/strip
  else
39 40 41 42 43 44 45 46
    ifeq ($(USE_CLANG), true)
      CXX = clang++
      CC  = clang
    else
      CXX = g++
      CC  = gcc
    endif

47 48 49 50 51
    HOSTCXX = $(CXX)
    HOSTCC  = $(CC)
    STRIP = strip
  endif
  AS  = $(CC) -c
52 53
endif

D
duke 已提交
54

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
ifeq ($(USE_CLANG), true)
  CC_VER_MAJOR := $(shell $(CC) -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/" | cut -d'.' -f1)
  CC_VER_MINOR := $(shell $(CC) -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/" | cut -d'.' -f2)
else
  # -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
  # prints the numbers (e.g. "2.95", "3.2.1")
  CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
  CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
endif


ifeq ($(USE_CLANG), true)
  # Clang has precompiled headers support by default, but the user can switch
  # it off by using 'USE_PRECOMPILED_HEADER=0'.
  ifdef LP64
    ifeq ($(USE_PRECOMPILED_HEADER),)
      USE_PRECOMPILED_HEADER=1
    endif
  else
    # We don't support precompiled headers on 32-bit builds because there some files are
    # compiled with -fPIC while others are compiled without (see 'NONPIC_OBJ_FILES' rules.make)
    # Clang produces an error if the PCH file was compiled with other options than the actual compilation unit.
    USE_PRECOMPILED_HEADER=0
  endif

  ifeq ($(USE_PRECOMPILED_HEADER),1)

    ifndef LP64
      $(error " Precompiled Headers only supported on 64-bit platforms!")
    endif

    PRECOMPILED_HEADER_DIR=.
    PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
    PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.pch
D
duke 已提交
89

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
    PCH_FLAG = -include precompiled.hpp
    PCH_FLAG/DEFAULT = $(PCH_FLAG)
    PCH_FLAG/NO_PCH = -DNO_PCH
    PCH_FLAG/BY_FILE = $(PCH_FLAG/$@)$(PCH_FLAG/DEFAULT$(PCH_FLAG/$@))

    VM_PCH_FLAG/LIBJVM = $(PCH_FLAG/BY_FILE)
    VM_PCH_FLAG/AOUT =
    VM_PCH_FLAG = $(VM_PCH_FLAG/$(LINK_INTO))

    # We only use precompiled headers for the JVM build
    CFLAGS += $(VM_PCH_FLAG)

    # There are some files which don't like precompiled headers
    # The following files are build with 'OPT_CFLAGS/NOOPT' (-O0) in the opt build.
    # But Clang doesn't support a precompiled header which was compiled with -O3
    # to be used in a compilation unit which uses '-O0'. We could also prepare an
    # extra '-O0' PCH file for the opt build and use it here, but it's probably
    # not worth the effoert as long as only two files need this special handling.
    PCH_FLAG/loopTransform.o = $(PCH_FLAG/NO_PCH)
    PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
    PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)

  endif
else # ($(USE_CLANG), true)
  # check for precompiled headers support
  ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 4 \) \))" "0"
    # Allow the user to turn off precompiled headers from the command line.
    ifneq ($(USE_PRECOMPILED_HEADER),0)
      PRECOMPILED_HEADER_DIR=.
      PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
      PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.gch
    endif
  endif
D
duke 已提交
123
endif
124 125 126 127

# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
ifeq ($(USE_PRECOMPILED_HEADER),0)
  CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
128
endif
D
duke 已提交
129 130 131 132 133 134 135 136 137 138 139 140


#------------------------------------------------------------------------
# Compiler flags

# position-independent code
PICFLAG = -fPIC

VM_PICFLAG/LIBJVM = $(PICFLAG)
VM_PICFLAG/AOUT   =
VM_PICFLAG        = $(VM_PICFLAG/$(LINK_INTO))

141
ifeq ($(JVM_VARIANT_ZERO), true)
142 143
CFLAGS += $(LIBFFI_CFLAGS)
endif
144 145
ifeq ($(JVM_VARIANT_ZEROSHARK), true)
CFLAGS += $(LIBFFI_CFLAGS)
146 147
CFLAGS += $(LLVM_CFLAGS)
endif
D
duke 已提交
148 149 150 151
CFLAGS += $(VM_PICFLAG)
CFLAGS += -fno-rtti
CFLAGS += -fno-exceptions
CFLAGS += -D_REENTRANT
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
ifeq ($(USE_CLANG),)
  CFLAGS += -fcheck-new
  # version 4 and above support fvisibility=hidden (matches jni_x86.h file)
  # except 4.1.2 gives pointless warnings that can't be disabled (afaik)
  ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
    CFLAGS += -fvisibility=hidden
  endif
else
  CFLAGS += -fvisibility=hidden
endif

ifeq ($(USE_CLANG), true)
  # Before Clang 3.1, we had to pass the stack alignment specification directly to llvm with the help of '-mllvm'
  # Starting with version 3.1, Clang understands the '-mstack-alignment' (and rejects '-mllvm -stack-alignment')
  ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 1 \) \))" "0"
    STACK_ALIGNMENT_OPT = -mno-omit-leaf-frame-pointer -mstack-alignment=16
  else
    STACK_ALIGNMENT_OPT = -mno-omit-leaf-frame-pointer -mllvm -stack-alignment=16
  endif
171
endif
D
duke 已提交
172 173 174

ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
ARCHFLAG/i486    = -m32 -march=i586
175
ARCHFLAG/amd64   = -m64 $(STACK_ALIGNMENT_OPT)
D
duke 已提交
176 177 178
ARCHFLAG/ia64    =
ARCHFLAG/sparc   = -m32 -mcpu=v9
ARCHFLAG/sparcv9 = -m64 -mcpu=v9
179
ARCHFLAG/zero    = $(ZERO_ARCHFLAG)
180
ARCHFLAG/ppc64   =  -m64
D
duke 已提交
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

CFLAGS     += $(ARCHFLAG)
AOUT_FLAGS += $(ARCHFLAG)
LFLAGS     += $(ARCHFLAG)
ASFLAGS    += $(ARCHFLAG)

# Use C++ Interpreter
ifdef CC_INTERP
  CFLAGS += -DCC_INTERP
endif

# Keep temporary files (.ii, .s)
ifdef NEED_ASM
  CFLAGS += -save-temps
else
  CFLAGS += -pipe
endif

# Compiler warnings are treated as errors
WARNINGS_ARE_ERRORS = -Werror
201

202 203
ifeq ($(USE_CLANG), true)
  # However we need to clean the code up before we can unrestrictedly enable this option with Clang
204
  WARNINGS_ARE_ERRORS += -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
205 206 207 208 209
  WARNINGS_ARE_ERRORS += -Wno-switch -Wno-tautological-constant-out-of-range-compare -Wno-tautological-compare
  WARNINGS_ARE_ERRORS += -Wno-delete-non-virtual-dtor -Wno-deprecated -Wno-format -Wno-dynamic-class-memaccess
  WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
endif

210
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef -Wunused-function -Wunused-value
211

212 213 214 215 216 217
ifeq ($(USE_CLANG),)
  # Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
  # conversions which might affect the values. Only enable it in earlier versions.
  ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
    WARNING_FLAGS += -Wconversion
  endif
218 219
endif

220
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
D
duke 已提交
221 222 223 224
# Special cases
CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) 

# The flags to use for an Optimized g++ build
225 226
OPT_CFLAGS/SIZE=-Os
OPT_CFLAGS/SPEED=-O3
D
duke 已提交
227 228

# Hotspot uses very unstrict aliasing turn this optimization off
229 230 231 232 233 234 235 236 237 238 239 240 241
# This option is added to CFLAGS rather than OPT_CFLAGS
# so that OPT_CFLAGS overrides get this option too.
CFLAGS += -fno-strict-aliasing 

OPT_CFLAGS_DEFAULT ?= SPEED

ifdef OPT_CFLAGS
  ifneq ("$(origin OPT_CFLAGS)", "command line")
    $(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.")
  endif
endif

OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS)
D
duke 已提交
242 243 244 245 246 247 248 249 250

# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp 
# if we use expensive-optimizations
ifeq ($(BUILDARCH), ia64)
OPT_CFLAGS += -fno-expensive-optimizations
endif

OPT_CFLAGS/NOOPT=-O0

251 252 253 254 255 256 257 258 259 260
# Work around some compiler bugs.
ifeq ($(USE_CLANG), true)
  ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
    OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
  endif
else
  # 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
  ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 3), 1)
    OPT_CFLAGS/mulnode.o += $(OPT_CFLAGS/NOOPT)
  endif
261 262
endif

263
# Flags for generating make dependency flags.
264 265 266 267 268
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
ifeq ($(USE_CLANG),)
  ifneq ("${CC_VER_MAJOR}", "2")
    DEPFLAGS += -fpch-deps
  endif
269 270
endif

D
duke 已提交
271 272 273 274 275 276
#------------------------------------------------------------------------
# Linker flags

# statically link libstdc++.so, work with gcc but ignored by g++
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic

277 278 279 280 281
ifeq ($(USE_CLANG),)
  # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
  ifneq ("${CC_VER_MAJOR}", "2")
    STATIC_LIBGCC += -static-libgcc
  endif
D
duke 已提交
282

283 284 285
  ifeq ($(BUILDARCH), ia64)
    LFLAGS += -Wl,-relax
  endif
D
duke 已提交
286 287 288 289 290
endif

# Enable linker optimization
LFLAGS += -Xlinker -O1

291 292 293 294 295 296 297 298 299 300
ifeq ($(USE_CLANG),)
  # If this is a --hash-style=gnu system, use --hash-style=both
  #   The gnu .hash section won't work on some Linux systems like SuSE 10.
  _HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
  ifneq ($(_HAS_HASH_STYLE_GNU),)
    LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
  endif
else
  # Don't know how to find out the 'hash style' of a system as '-dumpspecs'
  # doesn't work for Clang. So for now we'll alwys use --hash-style=both
301 302
  LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
endif
303

304 305
LFLAGS += $(LDFLAGS_HASH_STYLE)

D
duke 已提交
306 307 308 309 310 311 312 313 314 315
# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
MAPFLAG = -Xlinker --version-script=FILENAME

# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
SONAMEFLAG = -Xlinker -soname=SONAME

# Build shared library
SHARED_FLAG = -shared

# Keep symbols even they are not used
316
AOUT_FLAGS += -Xlinker -export-dynamic
D
duke 已提交
317 318 319 320

#------------------------------------------------------------------------
# Debug flags

321 322 323 324 325 326 327
ifeq ($(USE_CLANG), true)
  # Restrict the debug information created by Clang to avoid
  # too big object files and speed the build up a little bit
  # (see http://llvm.org/bugs/show_bug.cgi?id=7554)
  CFLAGS += -flimit-debug-info
endif

328 329 330 331 332 333
# DEBUG_BINARIES uses full -g debug information for all configs
ifeq ($(DEBUG_BINARIES), true)
  CFLAGS += -g
else
  # Use the stabs format for debugging information (this is the default
  # on gcc-2.91). It's good enough, has all the information about line
334
  # numbers and local variables, and libjvm.so is only about 16M.
335
  # Change this back to "-g" if you want the most expressive format.
336
  # (warning: that could easily inflate libjvm.so to 150M!)
337 338 339
  # Note: The Itanium gcc compiler crashes when using -gstabs.
  DEBUG_CFLAGS/ia64  = -g
  DEBUG_CFLAGS/amd64 = -g
340
  DEBUG_CFLAGS/ppc64 = -g
341 342
  DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
  ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
343 344
      ifeq ($(USE_CLANG), true)
        # Clang doesn't understand -gstabs
D
dlong 已提交
345
        DEBUG_CFLAGS/$(BUILDARCH) = -g
346
      else
D
dlong 已提交
347
        DEBUG_CFLAGS/$(BUILDARCH) = -gstabs
348
      endif
349
  endif
350 351 352 353
  
  ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
    FASTDEBUG_CFLAGS/ia64  = -g
    FASTDEBUG_CFLAGS/amd64 = -g
354
    FASTDEBUG_CFLAGS/ppc64 = -g
D
dlong 已提交
355
    FASTDEBUG_CFLAGS += $(FASTDEBUG_CFLAGS/$(BUILDARCH))
356
    ifeq ($(FASTDEBUG_CFLAGS/$(BUILDARCH)),)
357 358
      ifeq ($(USE_CLANG), true)
        # Clang doesn't understand -gstabs
D
dlong 已提交
359
        FASTDEBUG_CFLAGS/$(BUILDARCH) = -g
360
      else
D
dlong 已提交
361
        FASTDEBUG_CFLAGS/$(BUILDARCH) = -gstabs
362
      endif
363 364 365 366
    endif
  
    OPT_CFLAGS/ia64  = -g
    OPT_CFLAGS/amd64 = -g
367
    OPT_CFLAGS/ppc64 = -g
368 369
    OPT_CFLAGS += $(OPT_CFLAGS/$(BUILDARCH))
    ifeq ($(OPT_CFLAGS/$(BUILDARCH)),)
370 371
      ifeq ($(USE_CLANG), true)
        # Clang doesn't understand -gstabs
D
dlong 已提交
372
        OPT_CFLAGS/$(BUILDARCH) = -g
373
      else
D
dlong 已提交
374
        OPT_CFLAGS/$(BUILDARCH) = -gstabs
375
      endif
376
    endif
377 378 379
  endif
endif

380 381 382 383 384 385 386 387 388 389 390
# If we are building HEADLESS, pass on to VM
# so it can set the java.awt.headless property
ifdef HEADLESS
CFLAGS += -DHEADLESS
endif

# We are building Embedded for a small device
# favor code space over speed
ifdef MINIMIZE_RAM_USAGE
CFLAGS += -DMINIMIZE_RAM_USAGE
endif
391 392 393 394 395 396 397

# Stack walking in the JVM relies on frame pointer (%rbp) to walk thread stack.
# Explicitly specify -fno-omit-frame-pointer because it is off by default
# starting with gcc 4.6.
ifndef USE_SUNCC
  CFLAGS += -fno-omit-frame-pointer
endif
398 399

-include $(HS_ALT_MAKE)/linux/makefiles/gcc.make