blob: b8e5e1ea2e4297d2a1f404fdddab9fe1c4fd84c0 [file] [log] [blame]
#!/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/
# ......_internal/
# ......core/
# ......coreimpl/
# ......crypto/
# ......html/
# ......io/
# ......isolate/
# ......json/
# ......math/
# ......mirrors/
# ......uri/
# ......utf/
# ......scalarlist/
# ....pkg/
# ......args/
# ......compiler/
# ......dartdoc/
#.......htmlescape/
# ......intl/
# ......logging/
# ......meta/
# ......unittest/
# ......(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 subprocess
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, revision):
if revision:
ReplaceInFiles([os.path.join(sdk_root, 'pkg', 'compiler',
'implementation', 'compiler.dart')],
[(r"BUILD_ID = 'build number could not be determined'",
r"BUILD_ID = '%s'" % revision)])
if utils.GuessOS() == 'win32':
dart2js = os.path.join(sdk_root, 'bin', 'dart2js.bat')
Copy(os.path.join(build_dir, 'dart2js.bat'), dart2js)
dartdoc = os.path.join(sdk_root, 'bin', 'dartdoc.bat')
Copy(os.path.join(build_dir, 'dartdoc.bat'), dartdoc)
# TODO(dgrove) - fix this once issue 4788 is addressed.
ReplaceInFiles([dart2js],
[(r'%SCRIPTPATH%\.\.\\\.\.\\lib', r'%SCRIPTPATH%..\\pkg')]);
ReplaceInFiles([dartdoc],
[(r'%SCRIPTPATH%\.\.\\\.\.\\pkg', r'%SCRIPTPATH%..\\pkg')]);
else:
dart2js = os.path.join(sdk_root, 'bin', 'dart2js')
Copy(os.path.join(build_dir, 'dart2js'), dart2js)
dartdoc = os.path.join(sdk_root, 'bin', 'dartdoc')
Copy(os.path.join(build_dir, 'dartdoc'), dartdoc)
# TODO(dgrove) - fix this once issue 4788 is addressed.
ReplaceInFiles([dart2js],
[(r'\$BIN_DIR/\.\./\.\./lib', r'$BIN_DIR/../pkg')])
ReplaceInFiles([dartdoc],
[(r'\$BIN_DIR/\.\./\.\.', r'$BIN_DIR/..')])
def Main(argv):
# Pull in all of the gpyi files which will be munged into the sdk.
io_runtime_sources = \
(eval(open("runtime/bin/io_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 utils.GuessOS() != 'win32':
subprocess.call(['strip', 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)
#
# 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/{core, crypto, isolate, json, uri, utf, ...}.
#
os.makedirs(join(LIB, 'html'))
for library in ['_internal', 'core', 'coreimpl', 'crypto', 'isolate',
join('html', 'dart2js'), join('html', 'dartium'), 'json',
'math', 'mirrors', 'scalarlist', 'uri', 'utf']:
copytree(join(HOME, 'lib', library), join(LIB, library),
ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
# Create and copy pkg.
PKG = join(SDK_tmp, 'pkg')
os.makedirs(PKG)
#
# Create and populate pkg/{args, intl, logging, meta, unittest}
#
for library in ['args', 'htmlescape', 'dartdoc', 'intl', 'logging',
'meta', 'unittest']:
copytree(join(HOME, 'pkg', library), join(PKG, library),
ignore=ignore_patterns('*.svn', 'doc', 'docs',
'*.py', '*.gypi', '*.sh'))
# TODO(dgrove): Remove this once issue 4788 is addressed.
copytree(join(HOME, 'lib', 'compiler'), join(PKG, 'compiler'),
ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
ReplaceInFiles(
[join(LIB, '_internal', 'libraries.dart')],
[('"compiler/', '"../pkg/compiler/')])
ReplaceInFiles(
[join(PKG, 'compiler', 'implementation', 'lib', 'io.dart')],
[('../../runtime/bin', '../../lib/io/runtime')])
# Fixup dartdoc
# TODO(dgrove): Remove this once issue 4788 is addressed.
ReplaceInFiles([
join(PKG, 'dartdoc', 'lib', 'src', 'mirrors', 'dart2js_mirror.dart'),
join(PKG, 'dartdoc', 'lib', 'mirrors_util.dart'),
join(PKG, 'dartdoc', 'lib', 'classify.dart'),
join(PKG, 'dartdoc', 'lib', 'src', 'client', 'client-live-nav.dart'),
join(PKG, 'dartdoc', 'lib', 'src', 'client', 'client-static.dart'),
join(PKG, 'dartdoc', 'lib', 'dartdoc.dart'),
], [
("../../lib/compiler",
"../../pkg/compiler"),
])
# 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.
copytree(join(HOME, 'utils', 'pub'), join(UTIL, 'pub'),
ignore=ignore_patterns('.svn', 'sdk'))
# Copy in 7zip for Windows.
if utils.GuessOS() == 'win32':
copytree(join(HOME, 'third_party', '7zip'),
join(join(UTIL, 'pub'), '7zip'),
ignore=ignore_patterns('.svn'))
ReplaceInFiles([
join(UTIL, 'pub', 'io.dart'),
], [
("var pathTo7zip = '../../third_party/7zip/7za.exe';",
"var pathTo7zip = '7zip/7za.exe';"),
])
revision = utils.GetSVNRevision()
# Copy dart2js.
CopyDart2Js(build_dir, SDK_tmp, revision)
# Write the 'revision' file
if revision is not None:
with open(os.path.join(SDK_tmp, 'revision'), 'w') as f:
f.write(revision + '\n')
f.close()
Copy(join(HOME, 'README.dart-sdk'), join(SDK_tmp, 'README'))
move(SDK_tmp, SDK)
if __name__ == '__main__':
sys.exit(Main(sys.argv))