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

OS_VENDOR = $(shell uname -s)

#------------------------------------------------------------------------
28
# CC, CXX & AS
N
never 已提交
29

30 31 32 33 34 35 36 37 38 39 40 41 42 43
# 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
  else ifneq ($(OS_VENDOR), Darwin)
    CXX = g++
    CC  = gcc
    HOSTCXX = $(CXX)
    HOSTCC  = $(CC)
D
dcubed 已提交
44 45
  endif

46 47 48 49 50 51 52 53 54 55 56
  # i486 hotspot requires -mstackrealign on Darwin.
  # llvm-gcc supports this in Xcode 3.2.6 and 4.0.
  # gcc-4.0 supports this on earlier versions.
  # Prefer llvm-gcc where available.
  ifeq ($(OS_VENDOR), Darwin)
    ifeq ($(origin CXX), default)
      CXX = llvm-g++
    endif
    ifeq ($(origin CC), default)
      CC  = llvm-gcc
    endif
D
dcubed 已提交
57

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    ifeq ($(ARCH), i486)
      LLVM_SUPPORTS_STACKREALIGN := $(shell \
       [ "0"`llvm-gcc -v 2>&1 | grep LLVM | sed -E "s/.*LLVM build ([0-9]+).*/\1/"` -gt "2333" ] \
       && echo true || echo false)

      ifeq ($(LLVM_SUPPORTS_STACKREALIGN), true)
        CXX32 ?= llvm-g++
        CC32  ?= llvm-gcc
      else
        CXX32 ?= g++-4.0
        CC32  ?= gcc-4.0
      endif
      CXX = $(CXX32)
      CC  = $(CC32)
    endif

74 75 76 77 78
    ifeq ($(USE_CLANG), true)
      CXX = clang++
      CC  = clang
    endif

79 80
    HOSTCXX = $(CXX)
    HOSTCC  = $(CC)
D
dcubed 已提交
81 82
  endif

83
  AS   = $(CC) -c -x assembler-with-cpp
N
never 已提交
84 85 86
endif


87 88 89 90 91 92 93 94
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)
N
never 已提交
95
endif
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 123 124 125 126 127 128 129 130 131

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
  
    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)
132 133 134 135 136 137 138 139 140 141 142
 
    # The following files are compiled at various optimization
    # levels due to optimization issues encountered at the
    # 'OPT_CFLAGS_DEFAULT' level. The Clang compiler issues a compile
    # time error if there is an optimization level specification
    # skew between the PCH file and the C++ file.  Especially if the
    # PCH file is compiled at a higher optimization level than
    # the C++ file.  One solution might be to prepare extra optimization
    # level specific PCH files for the opt build and use them here, but
    # it's probably not worth the effort as long as only a few files
    # need this special handling.
143 144 145
    PCH_FLAG/loopTransform.o = $(PCH_FLAG/NO_PCH)
    PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
    PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)
146
    PCH_FLAG/unsafe.o = $(PCH_FLAG/NO_PCH)
147 148 149 150 151 152 153 154 155 156 157 158
  
  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
N
never 已提交
159 160
endif

161 162 163 164
# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
ifeq ($(USE_PRECOMPILED_HEADER),0)
  CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
endif
N
never 已提交
165 166 167 168 169 170 171 172 173 174 175

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

# position-independent code
PICFLAG = -fPIC

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

176 177
ifeq ($(JVM_VARIANT_ZERO), true)
  CFLAGS += $(LIBFFI_CFLAGS)
N
never 已提交
178
endif
179 180 181
ifeq ($(JVM_VARIANT_ZEROSHARK), true)
  CFLAGS += $(LIBFFI_CFLAGS)
  CFLAGS += $(LLVM_CFLAGS)
N
never 已提交
182 183 184 185
endif
CFLAGS += $(VM_PICFLAG)
CFLAGS += -fno-rtti
CFLAGS += -fno-exceptions
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
ifeq ($(USE_CLANG),)
  CFLAGS += -pthread
  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
N
never 已提交
206 207 208 209
endif

ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
ARCHFLAG/i486    = -m32 -march=i586
210
ARCHFLAG/amd64   = -m64 $(STACK_ALIGNMENT_OPT)
N
never 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
ARCHFLAG/ia64    =
ARCHFLAG/sparc   = -m32 -mcpu=v9
ARCHFLAG/sparcv9 = -m64 -mcpu=v9
ARCHFLAG/zero    = $(ZERO_ARCHFLAG)

# Darwin-specific build flags
ifeq ($(OS_VENDOR), Darwin)
  # Ineffecient 16-byte stack re-alignment on Darwin/IA32
  ARCHFLAG/i486 += -mstackrealign
endif

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

ifdef E500V2
CFLAGS += -DE500V2
endif

# 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
D
dcubed 已提交
244 245 246
ifneq ($(COMPILER_WARNINGS_FATAL),false)
  WARNINGS_ARE_ERRORS = -Werror
endif
N
never 已提交
247

248 249 250 251 252 253 254
ifeq ($(USE_CLANG), true)
  # However we need to clean the code up before we can unrestrictedly enable this option with Clang
  WARNINGS_ARE_ERRORS += -Wno-unused-value -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
  WARNINGS_ARE_ERRORS += -Wno-switch -Wno-tautological-compare
# Not yet supported by clang in Xcode 4.6.2
#  WARNINGS_ARE_ERRORS += -Wno-tautological-constant-out-of-range-compare
  WARNINGS_ARE_ERRORS += -Wno-delete-non-virtual-dtor -Wno-deprecated -Wno-format -Wno-dynamic-class-memaccess
255
  WARNINGS_ARE_ERRORS += -Wno-empty-body
256 257
endif

258
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef
259 260 261 262 263 264 265 266

ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
  # 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.
  WARNING_FLAGS = -Wunused-function
  ifeq ($(USE_CLANG),)
    WARNINGS_FLAGS += -Wconversion
  endif
N
never 已提交
267 268
endif

269
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
N
never 已提交
270 271 272 273 274 275 276
# Special cases
CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) 
# XXXDARWIN: for _dyld_bind_fully_image_containing_address
ifeq ($(OS_VENDOR), Darwin)
  CFLAGS_WARN/os_bsd.o = $(CFLAGS_WARN/DEFAULT) -Wno-deprecated-declarations
endif

277 278 279 280 281 282 283
OPT_CFLAGS/SIZE=-Os
OPT_CFLAGS/SPEED=-O3

# Hotspot uses very unstrict aliasing turn this optimization off
# This option is added to CFLAGS rather than OPT_CFLAGS
# so that OPT_CFLAGS overrides get this option too.
CFLAGS += -fno-strict-aliasing
N
never 已提交
284 285

# The flags to use for an Optimized g++ build
D
dcubed 已提交
286 287 288
ifeq ($(OS_VENDOR), Darwin)
  # use -Os by default, unless -O3 can be proved to be worth the cost, as per policy
  # <http://wikis.sun.com/display/OpenJDK/Mac+OS+X+Port+Compilers>
289
  OPT_CFLAGS_DEFAULT ?= SIZE
D
dcubed 已提交
290
else
291
  OPT_CFLAGS_DEFAULT ?= SPEED
D
dcubed 已提交
292
endif
N
never 已提交
293

294 295 296 297 298 299 300
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)
N
never 已提交
301

302
# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
N
never 已提交
303 304 305 306 307 308 309
# if we use expensive-optimizations
ifeq ($(BUILDARCH), ia64)
OPT_CFLAGS += -fno-expensive-optimizations
endif

OPT_CFLAGS/NOOPT=-O0

310 311 312 313
# 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)
314
    OPT_CFLAGS/unsafe.o += -O1
315 316 317 318 319 320
  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
N
never 已提交
321 322 323
endif

# Flags for generating make dependency flags.
324 325 326 327 328
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
ifeq ($(USE_CLANG),)
  ifneq ($(CC_VER_MAJOR), 2)
    DEPFLAGS += -fpch-deps
  endif
N
never 已提交
329 330 331
endif

# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
332
ifeq ($(USE_PRECOMPILED_HEADER),0)
N
never 已提交
333 334 335
CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
endif

336 337 338 339 340 341 342 343 344 345 346 347 348 349
ifeq ($(OS_VENDOR), Darwin)
  # Setting these parameters makes it an error to link to macosx APIs that are 
  # newer than the given OS version and makes the linked binaries compatible even
  # if built on a newer version of the OS.
  # The expected format is X.Y.Z
  ifeq ($(MACOSX_VERSION_MIN),)
    MACOSX_VERSION_MIN=10.7.0
  endif
  # The macro takes the version with no dots, ex: 1070
  CFLAGS += -DMAC_OS_X_VERSION_MAX_ALLOWED=$(subst .,,$(MACOSX_VERSION_MIN)) \
            -mmacosx-version-min=$(MACOSX_VERSION_MIN)
  LDFLAGS += -mmacosx-version-min=$(MACOSX_VERSION_MIN)
endif

N
never 已提交
350 351 352 353 354 355
#------------------------------------------------------------------------
# Linker flags

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

356 357 358 359 360
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
N
never 已提交
361

362 363 364
  ifeq ($(BUILDARCH), ia64)
    LFLAGS += -Wl,-relax
  endif
N
never 已提交
365 366 367 368 369 370 371 372 373 374 375 376
endif

# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
MAPFLAG = -Xlinker --version-script=FILENAME

#
# Shared Library
#
ifeq ($(OS_VENDOR), Darwin)
  # Standard linker flags
  LFLAGS +=

377 378
  # The apple linker has its own variant of mapfiles/version-scripts
  MAPFLAG = -Xlinker -exported_symbols_list -Xlinker FILENAME
N
never 已提交
379 380 381 382 383

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

  # Build shared library
D
dcubed 已提交
384
  SHARED_FLAG = -Wl,-install_name,@rpath/$(@F) -dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $(VM_PICFLAG)
N
never 已提交
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404

  # Keep symbols even they are not used
  #AOUT_FLAGS += -Xlinker -export-dynamic
else
  # Enable linker optimization
  LFLAGS += -Xlinker -O1

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

  # Build shared library
  SHARED_FLAG = -shared $(VM_PICFLAG)

  # Keep symbols even they are not used
  AOUT_FLAGS += -Xlinker -export-dynamic
endif

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

405 406 407 408 409
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
N
never 已提交
410 411
endif

412
# DEBUG_BINARIES uses full -g debug information for all configs
N
never 已提交
413
ifeq ($(DEBUG_BINARIES), true)
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
  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
  # numbers and local variables, and libjvm.so is only about 16M.
  # Change this back to "-g" if you want the most expressive format.
  # (warning: that could easily inflate libjvm.so to 150M!)
  # Note: The Itanium gcc compiler crashes when using -gstabs.
  DEBUG_CFLAGS/ia64  = -g
  DEBUG_CFLAGS/amd64 = -g
  DEBUG_CFLAGS/arm   = -g
  DEBUG_CFLAGS/ppc   = -g
  DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
  ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
  DEBUG_CFLAGS += -gstabs
  endif
N
never 已提交
430 431 432 433 434 435 436 437 438 439 440 441 442
endif

# 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