Add support for building binaryen from master git branch.

This commit is contained in:
Jukka Jylänki
2016-10-14 11:52:47 +03:00
parent efebd3970d
commit 3234ef7749
3 changed files with 112 additions and 26 deletions

4
.gitignore vendored
View File

@@ -9,6 +9,7 @@ crunch
java java
mingw mingw
spidermonkey spidermonkey
binaryen
.emscripten .emscripten
.emscripten_cache .emscripten_cache
.emscripten_cache__last_clear .emscripten_cache__last_clear
@@ -16,3 +17,6 @@ spidermonkey
.tmp .tmp
tmp tmp
gnu gnu
emscripten-nightlies.txt
llvm-nightlies-32bit.txt
llvm-nightlies-64bit.txt

119
emsdk
View File

@@ -535,16 +535,28 @@ def fastcomp_build_dir(tool):
build_dir = 'build_' + tool.version + generator_suffix + bitness_suffix build_dir = 'build_' + tool.version + generator_suffix + bitness_suffix
return build_dir return build_dir
# The directory where the binaries are produced. def exe_suffix(filename):
if WINDOWS and not filename.endswith('.exe'): return filename + '.exe'
else: return filename
# The directory where the binaries are produced. (relative to the installation root directory of the tool)
def fastcomp_build_bin_dir(tool): def fastcomp_build_bin_dir(tool):
build_dir = fastcomp_build_dir(tool) build_dir = fastcomp_build_dir(tool)
if WINDOWS and 'Visual Studio' in CMAKE_GENERATOR: if WINDOWS and 'Visual Studio' in CMAKE_GENERATOR:
old_llvm_bin_dir = os.path.join(build_dir, 'bin\\' + decide_cmake_build_type(tool)) old_llvm_bin_dir = os.path.join(build_dir, 'bin', decide_cmake_build_type(tool))
new_llvm_bin_dir = os.path.join(build_dir, decide_cmake_build_type(tool) + '\\bin')
if os.path.exists(os.path.join(tool.installation_path(), new_llvm_bin_dir)): new_llvm_bin_dir = None
return new_llvm_bin_dir default_cmake_build_type = decide_cmake_build_type(tool)
if os.path.exists(os.path.join(tool.installation_path(), old_llvm_bin_dir)): return old_llvm_bin_dir cmake_build_types = [default_cmake_build_type, 'Release', 'RelWithDebInfo', 'MinSizeRel', 'Debug']
return new_llvm_bin_dir for build_type in cmake_build_types:
d = os.path.join(build_dir, build_type, 'bin')
if os.path.isfile(os.path.join(tool.installation_path(), d, exe_suffix('clang'))):
new_llvm_bin_dir = d
break
if new_llvm_bin_dir and os.path.exists(os.path.join(tool.installation_path(), new_llvm_bin_dir)): return new_llvm_bin_dir
elif os.path.exists(os.path.join(tool.installation_path(), old_llvm_bin_dir)): return old_llvm_bin_dir
return os.path.join(build_dir, default_cmake_build_type, 'bin')
else: else:
return os.path.join(build_dir, 'bin') return os.path.join(build_dir, 'bin')
@@ -719,6 +731,7 @@ def build_fastcomp_tool(tool):
success = make_build(build_root, build_type, 'x64' if tool.bitness == 64 else 'Win32') success = make_build(build_root, build_type, 'x64' if tool.bitness == 64 else 'Win32')
return success return success
# Emscripten asm.js optimizer build scripts:
def optimizer_build_root(tool): def optimizer_build_root(tool):
build_root = tool.installation_path().strip() build_root = tool.installation_path().strip()
if build_root.endswith('/') or build_root.endswith('\\'): build_root = build_root[:-1] if build_root.endswith('/') or build_root.endswith('\\'): build_root = build_root[:-1]
@@ -730,8 +743,11 @@ def uninstall_optimizer(tool):
if VERBOSE: print('uninstall_optimizer(' + str(tool) + ')') if VERBOSE: print('uninstall_optimizer(' + str(tool) + ')')
build_root = optimizer_build_root(tool) build_root = optimizer_build_root(tool)
print("Deleting path '" + build_root + "'") print("Deleting path '" + build_root + "'")
remove_tree(build_root) try:
os.remove(build_root) remove_tree(build_root)
os.remove(build_root)
except:
pass
def is_optimizer_installed(tool): def is_optimizer_installed(tool):
build_root = optimizer_build_root(tool) build_root = optimizer_build_root(tool)
@@ -754,6 +770,56 @@ def build_optimizer_tool(tool):
success = make_build(build_root, build_type, 'x64' if tool.bitness == 64 else 'Win32') success = make_build(build_root, build_type, 'x64' if tool.bitness == 64 else 'Win32')
return success return success
# Binaryen build scripts:
def binaryen_build_root(tool):
build_root = tool.installation_path().strip()
if build_root.endswith('/') or build_root.endswith('\\'): build_root = build_root[:-1]
generator_prefix = cmake_generator_prefix()
build_root = build_root + generator_prefix + '_' + str(tool.bitness) + 'bit_binaryen'
return build_root
def uninstall_binaryen(tool):
if VERBOSE: print('uninstall_binaryen(' + str(tool) + ')')
build_root = binaryen_build_root(tool)
print("Deleting path '" + build_root + "'")
try:
remove_tree(build_root)
os.remove(build_root)
except:
pass
def is_binaryen_installed(tool):
build_root = binaryen_build_root(tool)
return os.path.exists(build_root)
def build_binaryen_tool(tool):
if VERBOSE: print('build_binaryen_tool(' + str(tool) + ')')
src_root = tool.installation_path()
build_root = binaryen_build_root(tool)
build_type = decide_cmake_build_type(tool)
# Configure
cmake_generator = CMAKE_GENERATOR
if 'Visual Studio' in CMAKE_GENERATOR and tool.bitness == 64:
cmake_generator += ' Win64'
success = cmake_configure(cmake_generator, build_root, src_root, build_type)
if not success: return False
# Make
success = make_build(build_root, build_type, 'x64' if tool.bitness == 64 else 'Win32')
# Deploy scripts needed from source repository to build directory
remove_tree(os.path.join(build_root, 'scripts'))
shutil.copytree(os.path.join(src_root, 'scripts'), os.path.join(build_root, 'scripts'))
remove_tree(os.path.join(build_root, 'src', 'js'))
shutil.copytree(os.path.join(src_root, 'src', 'js'), os.path.join(build_root, 'src', 'js'))
shutil.copyfile(os.path.join(src_root, 'bin', 'binaryen.js'), os.path.join(build_root, 'bin', 'binaryen.js'))
shutil.copyfile(os.path.join(src_root, 'bin', 'wasm.js'), os.path.join(build_root, 'bin', 'wasm.js'))
return success
def download_and_unzip(zipfile, dest_dir, download_even_if_exists=False, filename_prefix = ''): def download_and_unzip(zipfile, dest_dir, download_even_if_exists=False, filename_prefix = ''):
if VERBOSE: print('download_and_unzip(zipfile=' + zipfile + ', dest_dir=' + dest_dir + ')') if VERBOSE: print('download_and_unzip(zipfile=' + zipfile + ', dest_dir=' + dest_dir + ')')
if not download_even_if_exists and num_files_in_directory(dest_dir) > 0: if not download_even_if_exists and num_files_in_directory(dest_dir) > 0:
@@ -1039,8 +1105,10 @@ class Tool:
if self.id == 'vs-tool': # vs-tool is a special tool since all versions must be installed to the same dir, so dir name will not differentiate the version. if self.id == 'vs-tool': # vs-tool is a special tool since all versions must be installed to the same dir, so dir name will not differentiate the version.
return content_exists and get_installed_vstool_version(self.installation_path()) == self.version return content_exists and get_installed_vstool_version(self.installation_path()) == self.version
elif hasattr(self, 'custom_is_installed_script') and self.custom_is_installed_script == 'is_optimizer_installed': elif hasattr(self, 'custom_is_installed_script'):
return is_optimizer_installed(self) if self.custom_is_installed_script == 'is_optimizer_installed': return is_optimizer_installed(self)
elif self.custom_is_installed_script == 'is_binaryen_installed': return is_binaryen_installed(self)
else: raise Exception('Unknown custom_is_installed_script directive "' + self.custom_is_installed_script + '"!')
else: else:
return content_exists return content_exists
else: else:
@@ -1146,25 +1214,25 @@ class Tool:
else: else:
print("Installing tool '" + str(self) + "'..") print("Installing tool '" + str(self) + "'..")
url = self.download_url() url = self.download_url()
if hasattr(self, 'custom_install_script') and self.custom_install_script == 'build_fastcomp': if hasattr(self, 'custom_install_script') and self.custom_install_script == 'build_fastcomp':
success = build_fastcomp_tool(self) success = build_fastcomp_tool(self)
elif hasattr(self, 'git_branch'): elif hasattr(self, 'git_branch'):
success = git_clone_checkout_and_pull(url, self.installation_path(), self.git_branch) success = git_clone_checkout_and_pull(url, self.installation_path(), self.git_branch)
if success:
if hasattr(self, 'custom_install_script') and self.custom_install_script == 'build_optimizer':
success = build_optimizer_tool(self)
elif url.endswith('zip') or url.endswith('.tar') or url.endswith('.gz'): elif url.endswith('zip') or url.endswith('.tar') or url.endswith('.gz'):
download_even_if_exists = (self.id == 'vs-tool') download_even_if_exists = (self.id == 'vs-tool')
success = download_and_unzip(url, self.installation_path(), download_even_if_exists, filename_prefix=self.zipfile_prefix if hasattr(self, 'zipfile_prefix') else '') success = download_and_unzip(url, self.installation_path(), download_even_if_exists, filename_prefix=self.zipfile_prefix if hasattr(self, 'zipfile_prefix') else '')
if success:
if hasattr(self, 'custom_install_script') and self.custom_install_script == 'build_optimizer':
success = build_optimizer_tool(self)
else: else:
dst_file = download_file(urljoin(emsdk_packages_url, self.download_url()), self.installation_path()) dst_file = download_file(urljoin(emsdk_packages_url, self.download_url()), self.installation_path())
if dst_file: if dst_file: success = True
success = True else: success = False
else:
success = False if success and hasattr(self, 'custom_install_script'):
if self.custom_install_script == 'build_optimizer': success = build_optimizer_tool(self)
elif self.custom_install_script == 'build_fastcomp': pass # 'build_fastcomp' is a special one that does the download on its own, others do the download manually.
elif self.custom_install_script == 'build_binaryen': success = build_binaryen_tool(self)
else: raise Exception('Unknown custom_install_script command "' + self.custom_install_script + '"!')
if not success: if not success:
print("Installation failed!") print("Installation failed!")
return False return False
@@ -1189,11 +1257,10 @@ class Tool:
print("Tool '" + str(self) + "' was not installed. No need to uninstall.") print("Tool '" + str(self) + "' was not installed. No need to uninstall.")
return return
print("Uninstalling tool '" + str(self) + "'..") print("Uninstalling tool '" + str(self) + "'..")
if hasattr(self, 'custom_uninstall_script') and self.custom_uninstall_script == 'uninstall_optimizer': if hasattr(self, 'custom_uninstall_script'):
try: if self.custom_uninstall_script == 'uninstall_optimizer': uninstall_optimizer(self)
uninstall_optimizer(self) elif self.custom_uninstall_script == 'uninstall_binaryen': uninstall_binaryen(self)
except: else: raise Exception('Unknown custom_uninstall_script directive "' + custom_uninstall_script + '"!')
pass
try: try:
print("Deleting path '" + self.installation_path() + "'") print("Deleting path '" + self.installation_path() + "'")
remove_tree(self.installation_path()) remove_tree(self.installation_path())

View File

@@ -721,6 +721,21 @@
"custom_is_installed_script": "is_optimizer_installed", "custom_is_installed_script": "is_optimizer_installed",
"custom_uninstall_script": "uninstall_optimizer" "custom_uninstall_script": "uninstall_optimizer"
}, },
{
"id": "binaryen",
"version": "master",
"bitness": 64,
"append_bitness": false,
"url": "https://github.com/WebAssembly/binaryen/",
"git_branch": "master",
"activated_cfg": "BINARYEN_ROOT='%installation_dir%%generator_prefix%_64bit_binaryen'",
"activated_path": "%installation_dir%",
"activated_env": "BINARYEN_ROOT=%installation_dir%%generator_prefix%_64bit_binaryen",
"cmake_build_type": "RelWithDebInfo",
"custom_install_script": "build_binaryen",
"custom_is_installed_script": "is_binaryen_installed",
"custom_uninstall_script": "uninstall_binaryen"
},
{ {
"id": "vs-tool", "id": "vs-tool",
"version": "0.9.0", "version": "0.9.0",