Makefile 17.2 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
# verifycsa=on
ifeq ($(verifycsa), on)
  GYPFLAGS += -Dv8_enable_verify_csa=1
endif
58 59 60 61
# verifyheap=on
ifeq ($(verifyheap), on)
  GYPFLAGS += -Dv8_enable_verify_heap=1
endif
62 63 64 65
# tracemaps=on
ifeq ($(tracemaps), on)
  GYPFLAGS += -Dv8_trace_maps=1
endif
66 67 68 69
# concurrentmarking=on
ifeq ($(concurrentmarking), on)
  GYPFLAGS += -Dv8_enable_concurrent_marking=1
endif
70 71 72 73 74 75
# backtrace=off
ifeq ($(backtrace), off)
  GYPFLAGS += -Dv8_enable_backtrace=0
else
  GYPFLAGS += -Dv8_enable_backtrace=1
endif
76 77 78 79
# verifypredictable=on
ifeq ($(verifypredictable), on)
  GYPFLAGS += -Dv8_enable_verify_predictable=1
endif
80 81 82 83
# snapshot=off
ifeq ($(snapshot), off)
  GYPFLAGS += -Dv8_use_snapshot='false'
endif
84 85 86
ifeq ($(snapshot), external)
  GYPFLAGS += -Dv8_use_external_startup_data=1
endif
87 88
# extrachecks=on/off
ifeq ($(extrachecks), on)
jochen's avatar
jochen committed
89
  GYPFLAGS += -Ddcheck_always_on=1 -Dv8_enable_handle_zapping=1
90 91
endif
ifeq ($(extrachecks), off)
jochen's avatar
jochen committed
92
  GYPFLAGS += -Ddcheck_always_on=0 -Dv8_enable_handle_zapping=0
93
endif
94 95 96 97 98 99 100
# slowdchecks=on/off
ifeq ($(slowdchecks), on)
  GYPFLAGS += -Dv8_enable_slow_dchecks=1
endif
ifeq ($(slowdchecks), off)
  GYPFLAGS += -Dv8_enable_slow_dchecks=0
endif
101 102 103 104
# debugsymbols=on
ifeq ($(debugsymbols), on)
  GYPFLAGS += -Drelease_extra_cflags=-ggdb3
endif
105
# gdbjit=on/off
106 107 108
ifeq ($(gdbjit), on)
  GYPFLAGS += -Dv8_enable_gdbjit=1
endif
109 110 111
ifeq ($(gdbjit), off)
  GYPFLAGS += -Dv8_enable_gdbjit=0
endif
112 113 114 115
# vtunejit=on
ifeq ($(vtunejit), on)
  GYPFLAGS += -Dv8_enable_vtunejit=1
endif
116 117 118 119
# unalignedaccess=on
ifeq ($(unalignedaccess), on)
  GYPFLAGS += -Dv8_can_use_unaligned_accesses=true
endif
120 121 122 123
# randomseed=12345, disable random seed via randomseed=0
ifdef randomseed
  GYPFLAGS += -Dv8_random_seed=$(randomseed)
endif
124 125 126 127
# soname_version=1.2.3
ifdef soname_version
  GYPFLAGS += -Dsoname_version=$(soname_version)
endif
128 129 130 131
# werror=no
ifeq ($(werror), no)
  GYPFLAGS += -Dwerror=''
endif
132 133 134 135
# strictaliasing=off (workaround for GCC-4.5)
ifeq ($(strictaliasing), off)
  GYPFLAGS += -Dv8_no_strict_aliasing=1
endif
136 137 138 139
# regexp=interpreted
ifeq ($(regexp), interpreted)
  GYPFLAGS += -Dv8_interpreted_regexp=1
endif
140 141 142 143
# i18nsupport=off
ifeq ($(i18nsupport), off)
  GYPFLAGS += -Dv8_enable_i18n_support=0
  TESTFLAGS += --noi18n
144
endif
145
# deprecationwarnings=on
146 147
ifeq ($(deprecationwarnings), on)
  GYPFLAGS += -Dv8_deprecation_warnings=1
148
endif
149 150 151 152
# vectorstores=on
ifeq ($(vectorstores), on)
  GYPFLAGS += -Dv8_vector_stores=1
endif
153 154 155 156
# imminentdeprecationwarnings=on
ifeq ($(imminentdeprecationwarnings), on)
  GYPFLAGS += -Dv8_imminent_deprecation_warnings=1
endif
157 158 159
# asan=on
ifeq ($(asan), on)
  GYPFLAGS += -Dasan=1 -Dclang=1
160 161 162 163
  TESTFLAGS += --asan
  ifeq ($(lsan), on)
    GYPFLAGS += -Dlsan=1
  endif
164
endif
165 166 167
ifdef embedscript
  GYPFLAGS += -Dembed_script=$(embedscript)
endif
168 169 170
ifdef warmupscript
  GYPFLAGS += -Dwarmup_script=$(warmupscript)
endif
171 172 173
ifeq ($(goma), on)
  GYPFLAGS += -Duse_goma=1
endif
174 175 176 177 178 179 180 181
# 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
182
# arm specific flags.
183 184 185 186 187
# arm_version=<number | "default">
ifneq ($(strip $(arm_version)),)
  GYPFLAGS += -Darm_version=$(arm_version)
else
# Deprecated (use arm_version instead): armv7=false/true
188
ifeq ($(armv7), false)
189
  GYPFLAGS += -Darm_version=6
190 191
else
ifeq ($(armv7), true)
192 193
  GYPFLAGS += -Darm_version=7
endif
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 219 220 221 222 223 224 225 226
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
227
# arm_test_noprobe=on
228 229
# With this flag set, by default v8 will only use features implied
# by the compiler (no probe). This is done by modifying the default
230
# values of enable_armv7, enable_vfp3, enable_32dregs and enable_neon.
231 232
# Modifying these flags when launching v8 will enable the probing for
# the specified values.
233 234
ifeq ($(arm_test_noprobe), on)
  GYPFLAGS += -Darm_test_noprobe=on
235
endif
236 237 238 239
# 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
240

241 242 243 244 245
ifdef android_ndk_root
  GYPFLAGS += -Dandroid_ndk_root=$(android_ndk_root)
  export ANDROID_NDK_ROOT = $(android_ndk_root)
endif

246 247 248 249
# ----------------- available targets: --------------------
# - any arch listed in ARCHES (see below)
# - any mode listed in MODES
# - every combination <arch>.<mode>, e.g. "ia32.release"
250
# - "native": current host's architecture, release mode
251
# - any of the above with .check appended, e.g. "ia32.release.check"
252
# - "android": cross-compile for Android/ARM
253
# - default (no target specified): build all DEFAULT_ARCHES and MODES
254 255 256 257 258 259 260 261
# - "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).
Jakob Kummerow's avatar
Jakob Kummerow committed
262 263
ARCHES = ia32 x64 arm arm64 mips mipsel mips64 mips64el ppc ppc64 s390 s390x
ARCHES32 = ia32 arm mips mipsel ppc s390
264
DEFAULT_ARCHES = ia32 x64 arm
265 266
MODES = release debug optdebug
DEFAULT_MODES = release debug
267
ANDROID_ARCHES = android_ia32 android_x64 android_arm android_arm64 \
Jakob Kummerow's avatar
Jakob Kummerow committed
268
		 android_mipsel
269 270

# List of files that trigger Makefile regeneration:
271
GYPFILES = third_party/icu/icu.gypi third_party/icu/icu.gyp \
272 273 274
	   gypfiles/shim_headers.gypi gypfiles/features.gypi \
           gypfiles/standalone.gypi \
	   gypfiles/toolchain.gypi gypfiles/all.gyp gypfiles/mac/asan.gyp \
275
	   test/cctest/cctest.gyp test/fuzzer/fuzzer.gyp \
276
	   test/unittests/unittests.gyp src/v8.gyp \
277
	   tools/parser-shell.gyp testing/gmock.gyp testing/gtest.gyp \
278
	   samples/samples.gyp src/third_party/vtune/v8vtune.gyp src/d8.gyp
279

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

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

302
# Target definitions. "all" is the default.
303
all: $(DEFAULT_MODES)
304

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

311 312
# Compile targets. MODES and ARCHES are convenience targets.
.SECONDEXPANSION:
313
$(MODES): $(addsuffix .$$@,$(DEFAULT_ARCHES))
314

315
$(ARCHES): $(addprefix $$@.,$(DEFAULT_MODES))
316

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

325
native: $(OUTDIR)/Makefile.native
326
	@$(MAKE) -C "$(OUTDIR)" -f Makefile.native \
327
	         BUILDTYPE=Release \
328 329
	         builddir="$(shell pwd)/$(OUTDIR)/$@"

330
$(ANDROID_ARCHES): $(addprefix $$@.,$(MODES))
331

332
$(ANDROID_BUILDS): $(GYPFILES) $(ENVFILE) Makefile.android
333 334 335 336 337
	@$(MAKE) -f Makefile.android $@ \
	        ARCH="$(basename $@)" \
	        MODE="$(subst .,,$(suffix $@))" \
	        OUTDIR="$(OUTDIR)" \
	        GYPFLAGS="$(GYPFLAGS)"
338

339 340
# Test targets.
check: all
341
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
342
	    --arch=$(shell echo $(DEFAULT_ARCHES) | sed -e 's/ /,/g') \
343
	    $(TESTFLAGS)
344

345
$(addsuffix .check,$(MODES)): $$(basename $$@)
346
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
347
	    --mode=$(basename $@) $(TESTFLAGS)
348 349

$(addsuffix .check,$(ARCHES)): $$(basename $$@)
350
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
351
	    --arch=$(basename $@) $(TESTFLAGS)
352 353

$(CHECKS): $$(basename $$@)
354
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
355
	    --arch-and-mode=$(basename $@) $(TESTFLAGS)
356

357
$(addsuffix .quickcheck,$(MODES)): $$(basename $$@)
358
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
359 360 361
	    --mode=$(basename $@) $(TESTFLAGS) --quickcheck

$(addsuffix .quickcheck,$(ARCHES)): $$(basename $$@)
362
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
363 364 365
	    --arch=$(basename $@) $(TESTFLAGS) --quickcheck

$(QUICKCHECKS): $$(basename $$@)
366
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
367 368
	    --arch-and-mode=$(basename $@) $(TESTFLAGS) --quickcheck

369
$(addsuffix .sync, $(ANDROID_BUILDS)): $$(basename $$@)
370 371 372
	@tools/android-sync.sh $(basename $@) $(OUTDIR) \
	                       $(shell pwd) $(ANDROID_V8)

373
$(addsuffix .check, $(ANDROID_BUILDS)): $$(basename $$@).sync
374
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
375
	     --arch-and-mode=$(basename $@) \
376
	     --timeout=600 \
377
	     --command-prefix="tools/android-run.py" $(TESTFLAGS)
378

379 380
$(addsuffix .check, $(ANDROID_ARCHES)): \
                $(addprefix $$(basename $$@).,$(MODES)).check
381

382
native.check: native
383
	@gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR)/native \
384
	    --arch-and-mode=. $(TESTFLAGS)
385

386
SUPERFASTTESTMODES = ia32.release
387 388
FASTTESTMODES = $(SUPERFASTTESTMODES),x64.release,ia32.optdebug,x64.optdebug,arm.optdebug,arm64.release
FASTCOMPILEMODES = $(FASTTESTMODES),arm64.optdebug
389

390 391 392
COMMA = ,
EMPTY =
SPACE = $(EMPTY) $(EMPTY)
393
quickcheck: $(subst $(COMMA),$(SPACE),$(FASTCOMPILEMODES))
394
	gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
395 396
	    --arch-and-mode=$(SUPERFASTTESTMODES) $(TESTFLAGS) --quickcheck \
	    --download-data mozilla webkit
397
	gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
398
	    --arch-and-mode=$(FASTTESTMODES) $(TESTFLAGS) --quickcheck
399 400
qc: quickcheck

401
turbocheck: $(subst $(COMMA),$(SPACE),$(FASTCOMPILEMODES))
402
	gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
403 404
	    --arch-and-mode=$(SUPERFASTTESTMODES) $(TESTFLAGS) \
	    --quickcheck --variants=turbofan --download-data mozilla webkit
405
	gypfiles/run-tests-legacy.py $(TESTJOBS) --outdir=$(OUTDIR) \
406 407 408 409
	    --arch-and-mode=$(FASTTESTMODES) $(TESTFLAGS) \
	    --quickcheck --variants=turbofan
tc: turbocheck

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

418
native.clean:
419
	rm -f $(OUTDIR)/Makefile.native
420
	rm -rf $(OUTDIR)/native
421
	find $(OUTDIR) -regex '.*\(host\|target\)\.native\.mk' -delete
422

yangguo's avatar
yangguo committed
423
clean: $(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES)) native.clean gtags.clean tags.clean
424 425

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

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

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

# Stores current GYPFLAGS in a file.
$(ENVFILE).new:
464 465 466
	$(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)))
467
	$(eval CXX_TARGET_ARCH:=$(subst x86_64,x64,$(CXX_TARGET_ARCH)))
468
	@mkdir -p $(OUTDIR); echo "GYPFLAGS=$(GYPFLAGS) -Dtarget_arch=$(CXX_TARGET_ARCH)" > $(ENVFILE).new;
469

470 471 472 473
# 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' > $@

474 475
# 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.
476 477 478
# 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))
479
	@bash -c 'ulimit -s 10240 && GTAGSFORCECPP=yes gtags -i -q -f $<'
480 481

gtags.clean:
482
	rm -f gtags.files GPATH GRTAGS GSYMS GTAGS
483

484 485 486 487 488 489 490 491
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

492 493
dependencies builddeps:
	$(error Use 'gclient sync' instead)