a3510331ac
Review URL: https://chromiumcodereview.appspot.com//10578048 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@8935 260f80e4-7a28-3924-810f-c04153c831b5
481 lines
16 KiB
Python
Executable File
481 lines
16 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
#
|
|
# A script which will be invoked from gyp to create an SDK.
|
|
#
|
|
# Usage: create_sdk.py sdk_directory
|
|
#
|
|
# The SDK will be used either from the command-line or from the editor.
|
|
# Top structure is
|
|
#
|
|
# ..dart-sdk/
|
|
# ....bin/
|
|
# ......dart or dart.exe (executable)
|
|
# ......dart.lib (import library for VM native extensions on Windows)
|
|
# ......dart2js
|
|
# ......dart_analyzer
|
|
# ......pub
|
|
# ....include/
|
|
# ......dart_api.h
|
|
# ......dart_debugger_api.h
|
|
# ....lib/
|
|
# ......builtin/
|
|
# ........builtin_runtime.dart
|
|
# ......io/
|
|
# ........io_runtime.dart
|
|
# ........runtime/
|
|
# ......compiler/
|
|
# ......core/
|
|
# ........core_runtime.dart
|
|
# ........runtime/
|
|
# ......coreimpl/
|
|
# ........coreimpl_runtime.dart
|
|
# ........runtime/
|
|
# ......dart2js/
|
|
# ......dartdoc/
|
|
# ......isolate/
|
|
# ........isolate_{frog, runtime}.dart
|
|
# ........{frog, runtime}/
|
|
# ......dom/
|
|
# ........dom.dart
|
|
# ......html/
|
|
# ........html_frog.dart
|
|
# ........html_dartium.dart
|
|
# ......crypto/
|
|
# ........crypto.dart
|
|
# ........(implementation files)
|
|
# ......json/
|
|
# ........json_frog.dart
|
|
#.........json.dart
|
|
# ........{frog}/
|
|
# ......uri/
|
|
# ........uri.dart
|
|
# ......utf/
|
|
# ......web/
|
|
# ........web.dart
|
|
# ......(more will come here)
|
|
# ....util/
|
|
# ......analyzer/
|
|
# ........dart_analyzer.jar
|
|
# ........(third-party libraries for dart_analyzer)
|
|
# ......pub/
|
|
# ......(more will come here)
|
|
|
|
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
import tempfile
|
|
import utils
|
|
|
|
# TODO(dgrove): Only import modules following Google style guide.
|
|
from os.path import basename, dirname, join, realpath, exists, isdir
|
|
|
|
# TODO(dgrove): Only import modules following Google style guide.
|
|
from shutil import copyfile, copymode, copytree, ignore_patterns, rmtree, move
|
|
|
|
def ReplaceInFiles(paths, subs):
|
|
'''Reads a series of files, applies a series of substitutions to each, and
|
|
saves them back out. subs should by a list of (pattern, replace) tuples.'''
|
|
for path in paths:
|
|
contents = open(path).read()
|
|
for pattern, replace in subs:
|
|
contents = re.sub(pattern, replace, contents)
|
|
|
|
dest = open(path, 'w')
|
|
dest.write(contents)
|
|
dest.close()
|
|
|
|
|
|
def Copy(src, dest):
|
|
copyfile(src, dest)
|
|
copymode(src, dest)
|
|
|
|
# TODO(zundel): this excludes the analyzer from the sdk build until builders
|
|
# have all prerequisite software installed. Also update dart.gyp.
|
|
def ShouldCopyAnalyzer():
|
|
os = utils.GuessOS();
|
|
return os == 'linux' or os == 'macos'
|
|
|
|
|
|
def CopyShellScript(src_file, dest_dir):
|
|
'''Copies a shell/batch script to the given destination directory. Handles
|
|
using the appropriate platform-specific file extension.'''
|
|
file_extension = ''
|
|
if utils.GuessOS() == 'win32':
|
|
file_extension = '.bat'
|
|
|
|
src = src_file + file_extension
|
|
dest = join(dest_dir, basename(src_file) + file_extension)
|
|
Copy(src, dest)
|
|
|
|
|
|
def CopyDart2Js(build_dir, sdk_root):
|
|
'''
|
|
Install dart2js in SDK/lib/dart2js.
|
|
|
|
Currently, we copy too much stuff to this location, but the SDK's
|
|
layout matches the the layout of the part of the repository we're
|
|
dealing with here which frees us from rewriting files. The long term
|
|
plan is to align the layout of the repository and the SDK, at which
|
|
point we should be able to simplify Main below and share the dart
|
|
files between the various components to minimize SDK download size.
|
|
'''
|
|
copytree('lib', os.path.join(sdk_root, 'lib', 'dart2js', 'lib'),
|
|
ignore=ignore_patterns('.svn'))
|
|
copytree(os.path.join('corelib', 'src'),
|
|
os.path.join(sdk_root, 'lib', 'dart2js', 'corelib', 'src'),
|
|
ignore=ignore_patterns('.svn'))
|
|
copytree(os.path.join('runtime', 'lib'),
|
|
os.path.join(sdk_root, 'lib', 'dart2js', 'runtime', 'lib'),
|
|
ignore=ignore_patterns('.svn'))
|
|
copytree(os.path.join('runtime', 'bin'),
|
|
os.path.join(sdk_root, 'lib', 'dart2js', 'runtime', 'bin'),
|
|
ignore=ignore_patterns('.svn'))
|
|
if utils.GuessOS() == 'win32':
|
|
dart2js = os.path.join(sdk_root, 'bin', 'dart2js.bat')
|
|
Copy(os.path.join(build_dir, 'dart2js.bat'), dart2js)
|
|
ReplaceInFiles([dart2js],
|
|
[(r'%SCRIPTPATH%\.\.\\lib',
|
|
r'%SCRIPTPATH%..\lib\dart2js\lib')])
|
|
else:
|
|
dart2js = os.path.join(sdk_root, 'bin', 'dart2js')
|
|
Copy(os.path.join(build_dir, 'dart2js'), dart2js)
|
|
ReplaceInFiles([dart2js],
|
|
[(r'\$BIN_DIR/\.\./\.\./lib',
|
|
r'$BIN_DIR/../lib/dart2js/lib')])
|
|
|
|
|
|
def Main(argv):
|
|
# Pull in all of the gpyi files which will be munged into the sdk.
|
|
builtin_runtime_sources = \
|
|
(eval(open("runtime/bin/builtin_sources.gypi").read()))['sources']
|
|
io_runtime_sources = \
|
|
(eval(open("runtime/bin/io_sources.gypi").read()))['sources']
|
|
corelib_sources = \
|
|
(eval(open("corelib/src/corelib_sources.gypi").read()))['sources']
|
|
corelib_runtime_sources = \
|
|
(eval(open("runtime/lib/lib_sources.gypi").read()))['sources']
|
|
coreimpl_sources = \
|
|
(eval(open("corelib/src/implementation/corelib_impl_sources.gypi").read()))\
|
|
['sources']
|
|
coreimpl_runtime_sources = \
|
|
(eval(open("runtime/lib/lib_impl_sources.gypi").read()))['sources']
|
|
|
|
HOME = dirname(dirname(realpath(__file__)))
|
|
|
|
SDK_tmp = tempfile.mkdtemp()
|
|
SDK = argv[1]
|
|
|
|
# TODO(dgrove) - deal with architectures that are not ia32.
|
|
|
|
if exists(SDK):
|
|
rmtree(SDK)
|
|
|
|
# Create and populate sdk/bin.
|
|
BIN = join(SDK_tmp, 'bin')
|
|
os.makedirs(BIN)
|
|
|
|
# Copy the Dart VM binary and the Windows Dart VM link library
|
|
# into sdk/bin.
|
|
#
|
|
# TODO(dgrove) - deal with architectures that are not ia32.
|
|
build_dir = os.path.dirname(argv[1])
|
|
dart_file_extension = ''
|
|
analyzer_file_extension = ''
|
|
if utils.GuessOS() == 'win32':
|
|
dart_file_extension = '.exe'
|
|
analyzer_file_extension = '.bat' # TODO(zundel): test on Windows
|
|
dart_import_lib_src = join(HOME, build_dir, 'dart.lib')
|
|
dart_import_lib_dest = join(BIN, 'dart.lib')
|
|
copyfile(dart_import_lib_src, dart_import_lib_dest)
|
|
dart_src_binary = join(HOME, build_dir, 'dart' + dart_file_extension)
|
|
dart_dest_binary = join(BIN, 'dart' + dart_file_extension)
|
|
copyfile(dart_src_binary, dart_dest_binary)
|
|
copymode(dart_src_binary, dart_dest_binary)
|
|
|
|
if ShouldCopyAnalyzer():
|
|
# Copy analyzer into sdk/bin
|
|
ANALYZER_HOME = join(HOME, build_dir, 'analyzer')
|
|
dart_analyzer_src_binary = join(ANALYZER_HOME, 'bin', 'dart_analyzer')
|
|
dart_analyzer_dest_binary = join(BIN,
|
|
'dart_analyzer' + analyzer_file_extension)
|
|
copyfile(dart_analyzer_src_binary, dart_analyzer_dest_binary)
|
|
copymode(dart_analyzer_src_binary, dart_analyzer_dest_binary)
|
|
|
|
# Create pub shell script.
|
|
pub_src_script = join(HOME, 'utils', 'pub', 'sdk', 'pub')
|
|
CopyShellScript(pub_src_script, BIN)
|
|
|
|
#
|
|
# Create and populate sdk/include.
|
|
#
|
|
INCLUDE = join(SDK_tmp, 'include')
|
|
os.makedirs(INCLUDE)
|
|
copyfile(join(HOME, 'runtime', 'include', 'dart_api.h'),
|
|
join(INCLUDE, 'dart_api.h'))
|
|
copyfile(join(HOME, 'runtime', 'include', 'dart_debugger_api.h'),
|
|
join(INCLUDE, 'dart_debugger_api.h'))
|
|
|
|
#
|
|
# Create and populate sdk/lib.
|
|
#
|
|
|
|
LIB = join(SDK_tmp, 'lib')
|
|
os.makedirs(LIB)
|
|
corelib_dest_dir = join(LIB, 'core')
|
|
os.makedirs(corelib_dest_dir)
|
|
os.makedirs(join(corelib_dest_dir, 'runtime'))
|
|
|
|
coreimpl_dest_dir = join(LIB, 'coreimpl')
|
|
os.makedirs(coreimpl_dest_dir)
|
|
os.makedirs(join(coreimpl_dest_dir, 'runtime'))
|
|
|
|
|
|
#
|
|
# Create and populate lib/builtin.
|
|
#
|
|
builtin_dest_dir = join(LIB, 'builtin')
|
|
os.makedirs(builtin_dest_dir)
|
|
assert len(builtin_runtime_sources) == 1
|
|
assert builtin_runtime_sources[0] == 'builtin.dart'
|
|
copyfile(join(HOME, 'runtime', 'bin', 'builtin.dart'),
|
|
join(builtin_dest_dir, 'builtin_runtime.dart'))
|
|
#
|
|
# rename the print function in dart:builtin
|
|
# so that it does not conflict with the print function in dart:core
|
|
#
|
|
ReplaceInFiles([
|
|
join(builtin_dest_dir, 'builtin_runtime.dart')
|
|
], [
|
|
('void print\(', 'void builtinPrint(')
|
|
])
|
|
|
|
#
|
|
# Create and populate lib/io.
|
|
#
|
|
io_dest_dir = join(LIB, 'io')
|
|
os.makedirs(io_dest_dir)
|
|
os.makedirs(join(io_dest_dir, 'runtime'))
|
|
for filename in io_runtime_sources:
|
|
assert filename.endswith('.dart')
|
|
if filename == 'io.dart':
|
|
copyfile(join(HOME, 'runtime', 'bin', filename),
|
|
join(io_dest_dir, 'io_runtime.dart'))
|
|
else:
|
|
copyfile(join(HOME, 'runtime', 'bin', filename),
|
|
join(io_dest_dir, 'runtime', filename))
|
|
|
|
# Construct lib/io/io_runtime.dart from whole cloth.
|
|
dest_file = open(join(io_dest_dir, 'io_runtime.dart'), 'a')
|
|
for filename in io_runtime_sources:
|
|
assert filename.endswith('.dart')
|
|
if filename == 'io.dart':
|
|
continue
|
|
dest_file.write('#source("runtime/' + filename + '");\n')
|
|
dest_file.close()
|
|
|
|
#
|
|
# Create and populate lib/compiler.
|
|
#
|
|
compiler_src_dir = join(HOME, 'lib', 'compiler')
|
|
compiler_dest_dir = join(LIB, 'compiler')
|
|
|
|
copytree(compiler_src_dir, compiler_dest_dir, ignore=ignore_patterns('.svn'))
|
|
|
|
# Remap imports in lib/compiler/* .
|
|
for (dirpath, subdirs, filenames) in os.walk(compiler_dest_dir):
|
|
for filename in filenames:
|
|
if filename.endswith('.dart'):
|
|
filename = join(dirpath, filename)
|
|
file_contents = open(filename).read()
|
|
file = open(filename, 'w')
|
|
file_contents = re.sub(r"\.\./lib", "..", file_contents)
|
|
file.write(file_contents)
|
|
file.close()
|
|
|
|
#
|
|
# Create and populate lib/html.
|
|
#
|
|
html_src_dir = join(HOME, 'lib', 'html')
|
|
html_dest_dir = join(LIB, 'html')
|
|
os.makedirs(html_dest_dir)
|
|
|
|
copyfile(join(html_src_dir, 'frog', 'html_frog.dart'),
|
|
join(html_dest_dir, 'html_frog.dart'))
|
|
copyfile(join(html_src_dir, 'dartium', 'html_dartium.dart'),
|
|
join(html_dest_dir, 'html_dartium.dart'))
|
|
copyfile(join(html_src_dir, 'dartium', 'nativewrappers.dart'),
|
|
join(html_dest_dir, 'nativewrappers.dart'))
|
|
|
|
#
|
|
# Create and populate lib/dom.
|
|
#
|
|
dom_src_dir = join(HOME, 'lib', 'dom')
|
|
dom_dest_dir = join(LIB, 'dom')
|
|
os.makedirs(dom_dest_dir)
|
|
|
|
copyfile(join(dom_src_dir, 'frog', 'dom_frog.dart'),
|
|
join(dom_dest_dir, 'dom_frog.dart'))
|
|
|
|
#
|
|
# Create and populate lib/{crypto, json, uri, utf, ...}.
|
|
#
|
|
|
|
for library in ['crypto', 'json', 'unittest', 'uri', 'utf', 'i18n', 'web']:
|
|
src_dir = join(HOME, 'lib', library)
|
|
dest_dir = join(LIB, library)
|
|
os.makedirs(dest_dir)
|
|
|
|
for filename in os.listdir(src_dir):
|
|
if filename.endswith('.dart'):
|
|
copyfile(join(src_dir, filename), join(dest_dir, filename))
|
|
|
|
# Create and populate lib/dartdoc.
|
|
dartdoc_src_dir = join(HOME, 'lib', 'dartdoc')
|
|
dartdoc_dest_dir = join(LIB, 'dartdoc')
|
|
copytree(dartdoc_src_dir, dartdoc_dest_dir,
|
|
ignore=ignore_patterns('.svn', 'docs'))
|
|
|
|
# Fixup frog dependencies.
|
|
ReplaceInFiles([join(LIB, 'dartdoc', 'dartdoc.dart')], [
|
|
("'dart2js'", "joinPaths(scriptDir, '../../bin/dart2js')"),
|
|
])
|
|
ReplaceInFiles([join(LIB, 'dartdoc', 'frog', 'frog_options.dart')], [
|
|
("final config = \'dev\';", "final config = \'sdk\';")
|
|
])
|
|
ReplaceInFiles([join(LIB, 'dartdoc', 'frog', 'lib', 'corelib.dart')], [
|
|
("../../../../corelib/src/", "../../../core/runtime/")
|
|
]);
|
|
ReplaceInFiles([join(LIB, 'dartdoc', 'frog', 'lib', 'corelib_impl.dart')], [
|
|
("../../../../corelib/src/implementation", "../../../coreimpl/runtime/")
|
|
]);
|
|
|
|
# Create and populate lib/isolate
|
|
copytree(join(HOME, 'lib', 'isolate'), join(LIB, 'isolate'),
|
|
ignore=ignore_patterns('.svn'))
|
|
|
|
isolate_runtime_dir = join(LIB, 'isolate', 'runtime')
|
|
# path seems to exist when run locally, but not on builder
|
|
if not exists(isolate_runtime_dir):
|
|
os.makedirs(isolate_runtime_dir)
|
|
|
|
isolate_runtime_src = join(HOME, 'runtime', 'lib', 'isolate.dart')
|
|
isolate_runtime_dest = join(LIB, 'isolate', 'runtime', 'isolate.dart')
|
|
copyfile(isolate_runtime_src, isolate_runtime_dest)
|
|
|
|
#
|
|
# Create and populate lib/core.
|
|
#
|
|
|
|
# First, copy corelib/* to lib/runtime
|
|
for filename in corelib_sources:
|
|
for target_dir in ['runtime']:
|
|
copyfile(join('corelib', 'src', filename),
|
|
join(corelib_dest_dir, target_dir, filename))
|
|
|
|
# Next, copy the runtime library source on top of core/runtime
|
|
for filename in corelib_runtime_sources:
|
|
if filename.endswith('.dart'):
|
|
copyfile(join('runtime', 'lib', filename),
|
|
join(corelib_dest_dir, 'runtime', filename))
|
|
|
|
#
|
|
# At this point, it's time to create lib/core/core*dart .
|
|
#
|
|
# construct lib/core_runtime.dart from whole cloth.
|
|
dest_file = open(join(corelib_dest_dir, 'core_runtime.dart'), 'w')
|
|
dest_file.write('#library("dart:core");\n')
|
|
dest_file.write('#import("dart:coreimpl");\n')
|
|
for filename in corelib_sources:
|
|
dest_file.write('#source("runtime/' + filename + '");\n')
|
|
for filename in corelib_runtime_sources:
|
|
if filename.endswith('.dart'):
|
|
dest_file.write('#source("runtime/' + filename + '");\n')
|
|
# include the missing print function
|
|
dest_file.write('void print(Object arg) { /* native */ }\n')
|
|
dest_file.close()
|
|
|
|
#
|
|
# Create and populate lib/coreimpl.
|
|
#
|
|
|
|
# First, copy corelib/src/implementation to corelib/runtime.
|
|
for filename in coreimpl_sources:
|
|
for target_dir in ['runtime']:
|
|
copyfile(join('corelib', 'src', 'implementation', filename),
|
|
join(coreimpl_dest_dir, target_dir, filename))
|
|
|
|
for filename in coreimpl_runtime_sources:
|
|
if filename.endswith('.dart'):
|
|
copyfile(join('runtime', 'lib', filename),
|
|
join(coreimpl_dest_dir, 'runtime', filename))
|
|
|
|
# Construct lib/coreimpl/coreimpl_runtime.dart from whole cloth.
|
|
dest_file = open(join(coreimpl_dest_dir, 'coreimpl_runtime.dart'), 'w')
|
|
dest_file.write('#library("dart:coreimpl");\n')
|
|
for filename in coreimpl_sources:
|
|
dest_file.write('#source("runtime/' + filename + '");\n')
|
|
for filename in coreimpl_runtime_sources:
|
|
if filename.endswith('.dart'):
|
|
dest_file.write('#source("runtime/' + filename + '");\n')
|
|
dest_file.close()
|
|
|
|
# Create and copy tools.
|
|
UTIL = join(SDK_tmp, 'util')
|
|
os.makedirs(UTIL)
|
|
|
|
if ShouldCopyAnalyzer():
|
|
# Create and copy Analyzer library into 'util'
|
|
ANALYZER_DEST = join(UTIL, 'analyzer')
|
|
os.makedirs(ANALYZER_DEST)
|
|
|
|
analyzer_src_jar = join(ANALYZER_HOME, 'util', 'analyzer',
|
|
'dart_analyzer.jar')
|
|
analyzer_dest_jar = join(ANALYZER_DEST, 'dart_analyzer.jar')
|
|
copyfile(analyzer_src_jar, analyzer_dest_jar)
|
|
|
|
jarsToCopy = [ join("args4j", "2.0.12", "args4j-2.0.12.jar"),
|
|
join("guava", "r09", "guava-r09.jar"),
|
|
join("json", "r2_20080312", "json.jar") ]
|
|
for jarToCopy in jarsToCopy:
|
|
dest_dir = join (ANALYZER_DEST, os.path.dirname(jarToCopy))
|
|
os.makedirs(dest_dir)
|
|
dest_file = join (ANALYZER_DEST, jarToCopy)
|
|
src_file = join(ANALYZER_HOME, 'util', 'analyzer', jarToCopy)
|
|
copyfile(src_file, dest_file)
|
|
|
|
# Create and populate util/pub.
|
|
pub_src_dir = join(HOME, 'utils', 'pub')
|
|
pub_dst_dir = join(UTIL, 'pub')
|
|
copytree(pub_src_dir, pub_dst_dir,
|
|
ignore=ignore_patterns('.svn', 'sdk'))
|
|
|
|
# Copy import maps.
|
|
PLATFORMS = ['any', 'vm', 'dartium', 'dart2js' ]
|
|
os.makedirs(join(LIB, 'config'))
|
|
for platform in PLATFORMS:
|
|
import_src = join(HOME, 'lib', 'config', 'import_' + platform + '.config')
|
|
import_dst = join(LIB, 'config', 'import_' + platform + '.config')
|
|
copyfile(import_src, import_dst);
|
|
|
|
# Copy dart2js.
|
|
CopyDart2Js(build_dir, SDK_tmp)
|
|
|
|
# Write the 'revision' file
|
|
revision = utils.GetSVNRevision()
|
|
if revision is not None:
|
|
with open(os.path.join(SDK_tmp, 'revision'), 'w') as f:
|
|
f.write(revision + '\n')
|
|
f.close()
|
|
|
|
move(SDK_tmp, SDK)
|
|
utils.Touch(os.path.join(SDK, 'create.stamp'))
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(Main(sys.argv))
|