# The keys in sources are the paths to the directories # the values are an array of source files in those directories to compile sources = {} sources['API'] = [ 'API/JSBase.cpp', 'API/JSCallbackConstructor.cpp', 'API/JSCallbackFunction.cpp', 'API/JSCallbackObject.cpp', 'API/JSClassRef.cpp', 'API/JSContextRef.cpp', 'API/JSObjectRef.cpp', 'API/JSProfilerPrivate.cpp', 'API/JSStringRef.cpp', 'API/JSValueRef.cpp', 'API/OpaqueJSString.cpp', ] sources['bytecompiler'] = [ 'bytecompiler/BytecodeGenerator.cpp', ] sources['debugger'] = [ 'debugger/Debugger.cpp', 'debugger/DebuggerActivation.cpp', 'debugger/DebuggerCallFrame.cpp', ] sources['parser'] = [ 'parser/Lexer.cpp', 'parser/Nodes.cpp', 'parser/Parser.cpp', ] sources['pcre'] = [ 'pcre/pcre_compile.cpp', 'pcre/pcre_exec.cpp', 'pcre/pcre_tables.cpp', 'pcre/pcre_ucp_searchfuncs.cpp', 'pcre/pcre_xclass.cpp', ] sources['profiler'] = [ 'profiler/HeavyProfile.cpp', 'profiler/Profile.cpp', 'profiler/ProfileGenerator.cpp', 'profiler/ProfileNode.cpp', 'profiler/Profiler.cpp', 'profiler/TreeProfile.cpp', ] sources['runtime'] = [ 'runtime/ArgList.cpp', 'runtime/Arguments.cpp', 'runtime/ArrayConstructor.cpp', 'runtime/ArrayPrototype.cpp', 'runtime/BooleanConstructor.cpp', 'runtime/BooleanObject.cpp', 'runtime/BooleanPrototype.cpp', 'runtime/CallData.cpp', 'runtime/Collector.cpp', 'runtime/Completion.cpp', 'runtime/CommonIdentifiers.cpp', 'runtime/ConstructData.cpp', 'runtime/DateConstructor.cpp', 'runtime/DateInstance.cpp', 'runtime/DateMath.cpp', 'runtime/DatePrototype.cpp', 'runtime/Error.cpp', 'runtime/ErrorConstructor.cpp', 'runtime/ErrorInstance.cpp', 'runtime/ErrorPrototype.cpp', 'runtime/ExceptionHelpers.cpp', 'runtime/FunctionConstructor.cpp', 'runtime/FunctionPrototype.cpp', 'runtime/GetterSetter.cpp', 'runtime/GlobalEvalFunction.cpp', 'runtime/Identifier.cpp', 'runtime/InitializeThreading.cpp', 'runtime/InternalFunction.cpp', 'runtime/JSActivation.cpp', 'runtime/JSArray.cpp', 'runtime/JSByteArray.cpp', 'runtime/JSCell.cpp', 'runtime/JSFunction.cpp', 'runtime/JSGlobalData.cpp', 'runtime/JSGlobalObject.cpp', 'runtime/JSGlobalObjectFunctions.cpp', 'runtime/JSImmediate.cpp', 'runtime/JSLock.cpp', 'runtime/JSNotAnObject.cpp', 'runtime/JSNumberCell.cpp', 'runtime/JSObject.cpp', 'runtime/JSPropertyNameIterator.cpp', 'runtime/JSStaticScopeObject.cpp', 'runtime/JSString.cpp', 'runtime/JSValue.cpp', 'runtime/JSVariableObject.cpp', 'runtime/JSWrapperObject.cpp', 'runtime/Lookup.cpp', 'runtime/MathObject.cpp', 'runtime/NativeErrorConstructor.cpp', 'runtime/NativeErrorPrototype.cpp', 'runtime/NumberConstructor.cpp', 'runtime/NumberObject.cpp', 'runtime/NumberPrototype.cpp', 'runtime/ObjectConstructor.cpp', 'runtime/ObjectPrototype.cpp', 'runtime/Operations.cpp', 'runtime/PropertyNameArray.cpp', 'runtime/PropertySlot.cpp', 'runtime/PrototypeFunction.cpp', 'runtime/RegExp.cpp', 'runtime/RegExpConstructor.cpp', 'runtime/RegExpObject.cpp', 'runtime/RegExpPrototype.cpp', 'runtime/ScopeChain.cpp', 'runtime/SmallStrings.cpp', 'runtime/StringConstructor.cpp', 'runtime/StringObject.cpp', 'runtime/StringPrototype.cpp', 'runtime/Structure.cpp', 'runtime/StructureChain.cpp', 'runtime/UString.cpp', ] sources['bytecode'] = [ 'bytecode/CodeBlock.cpp', 'bytecode/StructureStubInfo.cpp', 'bytecode/JumpTable.cpp', 'bytecode/Opcode.cpp', 'bytecode/SamplingTool.cpp', ] sources['interpreter'] = [ 'interpreter/CallFrame.cpp', 'interpreter/Interpreter.cpp', 'interpreter/RegisterFile.cpp', ] sources['jit'] = [ 'jit/ExecutableAllocator.cpp', 'jit/JIT.cpp', ] sources['wrec'] = [ 'wrec/CharacterClass.cpp', 'wrec/CharacterClassConstructor.cpp', 'wrec/WREC.cpp', 'wrec/WRECFunctors.cpp', 'wrec/WRECGenerator.cpp', 'wrec/WRECParser.cpp', ] sources['wtf'] = [ 'wtf/Assertions.cpp', 'wtf/ByteArray.cpp', 'wtf/CurrentTime.cpp', 'wtf/FastMalloc.cpp', 'wtf/HashTable.cpp', 'wtf/RandomNumber.cpp', 'wtf/RefCountedLeakCounter.cpp', 'wtf/Threading.cpp', 'wtf/dtoa.cpp', ] sources['wtf/unicode'] = [ 'wtf/unicode/CollatorDefault.cpp', 'wtf/unicode/UTF8.cpp', ] sources['wtf/unicode/icu'] = [ 'wtf/unicode/icu/CollatorICU.cpp', ] env = Environment() building_on_win32 = env['PLATFORM'] == 'win32' or env['PLATFORM'] == 'cygwin' # Scons uses gcc when building under cygwin by default # We also have to manually force 8.0 or Scons will try and # look up what version to use using the registry and fail # due to lack of cygwin-python registry support if env['PLATFORM'] == 'cygwin': env['MSVS_VERSION'] = '8.0' # Some systems have PROGRAMFILES, some have ProgramFiles # Scons msvc tool only expects 'ProgramFiles' import os if os.getenv('PROGRAMFILES') and not os.getenv('ProgramFiles'): os.environ['ProgramFiles'] = os.getenv('PROGRAMFILES') env.Tool('msvc') env.Tool('mslink') env.Tool('mslib') # Scons is failing to carry the %PATH% value through correctly # Hack IncrediBuild into our path so cl.exe doesn't crash if env['PLATFORM'] == 'win32': env.AppendENVPath('PATH', 'c:/Program Files/Xoreax/IncrediBuild') if env['PLATFORM'] == 'darwin': sources['API'].append('API/JSStringRefCF.cpp') sources['profiler'].append('profiler/ProfilerServer.mm') sources['wtf'].append('wtf/ThreadingPthreads.cpp') sources['wtf'].append('wtf/MainThread.cpp') sources['wtf/mac'] = ['wtf/mac/MainThreadMac.mm'] sources['wtf'].append('wtf/TCSystemAlloc.cpp') sources['jit'].append('jit/ExecutableAllocatorPosix.cpp') elif building_on_win32: sources['wtf'].append('wtf/ThreadingNone.cpp') sources['jit'].append('jit/ExecutableAllocatorWin.cpp') env.Append(CPPDEFINES = ['ENABLE_JSC_MULTIPLE_THREADS=0']) derived_sources_path = 'DerivedSources/JavaScriptCore/' def DerivedSources(path): return derived_sources_path + path derived_sources_results = map(DerivedSources, [ 'ArrayPrototype.lut.h', 'DatePrototype.lut.h', 'MathObject.lut.h', 'NumberConstructor.lut.h', 'RegExpConstructor.lut.h', 'RegExpObject.lut.h', 'StringPrototype.lut.h' 'chartables.c', 'grammar.cpp', 'grammar.h', 'lexer.lut.h', ]) derived_sources_sources = [ 'runtime/ArrayPrototype.cpp', 'runtime/DatePrototype.cpp', 'runtime/MathObject.cpp', 'runtime/NumberConstructor.cpp', 'runtime/RegExpConstructor.cpp', 'runtime/RegExpObject.cpp', 'runtime/StringPrototype.cpp', 'parser/Grammar.y', 'parser/Lexer.cpp', ] # Generate DerivedSources # Make sure Windows knows where bash (and all the other cygwin commands) live if env['PLATFORM'] == 'win32': env.AppendENVPath('PATH', 'C:/cygwin/bin') env.Command(derived_sources_results, derived_sources_sources, 'bash make-generated-sources.sh') sources[derived_sources_path] = [DerivedSources('Grammar.cpp')] # Handle os-version specific build settings if env['PLATFORM'] == 'darwin': from subprocess import Popen, PIPE version_pieces = Popen(["sw_vers", "-productVersion"], stdout = PIPE).communicate()[0].split('.') if map(int, version_pieces)[:2] > (10, 5): # Dtrace doesn't exist in Tiger, and was broken in Leopard env.Command(DerivedSources('TracingDtrace.h'), 'runtime/Tracing.d', '/usr/sbin/dtrace -h -o $TARGET -s $SOURCE') # This build file builds the Chromium port for now, support for # others could be added later. env.Append(CPPDEFINES = ['BUILDING_CHROMIUM__']) # I'm not certain how many of these windows defines are actually required. if building_on_win32: env.Append(CPPDEFINES = ['_WIN32_WINNT=0x0600', 'WINVER=0x0600', 'WIN32', '_WINDOWS', 'NOMINMAX', 'UNICODE', '_UNICODE', '__STD_C', '_HAS_EXCEPTIONS=0']) # Scons out-of-the-box only supports precompiled headers for MSVC # remove this when we fix Scons to understand GCC precompiled headers if env['CC'] == 'gcc': env['CCFLAGS'] = '-include JavaScriptCorePrefix.h' # Turns out the MSVC PCH support is badly broken # env['PCH'] = 'JavaScriptCorePrefix.h' # env['PCHSTOP'] = 'JavaScriptCorePrefix.h' if env['PLATFORM'] == 'darwin': env['FRAMEWORKS'] = ['CoreFoundation', 'Foundation'] env['LIBS'] = ['icucore'] # Apple does not ship the ICU headers with Mac OS X, so WebKit includes a copy of 3.2 headers env.Append(CPPPATH = 'icu') webkit_libraries_path = "../WebKitLibraries/win/" def WebKitLibraries(path): return webkit_libraries_path + path include_paths = ['.', '..', 'ForwardingHeaders'] + sources.keys() env.Append(CPPPATH = include_paths) if building_on_win32: env.Append(CPPPATH = ['os-win32', WebKitLibraries('include')]) env.Prepend(LIBPATH = [WebKitLibraries('lib')]) env.Append(LIBS = ['icuin', 'icuuc', 'user32', 'winmm']) # Save off a copy of the environment for use with jsc jsc_env = env.Clone() if building_on_win32: env.StaticLibrary("JavaScriptCore", sources.values()) else: env.SharedLibrary("JavaScriptCore", sources.values()) env = jsc_env # Build the jsc testing shell shell_sources = ['jsc.cpp'] build_directory = '.' # This should be changed to point to wherever JavaScriptCore gets built to # It's hacky to re-use the same environment from JavaScriptCore # but it makes building on windows easier for now env['CPPPATH'] = include_paths env['LIBS'] = ['JavaScriptCore'] env['LIBPATH'] = [build_directory] if env['PLATFORM'] == 'darwin': env.Append(LIBS = ['edit']) env.Append(CPPPATH = 'icu') elif building_on_win32: env.Append(CPPPATH = ['os-win32', WebKitLibraries('include')]) env.Prepend(LIBPATH = [WebKitLibraries('lib')]) env.Append(LIBS = ['icuin', 'icuuc', 'user32', 'winmm']) env.Program('jsc', shell_sources)