Makefile 17.3 KB
Newer Older
1
# Copyright 2012 the V8 project authors. All rights reserved.
2 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 28 29 30
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of Google Inc. nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


# Variable default definitions. Override them by exporting them in your shell.
OUTDIR ?= out
31
TESTJOBS ?=
32
GYPFLAGS ?=
33
TESTFLAGS ?=
34
ANDROID_NDK_HOST_ARCH ?=
35
ANDROID_V8 ?= /data/local/tmp/v8
36 37 38 39 40 41 42 43 44 45 46 47 48 49

# Special build flags. Use them like this: "make library=shared"

# library=shared || component=shared_library
ifeq ($(library), shared)
  GYPFLAGS += -Dcomponent=shared_library
endif
ifdef component
  GYPFLAGS += -Dcomponent=$(component)
endif
# disassembler=on
ifeq ($(disassembler), on)
  GYPFLAGS += -Dv8_enable_disassembler=1
endif
50 51 52 53
# objectprint=on
ifeq ($(objectprint), on)
  GYPFLAGS += -Dv8_object_print=1
endif
54 55 56 57
# verifyheap=on
ifeq ($(verifyheap), on)
  GYPFLAGS += -Dv8_enable_verify_heap=1
endif
58 59 60 61
# tracemaps=on
ifeq ($(tracemaps), on)
  GYPFLAGS += -Dv8_trace_maps=1
endif
62 63 64 65 66 67
# backtrace=off
ifeq ($(backtrace), off)
  GYPFLAGS += -Dv8_enable_backtrace=0
else
  GYPFLAGS += -Dv8_enable_backtrace=1
endif
68 69 70 71
# verifypredictable=on
ifeq ($(verifypredictable), on)
  GYPFLAGS += -Dv8_enable_verify_predictable=1
endif
72 73 74 75
# snapshot=off
ifeq ($(snapshot), off)
  GYPFLAGS += -Dv8_use_snapshot='false'
endif
76 77 78
ifeq ($(snapshot), external)
  GYPFLAGS += -Dv8_use_external_startup_data=1
endif
79 80
# extrachecks=on/off
ifeq ($(extrachecks), on)
jochen's avatar
jochen committed
81
  GYPFLAGS += -Ddcheck_always_on=1 -Dv8_enable_handle_zapping=1
82 83
endif
ifeq ($(extrachecks), off)
jochen's avatar
jochen committed
84
  GYPFLAGS += -Ddcheck_always_on=0 -Dv8_enable_handle_zapping=0
85
endif
86 87 88 89 90 91 92
# slowdchecks=on/off
ifeq ($(slowdchecks), on)
  GYPFLAGS += -Dv8_enable_slow_dchecks=1
endif
ifeq ($(slowdchecks), off)
  GYPFLAGS += -Dv8_enable_slow_dchecks=0
endif
93 94 95 96
# debugsymbols=on
ifeq ($(debugsymbols), on)
  GYPFLAGS += -Drelease_extra_cflags=-ggdb3
endif
97
# gdbjit=on/off
98 99 100
ifeq ($(gdbjit), on)
  GYPFLAGS += -Dv8_enable_gdbjit=1
endif
101 102 103
ifeq ($(gdbjit), off)
  GYPFLAGS += -Dv8_enable_gdbjit=0
endif
104 105 106 107
# vtunejit=on
ifeq ($(vtunejit), on)
  GYPFLAGS += -Dv8_enable_vtunejit=1
endif
108 109 110 111
# unalignedaccess=on
ifeq ($(unalignedaccess), on)
  GYPFLAGS += -Dv8_can_use_unaligned_accesses=true
endif
112 113 114 115
# randomseed=12345, disable random seed via randomseed=0
ifdef randomseed
  GYPFLAGS += -Dv8_random_seed=$(randomseed)
endif
116 117 118 119
# soname_version=1.2.3
ifdef soname_version
  GYPFLAGS += -Dsoname_version=$(soname_version)
endif
120 121 122 123
# werror=no
ifeq ($(werror), no)
  GYPFLAGS += -Dwerror=''
endif
124 125 126 127
# strictaliasing=off (workaround for GCC-4.5)
ifeq ($(strictaliasing), off)
  GYPFLAGS += -Dv8_no_strict_aliasing=1
endif
128 129 130 131
# regexp=interpreted
ifeq ($(regexp), interpreted)
  GYPFLAGS += -Dv8_interpreted_regexp=1
endif
132 133 134 135
# i18nsupport=off
ifeq ($(i18nsupport), off)
  GYPFLAGS += -Dv8_enable_i18n_support=0
  TESTFLAGS += --noi18n
136
endif
137
# deprecationwarnings=on
138 139
ifeq ($(deprecationwarnings), on)
  GYPFLAGS += -Dv8_deprecation_warnings=1
140
endif
141 142 143 144
# vectorstores=on
ifeq ($(vectorstores), on)
  GYPFLAGS += -Dv8_vector_stores=1
endif
145 146 147 148
# imminentdeprecationwarnings=on
ifeq ($(imminentdeprecationwarnings), on)
  GYPFLAGS += -Dv8_imminent_deprecation_warnings=1
endif
149 150 151
# asan=on
ifeq ($(asan), on)
  GYPFLAGS += -Dasan=1 -Dclang=1
152 153 154 155
  TESTFLAGS += --asan
  ifeq ($(lsan), on)
    GYPFLAGS += -Dlsan=1
  endif
156
endif
157 158 159
ifdef embedscript
  GYPFLAGS += -Dembed_script=$(embedscript)
endif
160 161 162
ifdef warmupscript
  GYPFLAGS += -Dwarmup_script=$(warmupscript)
endif
163 164 165
ifeq ($(goma), on)
  GYPFLAGS += -Duse_goma=1
endif
166 167 168 169 170 171 172 173
# v8_os_page_size=0, when 0 or not specified use build OS page size
ifdef v8_os_page_size
  ifneq ($(v8_os_page_size), 0)
    ifneq ($(snapshot), off)
      GYPFLAGS += -Dv8_os_page_size=$(v8_os_page_size)
    endif
  endif
endif
174
# arm specific flags.
175 176 177 178 179
# arm_version=<number | "default">
ifneq ($(strip $(arm_version)),)
  GYPFLAGS += -Darm_version=$(arm_version)
else
# Deprecated (use arm_version instead): armv7=false/true
180
ifeq ($(armv7), false)
181
  GYPFLAGS += -Darm_version=6
182 183
else
ifeq ($(armv7), true)
184 185
  GYPFLAGS += -Darm_version=7
endif
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
endif
endif
# hardfp=on/off. Deprecated, use armfloatabi
ifeq ($(hardfp),on)
  GYPFLAGS += -Darm_float_abi=hard
else
ifeq ($(hardfp),off)
  GYPFLAGS += -Darm_float_abi=softfp
endif
endif
# fpu: armfpu=xxx
# xxx: vfp, vfpv3-d16, vfpv3, neon.
ifeq ($(armfpu),)
  GYPFLAGS += -Darm_fpu=default
else
  GYPFLAGS += -Darm_fpu=$(armfpu)
endif
# float abi: armfloatabi=softfp/hard
ifeq ($(armfloatabi),)
ifeq ($(hardfp),)
  GYPFLAGS += -Darm_float_abi=default
endif
else
  GYPFLAGS += -Darm_float_abi=$(armfloatabi)
endif
# armthumb=on/off
ifeq ($(armthumb), off)
  GYPFLAGS += -Darm_thumb=0
else
ifeq ($(armthumb), on)
  GYPFLAGS += -Darm_thumb=1
endif
endif
219
# arm_test_noprobe=on
220 221
# With this flag set, by default v8 will only use features implied
# by the compiler (no probe). This is done by modifying the default
222
# values of enable_armv7, enable_vfp3, enable_32dregs and enable_neon.
223 224
# Modifying these flags when launching v8 will enable the probing for
# the specified values.
225 226
ifeq ($(arm_test_noprobe), on)
  GYPFLAGS += -Darm_test_noprobe=on
227
endif
228 229 230 231
# Do not omit the frame pointer, needed for profiling with perf
ifeq ($(no_omit_framepointer), on)
  GYPFLAGS += -Drelease_extra_cflags=-fno-omit-frame-pointer
endif
232

233 234 235 236 237
ifdef android_ndk_root
  GYPFLAGS += -Dandroid_ndk_root=$(android_ndk_root)
  export ANDROID_NDK_ROOT = $(android_ndk_root)
endif

238
# ----------------- available targets: --------------------
239
# - "grokdump": rebuilds heap constants lists used by grokdump
240 241 242
# - any arch listed in ARCHES (see below)
# - any mode listed in MODES
# - every combination <arch>.<mode>, e.g. "ia32.release"
243
# - "native": current host's architecture, release mode
244
# - any of the above with .check appended, e.g. "ia32.release.check"
245
# - "android": cross-compile for Android/ARM
246
# - default (no target specified): build all DEFAULT_ARCHES and MODES
247 248 249 250 251 252 253 254
# - "check": build all targets and run all tests
# - "<arch>.clean" for any <arch> in ARCHES
# - "clean": clean all ARCHES

# ----------------- internal stuff ------------------------

# Architectures and modes to be compiled. Consider these to be internal
# variables, don't override them (use the targets instead).
255 256 257
ARCHES = ia32 x64 arm arm64 mips mipsel mips64 mips64el x87 ppc ppc64 s390 \
         s390x
ARCHES32 = ia32 arm mips mipsel x87 ppc s390
258
DEFAULT_ARCHES = ia32 x64 arm
259 260
MODES = release debug optdebug
DEFAULT_MODES = release debug
261 262
ANDROID_ARCHES = android_ia32 android_x64 android_arm android_arm64 \
		 android_mipsel android_x87
263 264

# List of files that trigger Makefile regeneration:
265
GYPFILES = third_party/icu/icu.gypi third_party/icu/icu.gyp \
266 267 268
	   gypfiles/shim_headers.gypi gypfiles/features.gypi \
           gypfiles/standalone.gypi \
	   gypfiles/toolchain.gypi gypfiles/all.gyp gypfiles/mac/asan.gyp \
269
	   test/cctest/cctest.gyp test/fuzzer/fuzzer.gyp \
270
	   test/unittests/unittests.gyp src/v8.gyp \
271 272 273 274
	   tools/parser-shell.gyp testing/gmock.gyp testing/gtest.gyp \
	   buildtools/third_party/libc++abi/libc++abi.gyp \
	   buildtools/third_party/libc++/libc++.gyp samples/samples.gyp \
	   src/third_party/vtune/v8vtune.gyp src/d8.gyp
275

276 277 278 279
# If vtunejit=on, the v8vtune.gyp will be appended.
ifeq ($(vtunejit), on)
  GYPFILES += src/third_party/vtune/v8vtune.gyp
endif
280 281
# Generates all combinations of ARCHES and MODES, e.g. "ia32.release".
BUILDS = $(foreach mode,$(MODES),$(addsuffix .$(mode),$(ARCHES)))
282 283
ANDROID_BUILDS = $(foreach mode,$(MODES), \
                   $(addsuffix .$(mode),$(ANDROID_ARCHES)))
284
# Generates corresponding test targets, e.g. "ia32.release.check".
285
CHECKS = $(addsuffix .check,$(BUILDS))
286
QUICKCHECKS = $(addsuffix .quickcheck,$(BUILDS))
287
ANDROID_CHECKS = $(addsuffix .check,$(ANDROID_BUILDS))
288 289
# File where previously used GYPFLAGS are stored.
ENVFILE = $(OUTDIR)/environment
290

291
.PHONY: all check clean builddeps dependencies $(ENVFILE).new native \
292
        qc quickcheck $(QUICKCHECKS) turbocheck \
293
        $(addsuffix .quickcheck,$(MODES)) $(addsuffix .quickcheck,$(ARCHES)) \
294
        $(ARCHES) $(MODES) $(BUILDS) $(CHECKS) $(addsuffix .clean,$(ARCHES)) \
295
        $(addsuffix .check,$(MODES)) $(addsuffix .check,$(ARCHES)) \
yangguo's avatar
yangguo committed
296
        $(ANDROID_ARCHES) $(ANDROID_BUILDS) $(ANDROID_CHECKS)
297

298
# Target definitions. "all" is the default.
299
all: $(DEFAULT_MODES)
300

301 302
# Special target for the buildbots to use. Depends on $(OUTDIR)/Makefile
# having been created before.
303
buildbot:
304 305 306
	$(MAKE) -C "$(OUTDIR)" BUILDTYPE=$(BUILDTYPE) \
	        builddir="$(abspath $(OUTDIR))/$(BUILDTYPE)"

307 308
# Compile targets. MODES and ARCHES are convenience targets.
.SECONDEXPANSION:
309
$(MODES): $(addsuffix .$$@,$(DEFAULT_ARCHES))
310

311
$(ARCHES): $(addprefix $$@.,$(DEFAULT_MODES))
312

313
# Defines how to build a particular target (e.g. ia32.release).
314
$(BUILDS): $(OUTDIR)/Makefile.$$@
315
	@$(MAKE) -C "$(OUTDIR)" -f Makefile.$@ \
316
	         BUILDTYPE=$(shell echo $(subst .,,$(suffix $@)) | \
317 318
	                     python -c "print \
	                     raw_input().replace('opt', '').capitalize()") \
319 320
	         builddir="$(shell pwd)/$(OUTDIR)/$@"

321
native: $(OUTDIR)/Makefile.native
322
	@$(MAKE) -C "$(OUTDIR)" -f Makefile.native \
323
	         BUILDTYPE=Release \
324 325
	         builddir="$(shell pwd)/$(OUTDIR)/$@"

326
$(ANDROID_ARCHES): $(addprefix $$@.,$(MODES))
327

328
$(ANDROID_BUILDS): $(GYPFILES) $(ENVFILE) Makefile.android
329 330 331 332 333
	@$(MAKE) -f Makefile.android $@ \
	        ARCH="$(basename $@)" \
	        MODE="$(subst .,,$(suffix $@))" \
	        OUTDIR="$(OUTDIR)" \
	        GYPFLAGS="$(GYPFLAGS)"
334

335 336
# Test targets.
check: all
337
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
338
	    --arch=$(shell echo $(DEFAULT_ARCHES) | sed -e 's/ /,/g') \
339
	    $(TESTFLAGS)
340

341
$(addsuffix .check,$(MODES)): $$(basename $$@)
342
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
343
	    --mode=$(basename $@) $(TESTFLAGS)
344 345

$(addsuffix .check,$(ARCHES)): $$(basename $$@)
346
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
347
	    --arch=$(basename $@) $(TESTFLAGS)
348 349

$(CHECKS): $$(basename $$@)
350
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
351
	    --arch-and-mode=$(basename $@) $(TESTFLAGS)
352

353 354 355 356 357 358 359 360 361 362 363 364
$(addsuffix .quickcheck,$(MODES)): $$(basename $$@)
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
	    --mode=$(basename $@) $(TESTFLAGS) --quickcheck

$(addsuffix .quickcheck,$(ARCHES)): $$(basename $$@)
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
	    --arch=$(basename $@) $(TESTFLAGS) --quickcheck

$(QUICKCHECKS): $$(basename $$@)
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
	    --arch-and-mode=$(basename $@) $(TESTFLAGS) --quickcheck

365
$(addsuffix .sync, $(ANDROID_BUILDS)): $$(basename $$@)
366 367 368
	@tools/android-sync.sh $(basename $@) $(OUTDIR) \
	                       $(shell pwd) $(ANDROID_V8)

369
$(addsuffix .check, $(ANDROID_BUILDS)): $$(basename $$@).sync
370
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
371
	     --arch-and-mode=$(basename $@) \
372
	     --timeout=600 \
373
	     --command-prefix="tools/android-run.py" $(TESTFLAGS)
374

375 376
$(addsuffix .check, $(ANDROID_ARCHES)): \
                $(addprefix $$(basename $$@).,$(MODES)).check
377

378
native.check: native
379
	@tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR)/native \
380
	    --arch-and-mode=. $(TESTFLAGS)
381

382
SUPERFASTTESTMODES = ia32.release
383 384
FASTTESTMODES = $(SUPERFASTTESTMODES),x64.release,ia32.optdebug,x64.optdebug,arm.optdebug,arm64.release
FASTCOMPILEMODES = $(FASTTESTMODES),arm64.optdebug
385

386 387 388
COMMA = ,
EMPTY =
SPACE = $(EMPTY) $(EMPTY)
389
quickcheck: $(subst $(COMMA),$(SPACE),$(FASTCOMPILEMODES))
390 391 392
	tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
	    --arch-and-mode=$(SUPERFASTTESTMODES) $(TESTFLAGS) --quickcheck \
	    --download-data mozilla webkit
393 394
	tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
	    --arch-and-mode=$(FASTTESTMODES) $(TESTFLAGS) --quickcheck
395 396
qc: quickcheck

397 398 399 400 401 402 403 404 405
turbocheck: $(subst $(COMMA),$(SPACE),$(FASTCOMPILEMODES))
	tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
	    --arch-and-mode=$(SUPERFASTTESTMODES) $(TESTFLAGS) \
	    --quickcheck --variants=turbofan --download-data mozilla webkit
	tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \
	    --arch-and-mode=$(FASTTESTMODES) $(TESTFLAGS) \
	    --quickcheck --variants=turbofan
tc: turbocheck

406
# Clean targets. You can clean each architecture individually, or everything.
yangguo's avatar
yangguo committed
407
$(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES)):
408
	rm -f $(OUTDIR)/Makefile.$(basename $@)*
409 410
	rm -rf $(OUTDIR)/$(basename $@).release
	rm -rf $(OUTDIR)/$(basename $@).debug
411
	rm -rf $(OUTDIR)/$(basename $@).optdebug
412
	find $(OUTDIR) -regex '.*\(host\|target\)\.$(basename $@).*\.mk' -delete
413

414
native.clean:
415
	rm -f $(OUTDIR)/Makefile.native
416
	rm -rf $(OUTDIR)/native
417
	find $(OUTDIR) -regex '.*\(host\|target\)\.native\.mk' -delete
418

yangguo's avatar
yangguo committed
419
clean: $(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES)) native.clean gtags.clean tags.clean
420 421

# GYP file generation targets.
422
OUT_MAKEFILES = $(addprefix $(OUTDIR)/Makefile.,$(BUILDS))
423
$(OUT_MAKEFILES): $(GYPFILES) $(ENVFILE)
424 425
	$(eval CXX_TARGET_ARCH:=$(shell $(CXX) -v 2>&1 | grep ^Target: | \
	        cut -f 2 -d " " | cut -f 1 -d "-" ))
426
	$(eval CXX_TARGET_ARCH:=$(subst aarch64,arm64,$(CXX_TARGET_ARCH)))
427
	$(eval CXX_TARGET_ARCH:=$(subst x86_64,x64,$(CXX_TARGET_ARCH)))
428 429 430 431
	$(eval CXX_TARGET_ARCH:=$(subst s390x,s390,$(CXX_TARGET_ARCH)))
	$(eval CXX_TARGET_ARCH:=$(subst powerpc,ppc,$(CXX_TARGET_ARCH)))
	$(eval CXX_TARGET_ARCH:=$(subst ppc64,ppc,$(CXX_TARGET_ARCH)))
	$(eval CXX_TARGET_ARCH:=$(subst ppcle,ppc,$(CXX_TARGET_ARCH)))
432
	$(eval V8_TARGET_ARCH:=$(subst .,,$(suffix $(basename $@))))
433
	PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(shell pwd)/gypfiles:$(PYTHONPATH):$(shell pwd)/tools/gyp/pylib:$(PYTHONPATH)" \
434
	GYP_GENERATORS=make \
435 436
	tools/gyp/gyp --generator-output="$(OUTDIR)" gypfiles/all.gyp \
	              -Igypfiles/standalone.gypi --depth=. \
437
	              -Dv8_target_arch=$(V8_TARGET_ARCH) \
438
	              $(if $(findstring $(CXX_TARGET_ARCH),$(V8_TARGET_ARCH)), \
439 440 441
	              -Dtarget_arch=$(V8_TARGET_ARCH), \
	                  $(if $(shell echo $(ARCHES32) | grep $(V8_TARGET_ARCH)), \
	                  -Dtarget_arch=ia32,)) \
442
	              $(if $(findstring optdebug,$@),-Dv8_optimized_debug=1,) \
443
	              -S$(suffix $(basename $@))$(suffix $@) $(GYPFLAGS)
444

445
$(OUTDIR)/Makefile.native: $(GYPFILES) $(ENVFILE)
446
	PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(shell pwd)/gypfiles:$(PYTHONPATH):$(shell pwd)/tools/gyp/pylib:$(PYTHONPATH)" \
447
	GYP_GENERATORS=make \
448 449
	tools/gyp/gyp --generator-output="$(OUTDIR)" gypfiles/all.gyp \
	              -Igypfiles/standalone.gypi --depth=. -S.native $(GYPFLAGS)
450

451 452 453
# Replaces the old with the new environment file if they're different, which
# will trigger GYP to regenerate Makefiles.
$(ENVFILE): $(ENVFILE).new
454
	@if test -r $(ENVFILE) && cmp $(ENVFILE).new $(ENVFILE) > /dev/null; \
455 456 457 458 459
	    then rm $(ENVFILE).new; \
	    else mv $(ENVFILE).new $(ENVFILE); fi

# Stores current GYPFLAGS in a file.
$(ENVFILE).new:
460 461 462
	$(eval CXX_TARGET_ARCH:=$(shell $(CXX) -v 2>&1 | grep ^Target: | \
	        cut -f 2 -d " " | cut -f 1 -d "-" ))
	$(eval CXX_TARGET_ARCH:=$(subst aarch64,arm64,$(CXX_TARGET_ARCH)))
463
	$(eval CXX_TARGET_ARCH:=$(subst x86_64,x64,$(CXX_TARGET_ARCH)))
464
	@mkdir -p $(OUTDIR); echo "GYPFLAGS=$(GYPFLAGS) -Dtarget_arch=$(CXX_TARGET_ARCH)" > $(ENVFILE).new;
465

466 467 468 469 470 471
# Heap constants for grokdump.
DUMP_FILE = tools/v8heapconst.py
grokdump: ia32.release
	@cat $(DUMP_FILE).tmpl > $(DUMP_FILE)
	@$(OUTDIR)/ia32.release/d8 --dump-heap-constants >> $(DUMP_FILE)

472 473 474 475
# Support for the GNU GLOBAL Source Code Tag System.
gtags.files: $(GYPFILES) $(ENVFILE)
	@find include src test -name '*.h' -o -name '*.cc' -o -name '*.c' > $@

476 477
# We need to manually set the stack limit here, to work around bugs in
# gmake-3.81 and global-5.7.1 on recent 64-bit Linux systems.
478 479 480
# Using $(wildcard ...) gracefully ignores non-existing files, so that stale
# gtags.files after switching branches don't cause recipe failures.
GPATH GRTAGS GSYMS GTAGS: gtags.files $(wildcard $(shell cat gtags.files 2> /dev/null))
481
	@bash -c 'ulimit -s 10240 && GTAGSFORCECPP=yes gtags -i -q -f $<'
482 483

gtags.clean:
484
	rm -f gtags.files GPATH GRTAGS GSYMS GTAGS
485

486 487 488 489 490 491 492 493
tags: gtags.files $(wildcard $(shell cat gtags.files 2> /dev/null))
	@(ctags --version | grep 'Exuberant Ctags' >/dev/null) || \
		(echo "Please install Exuberant Ctags (check 'ctags --version')" >&2; false)
	ctags --fields=+l -L $<

tags.clean:
	rm -r tags

494 495
dependencies builddeps:
	$(error Use 'gclient sync' instead)