js/src/moz.build
author Gregory Szorc <gps@mozilla.com>
Wed, 23 Mar 2016 17:19:20 -0700
changeset 290167 24210e21e08a8ddc13550ad4aaf49714eb9e8cd4
parent 289923 021f70a04fadc6155030df3d30d8c4f01278dd6a
child 290443 491142a0995b238d872d058a2e61a9872408a0b5
permissions -rw-r--r--
Bug 1124033 - Disable C4311 and C4312 in directories exhibiting warnings; r=ehsan There are a long tail of C4311 and C4312 warnings in VS2015. Rather than wait until all of them are fixed to land VS2015, we're taking the easy way out and disabling these warnings in every directory currently exhibiting a warning. This is evil. But it is a lesser evil than globally disabling C4311 and C4312. At least with this approach new C4311 and C4312 warnings in directories that aren't suppressing them shouldn't be introduced. MozReview-Commit-ID: 2cwWrjMD6B9

# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Directory metadata
component_engine = ('Core', 'JavaScript Engine')
component_gc     = ('Core', 'JavaScript: GC')
component_intl   = ('Core', 'JavaScript: Internationalization API')
component_jit    = ('Core', 'JavaScript Engine: JIT')
component_stl    = ('Core', 'JavaScript: Standard Library')

FILES_PER_UNIFIED_FILE = 6

with Files('../public/**'):
    BUG_COMPONENT = component_engine
with Files('*'):
    BUG_COMPONENT = component_engine

with Files('asmjs/**'):
    BUG_COMPONENT = component_jit
with Files('builtin/**'):
    BUG_COMPONENT = component_stl
with Files('ctypes/**'):
    BUG_COMPONENT = ('Core', 'js-ctypes')
with Files('gc/**'):
    BUG_COMPONENT = component_gc
with Files('jit/**'):
    BUG_COMPONENT = component_jit

# File-specific metadata
for gcfile in ['jsgc*', 'devtools/rootAnalysis', 'devtools/gc-ubench', 'devtools/gctrace']:
    with Files(gcfile):
        BUG_COMPONENT = component_gc
for header in ('GCAnnotations.h', 'GCAPI.h', 'HeapAPI.h', 'RootingAPI.h', 'SliceBudget.h', 'TraceKind.h', 'TracingAPI.h', 'WeakMapPtr.h'):
    with Files('../public/' + header):
        BUG_COMPONENT = component_gc

for stlfile in ['jsarray.*', 'jsbool*', 'jsdate.*', 'jsnum.*', 'json.*', 'jsstr.*']:
    with Files(stlfile):
        BUG_COMPONENT = component_stl

with Files('builtin/Intl*'):
    BUG_COMPONENT = component_intl
with Files('builtin/make_intl_data.py'):
    BUG_COMPONENT = component_intl

with Files('../public/TrackedOptimizationInfo.h'):
    BUG_COMPONENT = component_jit


if CONFIG['JS_BUNDLED_EDITLINE']:
    DIRS += ['editline']

if not CONFIG['JS_DISABLE_SHELL']:
    DIRS += ['shell']

TEST_DIRS += ['jsapi-tests', 'tests', 'gdb']

CONFIGURE_SUBST_FILES += [
    'devtools/rootAnalysis/Makefile',
    'js-config',
    'js.pc',
]
CONFIGURE_DEFINE_FILES += [
    'js-confdefs.h',
]

if not CONFIG['JS_STANDALONE']:
    CONFIGURE_SUBST_FILES += [
        '../../config/autoconf-js.mk',
        '../../config/emptyvars-js.mk',
    ]

CONFIGURE_DEFINE_FILES += [
    'js-config.h',
]

# Changes to internal header files, used externally, massively slow down
# browser builds.  Don't add new files here unless you know what you're
# doing!
EXPORTS += [
    'js.msg',
    'jsalloc.h',
    'jsapi.h',
    'jsbytecode.h',
    'jsclist.h',
    'jscpucfg.h',
    'jsfriendapi.h',
    'jsprf.h',
    'jsprototypes.h',
    'jspubtd.h',
    'jstypes.h',
    'jsversion.h',
    'jswrapper.h',
    'perf/jsperf.h',
]

# If you add a header here, add it to js/src/jsapi-tests/testIntTypesABI.cpp so
# that we ensure we don't over-expose our internal integer typedefs.  Note that
# LegacyIntTypes.h below is deliberately exempted from this requirement.
EXPORTS.js += [
    '../public/CallArgs.h',
    '../public/CallNonGenericMethod.h',
    '../public/CharacterEncoding.h',
    '../public/Class.h',
    '../public/Conversions.h',
    '../public/Date.h',
    '../public/Debug.h',
    '../public/GCAnnotations.h',
    '../public/GCAPI.h',
    '../public/GCHashTable.h',
    '../public/GCPolicyAPI.h',
    '../public/GCVariant.h',
    '../public/GCVector.h',
    '../public/HashTable.h',
    '../public/HeapAPI.h',
    '../public/Id.h',
    '../public/Initialization.h',
    '../public/LegacyIntTypes.h',
    '../public/MemoryMetrics.h',
    '../public/Principals.h',
    '../public/ProfilingFrameIterator.h',
    '../public/ProfilingStack.h',
    '../public/Proxy.h',
    '../public/RequiredDefines.h',
    '../public/RootingAPI.h',
    '../public/SliceBudget.h',
    '../public/StructuredClone.h',
    '../public/TraceKind.h',
    '../public/TracingAPI.h',
    '../public/TrackedOptimizationInfo.h',
    '../public/TypeDecls.h',
    '../public/UbiNode.h',
    '../public/UbiNodeBreadthFirst.h',
    '../public/UbiNodeCensus.h',
    '../public/UbiNodeDominatorTree.h',
    '../public/UbiNodePostOrder.h',
    '../public/UbiNodeShortestPaths.h',
    '../public/UniquePtr.h',
    '../public/Utility.h',
    '../public/Value.h',
    '../public/Vector.h',
    '../public/WeakMapPtr.h',
]

UNIFIED_SOURCES += [
    'asmjs/AsmJS.cpp',
    'asmjs/Wasm.cpp',
    'asmjs/WasmBinary.cpp',
    'asmjs/WasmBinaryToText.cpp',
    'asmjs/WasmFrameIterator.cpp',
    'asmjs/WasmGenerator.cpp',
    'asmjs/WasmIonCompile.cpp',
    'asmjs/WasmModule.cpp',
    'asmjs/WasmSignalHandlers.cpp',
    'asmjs/WasmStubs.cpp',
    'asmjs/WasmTextToBinary.cpp',
    'asmjs/WasmTypes.cpp',
    'builtin/AtomicsObject.cpp',
    'builtin/Eval.cpp',
    'builtin/Intl.cpp',
    'builtin/MapObject.cpp',
    'builtin/ModuleObject.cpp',
    'builtin/Object.cpp',
    'builtin/Profilers.cpp',
    'builtin/Promise.cpp',
    'builtin/Reflect.cpp',
    'builtin/ReflectParse.cpp',
    'builtin/SIMD.cpp',
    'builtin/SymbolObject.cpp',
    'builtin/TestingFunctions.cpp',
    'builtin/TypedObject.cpp',
    'builtin/WeakMapObject.cpp',
    'builtin/WeakSetObject.cpp',
    'devtools/sharkctl.cpp',
    'ds/LifoAlloc.cpp',
    'frontend/BytecodeCompiler.cpp',
    'frontend/BytecodeEmitter.cpp',
    'frontend/FoldConstants.cpp',
    'frontend/NameFunctions.cpp',
    'frontend/ParseMaps.cpp',
    'frontend/ParseNode.cpp',
    'frontend/TokenStream.cpp',
    'gc/Allocator.cpp',
    'gc/Barrier.cpp',
    'gc/GCTrace.cpp',
    'gc/Iteration.cpp',
    'gc/Marking.cpp',
    'gc/Memory.cpp',
    'gc/MemoryProfiler.cpp',
    'gc/Nursery.cpp',
    'gc/RootMarking.cpp',
    'gc/Statistics.cpp',
    'gc/Tracer.cpp',
    'gc/Verifier.cpp',
    'gc/Zone.cpp',
    'irregexp/NativeRegExpMacroAssembler.cpp',
    'irregexp/RegExpAST.cpp',
    'irregexp/RegExpEngine.cpp',
    'irregexp/RegExpInterpreter.cpp',
    'irregexp/RegExpMacroAssembler.cpp',
    'irregexp/RegExpParser.cpp',
    'irregexp/RegExpStack.cpp',
    'jit/AliasAnalysis.cpp',
    'jit/AlignmentMaskAnalysis.cpp',
    'jit/BacktrackingAllocator.cpp',
    'jit/Bailouts.cpp',
    'jit/BaselineBailouts.cpp',
    'jit/BaselineCacheIR.cpp',
    'jit/BaselineCompiler.cpp',
    'jit/BaselineDebugModeOSR.cpp',
    'jit/BaselineFrame.cpp',
    'jit/BaselineFrameInfo.cpp',
    'jit/BaselineIC.cpp',
    'jit/BaselineInspector.cpp',
    'jit/BaselineJIT.cpp',
    'jit/BitSet.cpp',
    'jit/BytecodeAnalysis.cpp',
    'jit/C1Spewer.cpp',
    'jit/CacheIR.cpp',
    'jit/CodeGenerator.cpp',
    'jit/CompileWrappers.cpp',
    'jit/Disassembler.cpp',
    'jit/EagerSimdUnbox.cpp',
    'jit/EdgeCaseAnalysis.cpp',
    'jit/EffectiveAddressAnalysis.cpp',
    'jit/ExecutableAllocator.cpp',
    'jit/InstructionReordering.cpp',
    'jit/Ion.cpp',
    'jit/IonAnalysis.cpp',
    'jit/IonBuilder.cpp',
    'jit/IonCaches.cpp',
    'jit/IonOptimizationLevels.cpp',
    'jit/JitcodeMap.cpp',
    'jit/JitFrames.cpp',
    'jit/JitOptions.cpp',
    'jit/JitSpewer.cpp',
    'jit/JSONSpewer.cpp',
    'jit/LICM.cpp',
    'jit/LIR.cpp',
    'jit/LoopUnroller.cpp',
    'jit/Lowering.cpp',
    'jit/MacroAssembler.cpp',
    'jit/MCallOptimize.cpp',
    'jit/MIR.cpp',
    'jit/MIRGraph.cpp',
    'jit/MoveResolver.cpp',
    'jit/OptimizationTracking.cpp',
    'jit/PerfSpewer.cpp',
    'jit/RangeAnalysis.cpp',
    'jit/Recover.cpp',
    'jit/RegisterAllocator.cpp',
    'jit/RematerializedFrame.cpp',
    'jit/Safepoints.cpp',
    'jit/ScalarReplacement.cpp',
    'jit/shared/BaselineCompiler-shared.cpp',
    'jit/shared/CodeGenerator-shared.cpp',
    'jit/shared/Lowering-shared.cpp',
    'jit/SharedIC.cpp',
    'jit/Sink.cpp',
    'jit/Snapshots.cpp',
    'jit/StupidAllocator.cpp',
    'jit/TypedObjectPrediction.cpp',
    'jit/TypePolicy.cpp',
    'jit/ValueNumbering.cpp',
    'jit/VMFunctions.cpp',
    'jsalloc.cpp',
    'jsapi.cpp',
    'jsbool.cpp',
    'jscntxt.cpp',
    'jscompartment.cpp',
    'jsdate.cpp',
    'jsexn.cpp',
    'jsfriendapi.cpp',
    'jsfun.cpp',
    'jsgc.cpp',
    'jsiter.cpp',
    'jsnativestack.cpp',
    'jsnum.cpp',
    'jsobj.cpp',
    'json.cpp',
    'jsopcode.cpp',
    'jsprf.cpp',
    'jspropertytree.cpp',
    'jsscript.cpp',
    'jsstr.cpp',
    'jswatchpoint.cpp',
    'jsweakmap.cpp',
    'perf/jsperf.cpp',
    'proxy/BaseProxyHandler.cpp',
    'proxy/CrossCompartmentWrapper.cpp',
    'proxy/DeadObjectProxy.cpp',
    'proxy/DirectProxyHandler.cpp',
    'proxy/OpaqueCrossCompartmentWrapper.cpp',
    'proxy/Proxy.cpp',
    'proxy/ScriptedDirectProxyHandler.cpp',
    'proxy/SecurityWrapper.cpp',
    'proxy/Wrapper.cpp',
    'vm/ArgumentsObject.cpp',
    'vm/ArrayBufferObject.cpp',
    'vm/CallNonGenericMethod.cpp',
    'vm/CharacterEncoding.cpp',
    'vm/CodeCoverage.cpp',
    'vm/Compression.cpp',
    'vm/DateTime.cpp',
    'vm/Debugger.cpp',
    'vm/DebuggerMemory.cpp',
    'vm/ErrorObject.cpp',
    'vm/ForOfIterator.cpp',
    'vm/GeneratorObject.cpp',
    'vm/GlobalObject.cpp',
    'vm/HelperThreads.cpp',
    'vm/Id.cpp',
    'vm/Interpreter.cpp',
    'vm/JSONParser.cpp',
    'vm/MemoryMetrics.cpp',
    'vm/Monitor.cpp',
    'vm/NativeObject.cpp',
    'vm/ObjectGroup.cpp',
    'vm/PIC.cpp',
    'vm/Printer.cpp',
    'vm/Probes.cpp',
    'vm/ProxyObject.cpp',
    'vm/ReceiverGuard.cpp',
    'vm/RegExpObject.cpp',
    'vm/RegExpStatics.cpp',
    'vm/Runtime.cpp',
    'vm/SavedStacks.cpp',
    'vm/ScopeObject.cpp',
    'vm/SelfHosting.cpp',
    'vm/Shape.cpp',
    'vm/SharedArrayObject.cpp',
    'vm/SPSProfiler.cpp',
    'vm/Stack.cpp',
    'vm/Stopwatch.cpp',
    'vm/String.cpp',
    'vm/StringBuffer.cpp',
    'vm/StructuredClone.cpp',
    'vm/Symbol.cpp',
    'vm/TaggedProto.cpp',
    'vm/Time.cpp',
    'vm/TypedArrayObject.cpp',
    'vm/TypeInference.cpp',
    'vm/UbiNode.cpp',
    'vm/UbiNodeCensus.cpp',
    'vm/UbiNodeShortestPaths.cpp',
    'vm/UnboxedObject.cpp',
    'vm/Unicode.cpp',
    'vm/Value.cpp',
    'vm/WeakMapPtr.cpp',
    'vm/Xdr.cpp'
]

# jsarray.cpp and jsatom.cpp cannot be built in unified mode because
# xpcshell is broken during packaging when compiled with gcc-4.8.2
# builtin/RegExp.cpp cannot be built in unified mode because it is built
# without PGO
# frontend/Parser.cpp cannot be built in unified mode because of explicit
# template instantiations.
# jsdtoa.cpp cannot be built in unified mode because we want to suppress
# compiler warnings in third-party dtoa.c.
# jsmath.cpp cannot be built in unified mode because it needs to pull rand_s
# from <stdlib.h> on Windows through a preprocessor define.
# jsutil.cpp cannot be built in unified mode because it is needed for
# check-vanilla-allocations.
# StoreBuffer.cpp cannot be built in unified because its template
# instantiations may or may not be needed depending on what it gets bundled
# with.
SOURCES += [
    'builtin/RegExp.cpp',
    'frontend/Parser.cpp',
    'gc/StoreBuffer.cpp',
    'jsarray.cpp',
    'jsatom.cpp',
    'jsdtoa.cpp',
    'jsmath.cpp',
    'jsutil.cpp',
    'vm/Initialization.cpp',
]

if CONFIG['JS_POSIX_NSPR']:
    UNIFIED_SOURCES += [
        'vm/PosixNSPR.cpp',
    ]

if CONFIG['MOZ_INSTRUMENTS']:
    SOURCES += [
        'devtools/Instruments.cpp',
    ]

if CONFIG['ENABLE_TRACE_LOGGING']:
    SOURCES += [
        'vm/TraceLogging.cpp',
        'vm/TraceLoggingGraph.cpp',
        'vm/TraceLoggingTypes.cpp',
    ]

if not CONFIG['ENABLE_ION']:
    UNIFIED_SOURCES += [
        'jit/none/Trampoline-none.cpp'
    ]
elif CONFIG['JS_CODEGEN_X86'] or CONFIG['JS_CODEGEN_X64']:
    UNIFIED_SOURCES += [
        'jit/x86-shared/Architecture-x86-shared.cpp',
        'jit/x86-shared/Assembler-x86-shared.cpp',
        'jit/x86-shared/AssemblerBuffer-x86-shared.cpp',
        'jit/x86-shared/BaselineCompiler-x86-shared.cpp',
        'jit/x86-shared/BaselineIC-x86-shared.cpp',
        'jit/x86-shared/CodeGenerator-x86-shared.cpp',
        'jit/x86-shared/Lowering-x86-shared.cpp',
        'jit/x86-shared/MacroAssembler-x86-shared.cpp',
        'jit/x86-shared/MoveEmitter-x86-shared.cpp',
    ]
    SOURCES += [
        'jit/x86-shared/Disassembler-x86-shared.cpp',  # using namespace js::jit::X86Encoding;
    ]
    if CONFIG['JS_CODEGEN_X64']:
        UNIFIED_SOURCES += [
            'jit/x64/Assembler-x64.cpp',
            'jit/x64/Bailouts-x64.cpp',
            'jit/x64/BaselineCompiler-x64.cpp',
            'jit/x64/BaselineIC-x64.cpp',
            'jit/x64/CodeGenerator-x64.cpp',
            'jit/x64/Lowering-x64.cpp',
            'jit/x64/MacroAssembler-x64.cpp',
            'jit/x64/SharedIC-x64.cpp',
            'jit/x64/Trampoline-x64.cpp',
        ]
    else:
        UNIFIED_SOURCES += [
            'jit/x86/Assembler-x86.cpp',
            'jit/x86/Bailouts-x86.cpp',
            'jit/x86/BaselineCompiler-x86.cpp',
            'jit/x86/BaselineIC-x86.cpp',
            'jit/x86/CodeGenerator-x86.cpp',
            'jit/x86/Lowering-x86.cpp',
            'jit/x86/MacroAssembler-x86.cpp',
            'jit/x86/SharedIC-x86.cpp',
            'jit/x86/Trampoline-x86.cpp',
        ]
elif CONFIG['JS_CODEGEN_ARM']:
    UNIFIED_SOURCES += [
        'jit/arm/Architecture-arm.cpp',
        'jit/arm/Assembler-arm.cpp',
        'jit/arm/Bailouts-arm.cpp',
        'jit/arm/BaselineCompiler-arm.cpp',
        'jit/arm/BaselineIC-arm.cpp',
        'jit/arm/CodeGenerator-arm.cpp',
        'jit/arm/disasm/Constants-arm.cpp',
        'jit/arm/disasm/Disasm-arm.cpp',
        'jit/arm/Lowering-arm.cpp',
        'jit/arm/MacroAssembler-arm.cpp',
        'jit/arm/MoveEmitter-arm.cpp',
        'jit/arm/SharedIC-arm.cpp',
        'jit/arm/Trampoline-arm.cpp',
    ]
    if CONFIG['JS_SIMULATOR_ARM']:
        UNIFIED_SOURCES += [
            'jit/arm/Simulator-arm.cpp'
        ]
    elif CONFIG['OS_ARCH'] == 'Darwin':
        SOURCES += [
            'jit/arm/llvm-compiler-rt/arm/aeabi_idivmod.S',
            'jit/arm/llvm-compiler-rt/arm/aeabi_uidivmod.S',
        ]
elif CONFIG['JS_CODEGEN_ARM64']:
    UNIFIED_SOURCES += [
        'jit/arm64/Architecture-arm64.cpp',
        'jit/arm64/Assembler-arm64.cpp',
        'jit/arm64/Bailouts-arm64.cpp',
        'jit/arm64/BaselineIC-arm64.cpp',
        'jit/arm64/CodeGenerator-arm64.cpp',
        'jit/arm64/Lowering-arm64.cpp',
        'jit/arm64/MacroAssembler-arm64.cpp',
        'jit/arm64/MoveEmitter-arm64.cpp',
        'jit/arm64/SharedIC-arm64.cpp',
        'jit/arm64/Trampoline-arm64.cpp',
        'jit/arm64/vixl/Assembler-vixl.cpp',
        'jit/arm64/vixl/Cpu-vixl.cpp',
        'jit/arm64/vixl/Decoder-vixl.cpp',
        'jit/arm64/vixl/Disasm-vixl.cpp',
        'jit/arm64/vixl/Instructions-vixl.cpp',
        'jit/arm64/vixl/Instrument-vixl.cpp',
        'jit/arm64/vixl/MacroAssembler-vixl.cpp',
        'jit/arm64/vixl/MozAssembler-vixl.cpp',
        'jit/arm64/vixl/MozInstructions-vixl.cpp',
        'jit/arm64/vixl/Utils-vixl.cpp'
    ]
    if CONFIG['JS_SIMULATOR_ARM64']:
        UNIFIED_SOURCES += [
            'jit/arm64/vixl/Debugger-vixl.cpp',
            'jit/arm64/vixl/Logic-vixl.cpp',
            'jit/arm64/vixl/MozSimulator-vixl.cpp',
            'jit/arm64/vixl/Simulator-vixl.cpp'
        ]
elif CONFIG['JS_CODEGEN_MIPS32'] or CONFIG['JS_CODEGEN_MIPS64']:
    UNIFIED_SOURCES += [
        'jit/mips-shared/Architecture-mips-shared.cpp',
        'jit/mips-shared/Assembler-mips-shared.cpp',
        'jit/mips-shared/Bailouts-mips-shared.cpp',
        'jit/mips-shared/BaselineCompiler-mips-shared.cpp',
        'jit/mips-shared/BaselineIC-mips-shared.cpp',
        'jit/mips-shared/CodeGenerator-mips-shared.cpp',
        'jit/mips-shared/Lowering-mips-shared.cpp',
        'jit/mips-shared/MacroAssembler-mips-shared.cpp',
        'jit/mips-shared/MoveEmitter-mips-shared.cpp',
    ]
    if CONFIG['JS_CODEGEN_MIPS32']:
        UNIFIED_SOURCES += [
            'jit/mips32/Architecture-mips32.cpp',
            'jit/mips32/Assembler-mips32.cpp',
            'jit/mips32/Bailouts-mips32.cpp',
            'jit/mips32/BaselineCompiler-mips32.cpp',
            'jit/mips32/BaselineIC-mips32.cpp',
            'jit/mips32/CodeGenerator-mips32.cpp',
            'jit/mips32/Lowering-mips32.cpp',
            'jit/mips32/MacroAssembler-mips32.cpp',
            'jit/mips32/MoveEmitter-mips32.cpp',
            'jit/mips32/SharedIC-mips32.cpp',
            'jit/mips32/Trampoline-mips32.cpp',
        ]
        if CONFIG['JS_SIMULATOR_MIPS32']:
            UNIFIED_SOURCES += [
                'jit/mips32/Simulator-mips32.cpp'
            ]
    elif CONFIG['JS_CODEGEN_MIPS64']:
        UNIFIED_SOURCES += [
            'jit/mips64/Architecture-mips64.cpp',
            'jit/mips64/Assembler-mips64.cpp',
            'jit/mips64/Bailouts-mips64.cpp',
            'jit/mips64/BaselineCompiler-mips64.cpp',
            'jit/mips64/BaselineIC-mips64.cpp',
            'jit/mips64/CodeGenerator-mips64.cpp',
            'jit/mips64/Lowering-mips64.cpp',
            'jit/mips64/MacroAssembler-mips64.cpp',
            'jit/mips64/MoveEmitter-mips64.cpp',
            'jit/mips64/SharedIC-mips64.cpp',
            'jit/mips64/Trampoline-mips64.cpp',
        ]
        if CONFIG['JS_SIMULATOR_MIPS64']:
            UNIFIED_SOURCES += [
                'jit/mips64/Simulator-mips64.cpp'
            ]

if CONFIG['OS_ARCH'] == 'WINNT':
    SOURCES += [
        'jit/ExecutableAllocatorWin.cpp',
        'threading/windows/Mutex.cpp',
    ]
    # _CRT_RAND_S must be #defined before #including stdlib.h to get rand_s()
    DEFINES['_CRT_RAND_S'] = True
else:
    SOURCES += [
        'jit/ExecutableAllocatorPosix.cpp',
        'threading/posix/Mutex.cpp',
    ]

if CONFIG['JS_HAS_CTYPES']:
    SOURCES += [
        'ctypes/CTypes.cpp',
        'ctypes/Library.cpp',
    ]
    if not CONFIG['MOZ_SYSTEM_FFI']:
        LOCAL_INCLUDES += [
            '!ctypes/libffi/include',
        ]

if CONFIG['MOZ_VTUNE']:
    SOURCES += [
        'vtune/jitprofiling.c'
    ]

if CONFIG['HAVE_LINUX_PERF_EVENT_H']:
    SOURCES += [
        'perf/pm_linux.cpp'
    ]
    SOURCES['perf/pm_linux.cpp'].flags += [CONFIG['LINUX_HEADERS_INCLUDES']]
else:
    SOURCES += [
        'perf/pm_stub.cpp'
    ]

HostSimplePrograms([
    'host_jskwgen',
])

# JavaScript must be built shared, even for static builds, as it is used by
# other modules which are always built shared. Failure to do so results in
# the js code getting copied into xpinstall and jsd as well as mozilla-bin,
# and then the static data cells used for locking no longer work.
#
# In fact, we now build both a static and a shared library, as the
# JS shell would like to link to the static library.

if CONFIG['JS_SHARED_LIBRARY']:
    GeckoSharedLibrary('js', linkage=None)
    SHARED_LIBRARY_NAME = CONFIG['JS_LIBRARY_NAME']
    SDK_LIBRARY = True
else:
    Library('js')

FORCE_STATIC_LIB = True
STATIC_LIBRARY_NAME = 'js_static'

if CONFIG['JS_HAS_CTYPES']:
    USE_LIBS += [
        'ffi',
    ]

if CONFIG['ENABLE_INTL_API']:
    USE_LIBS += [
        'icu',
    ]

USE_LIBS += [
    'nspr',
    'zlib',
]

if CONFIG['MOZ_ETW']:
    GENERATED_FILES = [
        'ETWProvider.h',
    ]
    # This will get the ETW provider resources into the library mozjs.dll
    RESFILE = 'ETWProvider.res'

if CONFIG['NIGHTLY_BUILD']:
    DEFINES['ENABLE_BINARYDATA'] = True

if CONFIG['NIGHTLY_BUILD']:
    DEFINES['ENABLE_SIMD'] = True

# Also set in shell/moz.build
DEFINES['ENABLE_SHARED_ARRAY_BUFFER'] = True

DEFINES['EXPORT_JS_API'] = True

if CONFIG['JS_HAS_CTYPES']:
    DEFINES['JS_HAS_CTYPES'] = True
    for var in ('DLL_PREFIX', 'DLL_SUFFIX'):
        DEFINES[var] = '"%s"' % CONFIG[var]

if CONFIG['MOZ_LINKER']:
    DEFINES['MOZ_LINKER'] = True

if CONFIG['_MSC_VER']:
    if CONFIG['CPU_ARCH'] == 'x86':
        SOURCES['builtin/RegExp.cpp'].no_pgo = True # Bug 772303
    elif CONFIG['CPU_ARCH'] == 'x86_64' and CONFIG['JS_HAS_CTYPES']:
        SOURCES['ctypes/CTypes.cpp'].no_pgo = True # Bug 810661
    # Prevent floating point errors caused by VC++ optimizations
    # XXX We should add this to CXXFLAGS, too?
    CFLAGS += ['-fp:precise']
    # C4805 warns mixing bool with other integral types in computation.
    # But given the conversion from bool is specified, and this is a
    # pattern widely used in code in js/src, suppress this warning here.
    CXXFLAGS += ['-wd4805']
    # C4661 ("no suitable definition provided for explicit template
    # instantiation request") is emitted for all Parser methods that
    # have a Parser<FullParseHandler> definition but no
    # Parser<SyntaxParseHandler> definition, see bug 1167030.
    CXXFLAGS += ['-wd4661']
    CXXFLAGS += ['-we4067', '-we4258', '-we4275']
    CXXFLAGS += ['-wd4146'] # FIXME: unary minus operator applied to unsigned type (bug 1229189)
    CXXFLAGS += ['-wd4273'] # FIXME: inconsistent dll linkage (bug 1229666)

    # This is intended as a temporary hack to support building with VS2015.
    # 'noexcept' used with no exception handling mode specified;
    # termination on exception is not guaranteed. Specify /EHsc
    CXXFLAGS += ['-wd4577']
    CXXFLAGS += ['-wd4312']

if CONFIG['OS_ARCH'] not in ('WINNT', 'HP-UX'):
    OS_LIBS += [
        'm',
    ]

if CONFIG['OS_ARCH'] == 'FreeBSD':
    OS_LIBS += [
        '-pthread',
    ]

if CONFIG['OS_ARCH'] == 'Linux':
    OS_LIBS += [
        'dl',
    ]

if CONFIG['OS_ARCH'] == 'SunOS':
    OS_LIBS += [
        'posix4',
        'dl',
        'nsl',
        'socket',
    ]

CFLAGS += CONFIG['MOZ_ICU_CFLAGS']
CXXFLAGS += CONFIG['MOZ_ICU_CFLAGS']
LOCAL_INCLUDES += CONFIG['MOZ_ICU_INCLUDES']

NO_EXPAND_LIBS = True

DIST_INSTALL = True

# Prepare self-hosted JS code for embedding
GENERATED_FILES += ['selfhosted.out.h']
selfhosted = GENERATED_FILES['selfhosted.out.h']
selfhosted.script = 'builtin/embedjs.py:generate_selfhosted'
selfhosted.inputs = [
    'js.msg',
    'builtin/TypedObjectConstants.h',
    'builtin/SelfHostingDefines.h',
    'builtin/Utilities.js',
    'builtin/Array.js',
    'builtin/Classes.js',
    'builtin/Date.js',
    'builtin/Error.js',
    'builtin/Function.js',
    'builtin/Generator.js',
    'builtin/Intl.js',
    'builtin/IntlData.js',
    'builtin/Iterator.js',
    'builtin/Map.js',
    'builtin/Module.js',
    'builtin/Number.js',
    'builtin/Object.js',
    'builtin/Reflect.js',
    'builtin/RegExp.js',
    'builtin/String.js',
    'builtin/Set.js',
    'builtin/Sorting.js',
    'builtin/TypedArray.js',
    'builtin/TypedObject.js',
    'builtin/WeakSet.js'
]

if CONFIG['SPIDERMONKEY_PROMISE']:
    selfhosted.inputs += ['builtin/Promise.js']

if CONFIG['JS_HAS_CTYPES']:
    if CONFIG['MOZ_SYSTEM_FFI']:
        CXXFLAGS += CONFIG['MOZ_FFI_CFLAGS']
    else:
        # Windows needs this to be linked with a static library.
        DEFINES['FFI_BUILDING'] = True

# Suppress warnings in third-party code.
if CONFIG['CLANG_CXX']:
    SOURCES['jsdtoa.cpp'].flags += ['-Wno-implicit-fallthrough']