Merge pull request #1405 from atom/win_64bit

Add 64bit Windows build
This commit is contained in:
Cheng Zhao 2015-04-12 13:46:05 +08:00
commit 64aaa2bcb1
24 changed files with 277 additions and 190 deletions

1
.gitignore vendored
View file

@ -10,4 +10,5 @@ node_modules/
*.xcodeproj *.xcodeproj
*.swp *.swp
*.pyc *.pyc
debug.log
npm-debug.log npm-debug.log

View file

@ -2,6 +2,7 @@
'variables': { 'variables': {
'project_name%': 'atom', 'project_name%': 'atom',
'product_name%': 'Atom', 'product_name%': 'Atom',
'version%': '0.23.0',
'atom_source_root': '<!(["python", "tools/atom_source_root.py"])', 'atom_source_root': '<!(["python", "tools/atom_source_root.py"])',
}, },
@ -142,8 +143,6 @@
'<(libchromiumcontent_dir)/natives_blob.bin', '<(libchromiumcontent_dir)/natives_blob.bin',
'<(libchromiumcontent_dir)/snapshot_blob.bin', '<(libchromiumcontent_dir)/snapshot_blob.bin',
'external_binaries/d3dcompiler_47.dll', 'external_binaries/d3dcompiler_47.dll',
'external_binaries/msvcp120.dll',
'external_binaries/msvcr120.dll',
'external_binaries/vccorlib120.dll', 'external_binaries/vccorlib120.dll',
'external_binaries/xinput1_3.dll', 'external_binaries/xinput1_3.dll',
], ],

View file

@ -17,7 +17,7 @@
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>atom.icns</string> <string>atom.icns</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>0.22.3</string> <string>0.23.0</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.8.0</string> <string>10.8.0</string>
<key>NSMainNibFile</key> <key>NSMainNibFile</key>

View file

@ -50,8 +50,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,22,3,0 FILEVERSION 0,23,0,0
PRODUCTVERSION 0,22,3,0 PRODUCTVERSION 0,23,0,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -68,12 +68,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "GitHub, Inc." VALUE "CompanyName", "GitHub, Inc."
VALUE "FileDescription", "Atom-Shell" VALUE "FileDescription", "Atom-Shell"
VALUE "FileVersion", "0.22.3" VALUE "FileVersion", "0.23.0"
VALUE "InternalName", "atom.exe" VALUE "InternalName", "atom.exe"
VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved." VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved."
VALUE "OriginalFilename", "atom.exe" VALUE "OriginalFilename", "atom.exe"
VALUE "ProductName", "Atom-Shell" VALUE "ProductName", "Atom-Shell"
VALUE "ProductVersion", "0.22.3" VALUE "ProductVersion", "0.23.0"
VALUE "SquirrelAwareVersion", "1" VALUE "SquirrelAwareVersion", "1"
END END
END END

View file

@ -6,8 +6,8 @@
#define ATOM_VERSION_H #define ATOM_VERSION_H
#define ATOM_MAJOR_VERSION 0 #define ATOM_MAJOR_VERSION 0
#define ATOM_MINOR_VERSION 22 #define ATOM_MINOR_VERSION 23
#define ATOM_PATCH_VERSION 3 #define ATOM_PATCH_VERSION 0
#define ATOM_VERSION_IS_RELEASE 1 #define ATOM_VERSION_IS_RELEASE 1

View file

@ -107,14 +107,14 @@
'OTHER_LDFLAGS': [ '-Wl,-all_load' ], 'OTHER_LDFLAGS': [ '-Wl,-all_load' ],
}, },
}], }],
['OS=="win" and libchromiumcontent_component==0', { ['OS=="win"', {
'libraries': [ '-lwinmm.lib' ], 'libraries': [ '-lwinmm.lib' ],
'msvs_settings': { 'conditions': [
'VCLinkerTool': { ['libchromiumcontent_component==0', {
# There is nothing like "whole-archive" on Windows, so we 'variables': {
# have to manually force some objets files to be included 'conditions': [
# by referencing them. ['target_arch=="ia32"', {
'ForceSymbolReferences': [ 'reference_symbols': [
'_u_errorName_52', '_u_errorName_52',
'_ubidi_setPara_52', '_ubidi_setPara_52',
'_ucsdet_getName_52', '_ucsdet_getName_52',
@ -125,10 +125,33 @@
'?createInstance@Transliterator@icu_52@@SAPAV12@ABVUnicodeString@2@W4UTransDirection@@AAW4UErrorCode@@@Z', '?createInstance@Transliterator@icu_52@@SAPAV12@ABVUnicodeString@2@W4UTransDirection@@AAW4UErrorCode@@@Z',
'?nameToUnicodeUTF8@IDNA@icu_52@@UBEXABVStringPiece@2@AAVByteSink@2@AAVIDNAInfo@2@AAW4UErrorCode@@@Z', '?nameToUnicodeUTF8@IDNA@icu_52@@UBEXABVStringPiece@2@AAVByteSink@2@AAVIDNAInfo@2@AAW4UErrorCode@@@Z',
'?kLineOffsetNotFound@Function@v8@@2HB', '?kLineOffsetNotFound@Function@v8@@2HB',
], # '/INCLUDE' ],
}, {
'reference_symbols': [
'u_errorName_52',
'ubidi_setPara_52',
'ucsdet_getName_52',
'uidna_openUTS46_52',
'ulocdata_close_52',
'uregex_matches_52',
'uscript_getCode_52',
'usearch_setPattern_52',
'?createInstance@Transliterator@icu_52@@SAPEAV12@AEBVUnicodeString@2@W4UTransDirection@@AEAW4UErrorCode@@@Z'
],
}],
],
},
'msvs_settings': {
'VCLinkerTool': {
# There is nothing like "whole-archive" on Windows, so we
# have to manually force some objets files to be included
# by referencing them.
'ForceSymbolReferences': [ '<@(reference_symbols)' ], # '/INCLUDE'
}, },
}, },
}], }],
],
}],
['OS=="linux" and libchromiumcontent_component==0', { ['OS=="linux" and libchromiumcontent_component==0', {
# Prevent the linker from stripping symbols. # Prevent the linker from stripping symbols.
'ldflags': [ 'ldflags': [
@ -192,6 +215,7 @@
4005, # (node.h) macro redefinition 4005, # (node.h) macro redefinition
4189, # local variable is initialized but not referenced 4189, # local variable is initialized but not referenced
4201, # (uv.h) nameless struct/union 4201, # (uv.h) nameless struct/union
4267, # conversion from 'size_t' to 'int', possible loss of data
4503, # decorated name length exceeded, name was truncated 4503, # decorated name length exceeded, name was truncated
4800, # (v8.h) forcing value to bool 'true' or 'false' 4800, # (v8.h) forcing value to bool 'true' or 'false'
4819, # The file contains a character that cannot be represented in the current code page 4819, # The file contains a character that cannot be represented in the current code page

View file

@ -1,15 +1,7 @@
{ {
"name": "atom-shell", "name": "atom-shell",
"version": "0.22.3",
"licenses": [
{
"type": "MIT",
"url": "http://github.com/atom/atom-shell/raw/master/LICENSE.md"
}
],
"devDependencies": { "devDependencies": {
"asar": "0.2.2", "asar": "0.2.2",
"atom-package-manager": "0.144.0",
"coffee-script": "~1.7.1", "coffee-script": "~1.7.1",
"coffeelint": "~1.3.0", "coffeelint": "~1.3.0",
"request": "*", "request": "*",

View file

@ -4,9 +4,9 @@ import argparse
import os import os
import sys import sys
from lib.config import LIBCHROMIUMCONTENT_COMMIT, BASE_URL, \ from lib.config import LIBCHROMIUMCONTENT_COMMIT, BASE_URL, PLATFORM, \
enable_verbose_mode, is_verbose_mode enable_verbose_mode, is_verbose_mode, get_target_arch
from lib.util import execute_stdout, scoped_cwd from lib.util import execute_stdout, get_atom_shell_version, scoped_cwd
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
@ -19,8 +19,7 @@ def main():
os.chdir(SOURCE_ROOT) os.chdir(SOURCE_ROOT)
args = parse_args() args = parse_args()
if (args.yes is False and if not args.yes and PLATFORM != 'win32':
sys.platform not in ('win32', 'cygwin')):
check_root() check_root()
if args.verbose: if args.verbose:
enable_verbose_mode() enable_verbose_mode()
@ -28,12 +27,12 @@ def main():
update_win32_python() update_win32_python()
update_submodules() update_submodules()
update_node_modules('.') update_node_modules('.')
bootstrap_brightray(args.dev, args.url) bootstrap_brightray(args.dev, args.url, args.target_arch)
create_chrome_version_h() create_chrome_version_h()
touch_config_gypi() touch_config_gypi()
update_atom_shell() update_atom_shell()
update_atom_modules('spec') update_atom_modules('spec', args.target_arch)
def parse_args(): def parse_args():
@ -53,8 +52,11 @@ def parse_args():
action='store_true', action='store_true',
help='Run non-interactively by assuming "yes" to all ' \ help='Run non-interactively by assuming "yes" to all ' \
'prompts.') 'prompts.')
parser.add_argument('--target_arch', default=get_target_arch(),
help='Manually specify the arch to build for')
return parser.parse_args() return parser.parse_args()
def check_root(): def check_root():
if os.geteuid() == 0: if os.geteuid() == 0:
print "We suggest not running this as root, unless you're really sure." print "We suggest not running this as root, unless you're really sure."
@ -68,29 +70,34 @@ def update_submodules():
execute_stdout(['git', 'submodule', 'update', '--init', '--recursive']) execute_stdout(['git', 'submodule', 'update', '--init', '--recursive'])
def bootstrap_brightray(is_dev, url): def bootstrap_brightray(is_dev, url, target_arch):
bootstrap = os.path.join(VENDOR_DIR, 'brightray', 'script', 'bootstrap') bootstrap = os.path.join(VENDOR_DIR, 'brightray', 'script', 'bootstrap')
args = ['--commit', LIBCHROMIUMCONTENT_COMMIT, url] args = [
'--commit', LIBCHROMIUMCONTENT_COMMIT,
'--target_arch', target_arch,
url,
]
if is_dev: if is_dev:
args = ['--dev'] + args args = ['--dev'] + args
execute_stdout([sys.executable, bootstrap] + args) execute_stdout([sys.executable, bootstrap] + args)
def update_node_modules(dirname): def update_node_modules(dirname, env=None):
if env is None:
env = os.environ
with scoped_cwd(dirname): with scoped_cwd(dirname):
if is_verbose_mode(): if is_verbose_mode():
execute_stdout([NPM, 'install', '--verbose']) execute_stdout([NPM, 'install', '--verbose'], env)
else: else:
execute_stdout([NPM, 'install']) execute_stdout([NPM, 'install'], env)
def update_atom_modules(dirname): def update_atom_modules(dirname, target_arch):
with scoped_cwd(dirname): env = os.environ.copy()
apm = os.path.join(SOURCE_ROOT, 'node_modules', '.bin', 'apm') env['npm_config_arch'] = target_arch
if sys.platform in ['win32', 'cygwin']: env['npm_config_target'] = get_atom_shell_version()
apm = os.path.join(SOURCE_ROOT, 'node_modules', 'atom-package-manager', env['npm_config_disturl'] = 'https://atom.io/download/atom-shell'
'bin', 'apm.cmd') update_node_modules(dirname, env)
execute_stdout([apm, 'install'])
def update_win32_python(): def update_win32_python():

View file

@ -27,12 +27,11 @@ def main():
version = '.'.join(versions[:3]) version = '.'.join(versions[:3])
with scoped_cwd(SOURCE_ROOT): with scoped_cwd(SOURCE_ROOT):
update_package_json(version) update_atom_gyp(version)
update_win_rc(version, versions) update_win_rc(version, versions)
update_version_h(versions) update_version_h(versions)
update_info_plist(version) update_info_plist(version)
tag_version(version) tag_version(version)
git_push()
def increase_version(versions, index): def increase_version(versions, index):
@ -42,15 +41,15 @@ def increase_version(versions, index):
return versions return versions
def update_package_json(version): def update_atom_gyp(version):
pattern = re.compile(' *"version" *: *"[0-9.]+"') pattern = re.compile(" *'version%' *: *'[0-9.]+'")
with open('package.json', 'r') as f: with open('atom.gyp', 'r') as f:
lines = f.readlines() lines = f.readlines()
for i in range(0, len(lines)): for i in range(0, len(lines)):
if pattern.match(lines[i]): if pattern.match(lines[i]):
lines[i] = ' "version": "{0}",\n'.format(version) lines[i] = " 'version%': '{0}',\n".format(version)
with open('package.json', 'w') as f: with open('atom.gyp', 'w') as f:
f.write(''.join(lines)) f.write(''.join(lines))
return return
@ -118,10 +117,5 @@ def tag_version(version):
execute(['git', 'tag', 'v{0}'.format(version)]) execute(['git', 'tag', 'v{0}'.format(version)])
def git_push():
execute(['git', 'push'])
execute(['git', 'push', '--tags'])
if __name__ == '__main__': if __name__ == '__main__':
sys.exit(main()) sys.exit(main())

20
script/clean.py Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env python
import os
import sys
from lib.util import rm_rf
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
def main():
os.chdir(SOURCE_ROOT)
rm_rf('node_modules')
rm_rf('out')
rm_rf('spec/node_modules')
if __name__ == '__main__':
sys.exit(main())

View file

@ -7,8 +7,8 @@ import subprocess
import sys import sys
import stat import stat
from lib.config import LIBCHROMIUMCONTENT_COMMIT, BASE_URL, TARGET_PLATFORM, \ from lib.config import LIBCHROMIUMCONTENT_COMMIT, BASE_URL, PLATFORM, \
DIST_ARCH get_target_arch
from lib.util import scoped_cwd, rm_rf, get_atom_shell_version, make_zip, \ from lib.util import scoped_cwd, rm_rf, get_atom_shell_version, make_zip, \
execute, get_chromedriver_version execute, get_chromedriver_version
@ -79,7 +79,7 @@ def main():
copy_chromedriver() copy_chromedriver()
copy_license() copy_license()
if TARGET_PLATFORM == 'linux': if PLATFORM == 'linux':
strip_binaries() strip_binaries()
copy_system_libraries() copy_system_libraries()
@ -95,17 +95,17 @@ def force_build():
def copy_binaries(): def copy_binaries():
for binary in TARGET_BINARIES[TARGET_PLATFORM]: for binary in TARGET_BINARIES[PLATFORM]:
shutil.copy2(os.path.join(OUT_DIR, binary), DIST_DIR) shutil.copy2(os.path.join(OUT_DIR, binary), DIST_DIR)
for directory in TARGET_DIRECTORIES[TARGET_PLATFORM]: for directory in TARGET_DIRECTORIES[PLATFORM]:
shutil.copytree(os.path.join(OUT_DIR, directory), shutil.copytree(os.path.join(OUT_DIR, directory),
os.path.join(DIST_DIR, directory), os.path.join(DIST_DIR, directory),
symlinks=True) symlinks=True)
def copy_chromedriver(): def copy_chromedriver():
if TARGET_PLATFORM == 'win32': if PLATFORM == 'win32':
chromedriver = 'chromedriver.exe' chromedriver = 'chromedriver.exe'
else: else:
chromedriver = 'chromedriver' chromedriver = 'chromedriver'
@ -122,7 +122,7 @@ def copy_license():
def strip_binaries(): def strip_binaries():
for binary in TARGET_BINARIES[TARGET_PLATFORM]: for binary in TARGET_BINARIES[PLATFORM]:
if binary.endswith('.so') or '.' not in binary: if binary.endswith('.so') or '.' not in binary:
execute(['strip', os.path.join(DIST_DIR, binary)]) execute(['strip', os.path.join(DIST_DIR, binary)])
@ -155,25 +155,25 @@ def create_symbols():
def create_dist_zip(): def create_dist_zip():
dist_name = 'atom-shell-{0}-{1}-{2}.zip'.format(ATOM_SHELL_VERSION, dist_name = 'atom-shell-{0}-{1}-{2}.zip'.format(ATOM_SHELL_VERSION,
TARGET_PLATFORM, DIST_ARCH) PLATFORM, get_target_arch())
zip_file = os.path.join(SOURCE_ROOT, 'dist', dist_name) zip_file = os.path.join(SOURCE_ROOT, 'dist', dist_name)
with scoped_cwd(DIST_DIR): with scoped_cwd(DIST_DIR):
files = TARGET_BINARIES[TARGET_PLATFORM] + ['LICENSE', 'version'] files = TARGET_BINARIES[PLATFORM] + ['LICENSE', 'version']
if TARGET_PLATFORM == 'linux': if PLATFORM == 'linux':
files += [lib for lib in SYSTEM_LIBRARIES if os.path.exists(lib)] files += [lib for lib in SYSTEM_LIBRARIES if os.path.exists(lib)]
dirs = TARGET_DIRECTORIES[TARGET_PLATFORM] dirs = TARGET_DIRECTORIES[PLATFORM]
make_zip(zip_file, files, dirs) make_zip(zip_file, files, dirs)
def create_chromedriver_zip(): def create_chromedriver_zip():
dist_name = 'chromedriver-{0}-{1}-{2}.zip'.format(get_chromedriver_version(), dist_name = 'chromedriver-{0}-{1}-{2}.zip'.format(get_chromedriver_version(),
TARGET_PLATFORM, DIST_ARCH) PLATFORM, get_target_arch())
zip_file = os.path.join(SOURCE_ROOT, 'dist', dist_name) zip_file = os.path.join(SOURCE_ROOT, 'dist', dist_name)
with scoped_cwd(DIST_DIR): with scoped_cwd(DIST_DIR):
files = ['LICENSE'] files = ['LICENSE']
if TARGET_PLATFORM == 'win32': if PLATFORM == 'win32':
files += ['chromedriver.exe'] files += ['chromedriver.exe']
else: else:
files += ['chromedriver'] files += ['chromedriver']
@ -182,8 +182,8 @@ def create_chromedriver_zip():
def create_symbols_zip(): def create_symbols_zip():
dist_name = 'atom-shell-{0}-{1}-{2}-symbols.zip'.format(ATOM_SHELL_VERSION, dist_name = 'atom-shell-{0}-{1}-{2}-symbols.zip'.format(ATOM_SHELL_VERSION,
TARGET_PLATFORM, PLATFORM,
DIST_ARCH) get_target_arch())
zip_file = os.path.join(SOURCE_ROOT, 'dist', dist_name) zip_file = os.path.join(SOURCE_ROOT, 'dist', dist_name)
with scoped_cwd(DIST_DIR): with scoped_cwd(DIST_DIR):

View file

@ -3,8 +3,8 @@
import os import os
import sys import sys
from lib.config import TARGET_PLATFORM from lib.config import PLATFORM
from lib.util import execute, rm_rf from lib.util import atom_gyp, execute, rm_rf
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
@ -15,20 +15,20 @@ CHROMIUM_DIR = os.path.join(SOURCE_ROOT, 'vendor', 'brightray', 'vendor',
def main(destination): def main(destination):
if TARGET_PLATFORM == 'win32': if PLATFORM == 'win32':
register_required_dll() register_required_dll()
rm_rf(destination) rm_rf(destination)
(project_name, product_name) = get_names_from_gyp() (project_name, product_name) = get_names_from_gyp()
if TARGET_PLATFORM in ['darwin', 'linux']: if PLATFORM in ['darwin', 'linux']:
# Generate the dump_syms tool. # Generate the dump_syms tool.
build = os.path.join(SOURCE_ROOT, 'script', 'build.py') build = os.path.join(SOURCE_ROOT, 'script', 'build.py')
execute([sys.executable, build, '-c', 'R', '-t', 'dump_syms']) execute([sys.executable, build, '-c', 'R', '-t', 'dump_syms'])
generate_breakpad_symbols = os.path.join(SOURCE_ROOT, 'tools', 'posix', generate_breakpad_symbols = os.path.join(SOURCE_ROOT, 'tools', 'posix',
'generate_breakpad_symbols.py') 'generate_breakpad_symbols.py')
if TARGET_PLATFORM == 'darwin': if PLATFORM == 'darwin':
start = os.path.join(OUT_DIR, '{0}.app'.format(product_name), 'Contents', start = os.path.join(OUT_DIR, '{0}.app'.format(product_name), 'Contents',
'MacOS', product_name) 'MacOS', product_name)
else: else:
@ -60,10 +60,8 @@ def register_required_dll():
def get_names_from_gyp(): def get_names_from_gyp():
gyp = os.path.join(SOURCE_ROOT, 'atom.gyp') variables = atom_gyp()
with open(gyp) as f: return (variables['project_name%'], variables['product_name%'])
o = eval(f.read());
return (o['variables']['project_name%'], o['variables']['product_name%'])
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -1,23 +1,15 @@
#!/usr/bin/env python #!/usr/bin/env python
import errno
import os
import platform import platform
import sys import sys
BASE_URL = 'http://gh-contractor-zcbenz.s3.amazonaws.com/libchromiumcontent' BASE_URL = 'http://gh-contractor-zcbenz.s3.amazonaws.com/libchromiumcontent'
LIBCHROMIUMCONTENT_COMMIT = 'f1ad1412461ba3345a27cfe935ffc872dba0ac5b' LIBCHROMIUMCONTENT_COMMIT = 'f1ad1412461ba3345a27cfe935ffc872dba0ac5b'
ARCH = { PLATFORM = {
'cygwin': '32bit',
'darwin': '64bit',
'linux2': platform.architecture()[0],
'win32': '32bit',
}[sys.platform]
DIST_ARCH = {
'32bit': 'ia32',
'64bit': 'x64',
}[ARCH]
TARGET_PLATFORM = {
'cygwin': 'win32', 'cygwin': 'win32',
'darwin': 'darwin', 'darwin': 'darwin',
'linux2': 'linux', 'linux2': 'linux',
@ -26,10 +18,51 @@ TARGET_PLATFORM = {
verbose_mode = False verbose_mode = False
def get_target_arch():
# Always build 64bit on OS X.
if PLATFORM == 'darwin':
return 'x64'
# Only build for host's arch on Linux.
elif PLATFORM == 'linux':
if platform.architecture()[0] == '32bit':
return 'ia32'
else:
return 'x64'
# On Windows it depends on user.
elif PLATFORM == 'win32':
try:
target_arch_path = os.path.join(__file__, '..', '..', '..', 'vendor',
'brightray', 'vendor', 'download',
'libchromiumcontent', '.target_arch')
with open(os.path.normpath(target_arch_path)) as f:
return f.read().strip()
except IOError as e:
if e.errno != errno.ENOENT:
raise
# Build 32bit by default.
return 'ia32'
# Maybe we will support other platforms in future.
else:
return 'x64'
def s3_config():
config = (os.environ.get('ATOM_SHELL_S3_BUCKET', ''),
os.environ.get('ATOM_SHELL_S3_ACCESS_KEY', ''),
os.environ.get('ATOM_SHELL_S3_SECRET_KEY', ''))
message = ('Error: Please set the $ATOM_SHELL_S3_BUCKET, '
'$ATOM_SHELL_S3_ACCESS_KEY, and '
'$ATOM_SHELL_S3_SECRET_KEY environment variables')
assert all(len(c) for c in config), message
return config
def enable_verbose_mode(): def enable_verbose_mode():
print 'Running in verbose mode' print 'Running in verbose mode'
global verbose_mode global verbose_mode
verbose_mode = True verbose_mode = True
def is_verbose_mode(): def is_verbose_mode():
return verbose_mode return verbose_mode

View file

@ -129,11 +129,11 @@ def safe_mkdir(path):
raise raise
def execute(argv): def execute(argv, env=os.environ):
if is_verbose_mode(): if is_verbose_mode():
print ' '.join(argv) print ' '.join(argv)
try: try:
output = subprocess.check_output(argv, stderr=subprocess.STDOUT) output = subprocess.check_output(argv, stderr=subprocess.STDOUT, env=env)
if is_verbose_mode(): if is_verbose_mode():
print output print output
return output return output
@ -142,20 +142,28 @@ def execute(argv):
raise e raise e
def execute_stdout(argv): def execute_stdout(argv, env=os.environ):
if is_verbose_mode(): if is_verbose_mode():
print ' '.join(argv) print ' '.join(argv)
try: try:
subprocess.check_call(argv) subprocess.check_call(argv, env=env)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
print e.output print e.output
raise e raise e
else: else:
execute(argv) execute(argv, env)
def atom_gyp():
SOURCE_ROOT = os.path.abspath(os.path.join(__file__, '..', '..', '..'))
gyp = os.path.join(SOURCE_ROOT, 'atom.gyp')
with open(gyp) as f:
obj = eval(f.read());
return obj['variables']
def get_atom_shell_version(): def get_atom_shell_version():
return subprocess.check_output(['git', 'describe', '--tags']).strip() return atom_gyp()['version%']
def get_chromedriver_version(): def get_chromedriver_version():
@ -176,17 +184,6 @@ def parse_version(version):
return vs + ['0'] * (4 - len(vs)) return vs + ['0'] * (4 - len(vs))
def s3_config():
config = (os.environ.get('ATOM_SHELL_S3_BUCKET', ''),
os.environ.get('ATOM_SHELL_S3_ACCESS_KEY', ''),
os.environ.get('ATOM_SHELL_S3_SECRET_KEY', ''))
message = ('Error: Please set the $ATOM_SHELL_S3_BUCKET, '
'$ATOM_SHELL_S3_ACCESS_KEY, and '
'$ATOM_SHELL_S3_SECRET_KEY environment variables')
assert all(len(c) for c in config), message
return config
def s3put(bucket, access_key, secret_key, prefix, key_prefix, files): def s3put(bucket, access_key, secret_key, prefix, key_prefix, files):
args = [ args = [
's3put', 's3put',

View file

@ -4,7 +4,7 @@ import os
import subprocess import subprocess
import sys import sys
from lib.config import DIST_ARCH from lib.config import get_target_arch
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
@ -23,14 +23,6 @@ def update_external_binaries():
def update_gyp(): def update_gyp():
target_arch = DIST_ARCH
if sys.platform == 'darwin':
# Only have 64bit build on OS X.
target_arch = 'x64'
elif sys.platform in ['cygwin', 'win32']:
# Only have 32bit build on Windows.
target_arch = 'ia32'
# Since gyp doesn't support specify link_settings for each configuration, # Since gyp doesn't support specify link_settings for each configuration,
# we are not able to link to different libraries in "Debug" and "Release" # we are not able to link to different libraries in "Debug" and "Release"
# configurations. # configurations.
@ -38,6 +30,7 @@ def update_gyp():
# for twice, one is to generate "Debug" config, the other one to generate # for twice, one is to generate "Debug" config, the other one to generate
# the "Release" config. And the settings are controlled by the variable # the "Release" config. And the settings are controlled by the variable
# "libchromiumcontent_component" which is defined before running gyp. # "libchromiumcontent_component" which is defined before running gyp.
target_arch = get_target_arch()
return (run_gyp(target_arch, 0) or run_gyp(target_arch, 1)) return (run_gyp(target_arch, 0) or run_gyp(target_arch, 1))

View file

@ -5,7 +5,8 @@ import hashlib
import os import os
import tempfile import tempfile
from lib.util import download, rm_rf, s3_config, s3put from lib.config import s3_config
from lib.util import download, rm_rf, s3put
DIST_URL = 'https://atom.io/download/atom-shell/' DIST_URL = 'https://atom.io/download/atom-shell/'

31
script/upload-index-json.py Executable file
View file

@ -0,0 +1,31 @@
#!/usr/bin/env python
import os
import sys
from lib.config import PLATFORM, s3_config
from lib.util import execute, s3put, scoped_cwd
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
OUT_DIR = os.path.join(SOURCE_ROOT, 'out', 'R')
def main():
# Upload the index.json.
with scoped_cwd(SOURCE_ROOT):
atom_shell = os.path.join(OUT_DIR, 'atom')
if PLATFORM == 'win32':
atom_shell += '.exe'
index_json = os.path.relpath(os.path.join(OUT_DIR, 'index.json'))
execute([atom_shell,
os.path.join('tools', 'dump-version-info.js'),
index_json])
bucket, access_key, secret_key = s3_config()
s3put(bucket, access_key, secret_key, OUT_DIR, 'atom-shell/dist',
[index_json])
if __name__ == '__main__':
sys.exit(main())

View file

@ -7,8 +7,8 @@ import shutil
import sys import sys
import tarfile import tarfile
from lib.config import TARGET_PLATFORM from lib.config import PLATFORM, get_target_arch, s3_config
from lib.util import execute, safe_mkdir, scoped_cwd, s3_config, s3put from lib.util import execute, safe_mkdir, scoped_cwd, s3put
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
@ -47,11 +47,6 @@ def main():
bucket, access_key, secret_key = s3_config() bucket, access_key, secret_key = s3_config()
upload_node(bucket, access_key, secret_key, args.version) upload_node(bucket, access_key, secret_key, args.version)
# Upload the SHASUMS.txt.
execute([sys.executable,
os.path.join(SOURCE_ROOT, 'script', 'upload-checksums.py'),
'-v', args.version])
def parse_args(): def parse_args():
parser = argparse.ArgumentParser(description='upload sumsha file') parser = argparse.ArgumentParser(description='upload sumsha file')
@ -109,39 +104,21 @@ def upload_node(bucket, access_key, secret_key, version):
s3put(bucket, access_key, secret_key, DIST_DIR, s3put(bucket, access_key, secret_key, DIST_DIR,
'atom-shell/dist/{0}'.format(version), glob.glob('node-*.tar.gz')) 'atom-shell/dist/{0}'.format(version), glob.glob('node-*.tar.gz'))
if TARGET_PLATFORM == 'win32': if PLATFORM == 'win32':
if get_target_arch() == 'ia32':
node_lib = os.path.join(DIST_DIR, 'node.lib')
else:
node_lib = os.path.join(DIST_DIR, 'x64', 'node.lib')
safe_mkdir(os.path.dirname(node_lib))
# Copy atom.lib to node.lib # Copy atom.lib to node.lib
node_lib = os.path.join(OUT_DIR, 'node.lib')
atom_lib = os.path.join(OUT_DIR, 'node.dll.lib') atom_lib = os.path.join(OUT_DIR, 'node.dll.lib')
shutil.copy2(atom_lib, node_lib) shutil.copy2(atom_lib, node_lib)
# Upload the 32bit node.lib. # Upload the node.lib.
s3put(bucket, access_key, secret_key, OUT_DIR, s3put(bucket, access_key, secret_key, DIST_DIR,
'atom-shell/dist/{0}'.format(version), [node_lib]) 'atom-shell/dist/{0}'.format(version), [node_lib])
# Upload the fake 64bit node.lib.
touch_x64_node_lib()
node_lib = os.path.join(OUT_DIR, 'x64', 'node.lib')
s3put(bucket, access_key, secret_key, OUT_DIR,
'atom-shell/dist/{0}'.format(version), [node_lib])
# Upload the index.json
with scoped_cwd(SOURCE_ROOT):
atom_shell = os.path.join(OUT_DIR, 'atom.exe')
index_json = os.path.relpath(os.path.join(OUT_DIR, 'index.json'))
execute([atom_shell,
os.path.join('script', 'dump-version-info.js'),
index_json])
s3put(bucket, access_key, secret_key, OUT_DIR, 'atom-shell/dist',
[index_json])
def touch_x64_node_lib():
x64_dir = os.path.join(OUT_DIR, 'x64')
safe_mkdir(x64_dir)
with open(os.path.join(x64_dir, 'node.lib'), 'w+') as node_lib:
node_lib.write('Invalid library')
if __name__ == '__main__': if __name__ == '__main__':
sys.exit(main()) sys.exit(main())

View file

@ -3,7 +3,8 @@
import os import os
import glob import glob
from lib.util import execute, rm_rf, safe_mkdir, s3put, s3_config from lib.config import s3_config
from lib.util import execute, rm_rf, safe_mkdir, s3put
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
@ -11,6 +12,7 @@ SYMBOLS_DIR = 'dist\\symbols'
DOWNLOAD_DIR = 'vendor\\brightray\\vendor\\download\\libchromiumcontent' DOWNLOAD_DIR = 'vendor\\brightray\\vendor\\download\\libchromiumcontent'
PDB_LIST = [ PDB_LIST = [
'out\\R\\atom.exe.pdb', 'out\\R\\atom.exe.pdb',
'out\\R\\node.dll.pdb',
] ]

View file

@ -7,7 +7,7 @@ import subprocess
import sys import sys
import tempfile import tempfile
from lib.config import DIST_ARCH, TARGET_PLATFORM from lib.config import PLATFORM, get_target_arch
from lib.util import execute, get_atom_shell_version, parse_version, \ from lib.util import execute, get_atom_shell_version, parse_version, \
get_chromedriver_version, scoped_cwd get_chromedriver_version, scoped_cwd
from lib.github import GitHub from lib.github import GitHub
@ -21,14 +21,14 @@ SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
OUT_DIR = os.path.join(SOURCE_ROOT, 'out', 'R') OUT_DIR = os.path.join(SOURCE_ROOT, 'out', 'R')
DIST_DIR = os.path.join(SOURCE_ROOT, 'dist') DIST_DIR = os.path.join(SOURCE_ROOT, 'dist')
DIST_NAME = 'atom-shell-{0}-{1}-{2}.zip'.format(ATOM_SHELL_VERSION, DIST_NAME = 'atom-shell-{0}-{1}-{2}.zip'.format(ATOM_SHELL_VERSION,
TARGET_PLATFORM, PLATFORM,
DIST_ARCH) get_target_arch())
SYMBOLS_NAME = 'atom-shell-{0}-{1}-{2}-symbols.zip'.format(ATOM_SHELL_VERSION, SYMBOLS_NAME = 'atom-shell-{0}-{1}-{2}-symbols.zip'.format(ATOM_SHELL_VERSION,
TARGET_PLATFORM, PLATFORM,
DIST_ARCH) get_target_arch())
CHROMEDRIVER_NAME = 'chromedriver-{0}-{1}-{2}.zip'.format(CHROMEDRIVER_VERSION, CHROMEDRIVER_NAME = 'chromedriver-{0}-{1}-{2}.zip'.format(CHROMEDRIVER_VERSION,
TARGET_PLATFORM, PLATFORM,
DIST_ARCH) get_target_arch())
def main(): def main():
@ -46,9 +46,26 @@ def main():
sys.stderr.flush() sys.stderr.flush()
return 1 return 1
# Upload atom-shell with GitHub Releases API.
github = GitHub(auth_token()) github = GitHub(auth_token())
release_id = create_or_get_release_draft(github, args.version) release_id = create_or_get_release_draft(github, args.version)
if args.publish_release:
# Upload the SHASUMS.txt.
execute([sys.executable,
os.path.join(SOURCE_ROOT, 'script', 'upload-checksums.py'),
'-v', ATOM_SHELL_VERSION])
# Upload the index.json.
execute([sys.executable,
os.path.join(SOURCE_ROOT, 'script', 'upload-index-json.py')])
# Press the publish button.
publish_release(github, release_id)
# Do not upload other files when passed "-p".
return
# Upload atom-shell with GitHub Releases API.
upload_atom_shell(github, release_id, os.path.join(DIST_DIR, DIST_NAME)) upload_atom_shell(github, release_id, os.path.join(DIST_DIR, DIST_NAME))
upload_atom_shell(github, release_id, os.path.join(DIST_DIR, SYMBOLS_NAME)) upload_atom_shell(github, release_id, os.path.join(DIST_DIR, SYMBOLS_NAME))
@ -57,8 +74,7 @@ def main():
upload_atom_shell(github, release_id, upload_atom_shell(github, release_id,
os.path.join(DIST_DIR, CHROMEDRIVER_NAME)) os.path.join(DIST_DIR, CHROMEDRIVER_NAME))
if args.publish_release: if PLATFORM == 'win32':
if TARGET_PLATFORM == 'win32':
# Upload PDBs to Windows symbol server. # Upload PDBs to Windows symbol server.
execute([sys.executable, execute([sys.executable,
os.path.join(SOURCE_ROOT, 'script', 'upload-windows-pdb.py')]) os.path.join(SOURCE_ROOT, 'script', 'upload-windows-pdb.py')])
@ -68,9 +84,6 @@ def main():
os.path.join(SOURCE_ROOT, 'script', 'upload-node-headers.py'), os.path.join(SOURCE_ROOT, 'script', 'upload-node-headers.py'),
'-v', ATOM_SHELL_VERSION]) '-v', ATOM_SHELL_VERSION])
# Press the publish button.
publish_release(github, release_id)
def parse_args(): def parse_args():
parser = argparse.ArgumentParser(description='upload distribution file') parser = argparse.ArgumentParser(description='upload distribution file')
@ -83,10 +96,10 @@ def parse_args():
def get_atom_shell_build_version(): def get_atom_shell_build_version():
if TARGET_PLATFORM == 'darwin': if PLATFORM == 'darwin':
atom_shell = os.path.join(SOURCE_ROOT, 'out', 'R', 'Atom.app', atom_shell = os.path.join(SOURCE_ROOT, 'out', 'R', 'Atom.app',
'Contents', 'MacOS', 'Atom') 'Contents', 'MacOS', 'Atom')
elif TARGET_PLATFORM == 'win32': elif PLATFORM == 'win32':
atom_shell = os.path.join(SOURCE_ROOT, 'out', 'R', 'atom.exe') atom_shell = os.path.join(SOURCE_ROOT, 'out', 'R', 'atom.exe')
else: else:
atom_shell = os.path.join(SOURCE_ROOT, 'out', 'R', 'atom') atom_shell = os.path.join(SOURCE_ROOT, 'out', 'R', 'atom')

View file

@ -17,6 +17,9 @@ describe 'crash-reporter module', ->
beforeEach -> w = new BrowserWindow(show: false) beforeEach -> w = new BrowserWindow(show: false)
afterEach -> w.destroy() afterEach -> w.destroy()
# It is not working on 64bit Windows.
return if process.platform is 'win32' and process.arch is 'x64'
it 'should send minidump when renderer crashes', (done) -> it 'should send minidump when renderer crashes', (done) ->
@timeout 60000 @timeout 60000
server = http.createServer (req, res) -> server = http.createServer (req, res) ->

View file

@ -43,6 +43,8 @@ function getInfoForCurrentVersion() {
'linux-x64-symbols', 'linux-x64-symbols',
'win32-ia32', 'win32-ia32',
'win32-ia32-symbols', 'win32-ia32-symbols',
'win32-x64',
'win32-x64-symbols',
]; ];
return json; return json;

2
vendor/breakpad vendored

@ -1 +1 @@
Subproject commit 1e937567e92d2c3beed4556f3c68a4b0362b1e6d Subproject commit 4427c1170387afe46eb3fad259436f1f9f5efa86

2
vendor/brightray vendored

@ -1 +1 @@
Subproject commit f2b33daa4ea5a1e1ba0a5b18a3f0470d99b6f962 Subproject commit 80a002c4a239f347cc4e0eea7378054977520726