0
0
Fork 0
mirror of https://github.com/denoland/rusty_v8.git synced 2024-11-24 15:19:31 -05:00

replace gclient with git submodules so 'cargo package' works with verification (#19)

This commit is contained in:
Ry Dahl 2019-11-29 18:58:29 -08:00 committed by GitHub
parent 011b9f31a7
commit 624f678bc7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 356 additions and 293 deletions

183
.gclient
View file

@ -1,183 +0,0 @@
solutions = [
{
'url': 'https://github.com/v8/v8.git@7.9.317.12',
'name': 'v8',
'custom_hooks': [
# Surpress v8 hooks... one wishes there was a better way to do this.
{ 'name': 'disable_depot_tools_selfupdate' },
{ 'name': 'landmines' },
{ 'name': 'clang_format_win' },
{ 'name': 'clang_format_mac' },
{ 'name': 'clang_format_linux' },
{ 'name': 'gcmole' },
{ 'name': 'jsfunfuzz' },
{ 'name': 'wasm_spec_tests' },
{ 'name': 'wasm_js' },
{ 'name': 'msan_chained_origins' },
{ 'name': 'msan_no_origins' },
{ 'name': 'win_toolchain' },
{ 'name': 'mac_toolchain' },
{ 'name': 'binutils' },
{ 'name': 'clang' },
{ 'name': 'lastchange' },
{ 'name': 'fuchsia_sdk' },
{ 'name': 'lld/mac' },
{ 'name': 'llvm-objdump' },
{ 'name': 'vpython_common' },
{ 'name': 'check_v8_header_includes' },
{ 'name': 'sysroot_arm' },
{ 'name': 'sysroot_arm64' },
{ 'name': 'sysroot_x86' },
{ 'name': 'sysroot_x64' },
],
'custom_deps': {
'v8/build': None,
'v8/buildtools': None,
'v8/buildtools/clang_format/script': None,
'v8/buildtools/linux64': None,
'v8/buildtools/mac': None,
'v8/test/benchmarks/data': None,
'v8/test/mozilla/data': None,
'v8/test/test262/data': None,
'v8/test/test262/harness': None,
'v8/test/wasm-js': None,
'v8/third_party/android_tools': None,
'v8/third_party/catapult': None,
'v8/third_party/colorama/src': None,
'v8/third_party/depot_tools': None,
#'v8/third_party/googletest/src': None,
'v8/third_party/icu': None,
'v8/third_party/instrumented_libraries': None,
'v8/third_party/jinja2': None,
'v8/third_party/markupsafe': None,
'v8/third_party/perfetto': None,
'v8/third_party/protobuf': None,
'v8/tools/clang': None,
'v8/tools/clang/dsymutil': None,
'v8/tools/gyp': None,
'v8/tools/luci-go': None,
'v8/tools/swarming_client': None,
}
},
{
'url':
'https://chromium.googlesource.com/chromium/src/build.git@082f11b29976c3be67dddd74bd75c6d1793201c7',
'name': 'build',
},
{
'url':
'https://chromium.googlesource.com/chromium/src/buildtools.git@cf454b247c611167388742c7a31ef138a6031172',
'name': 'buildtools',
},
{
'url':
'https://chromium.googlesource.com/chromium/src/tools/clang.git@c5d85f1e9d3a01e4de2ccf4dfaa7847653ae9121',
'name': 'tools/clang',
},
{
'url':
'https://chromium.googlesource.com/chromium/src/third_party/jinja2.git@b41863e42637544c2941b574c7877d3e1f663e25',
'name': 'third_party/jinja2',
},
{
'url':
'https://chromium.googlesource.com/chromium/src/third_party/markupsafe.git@8f45f5cfa0009d2a70589bcda0349b8cb2b72783',
'name': 'third_party/markupsafe',
},
]
hooks = [
{
# Ensure that the DEPS'd "depot_tools" has its self-update capability
# disabled.
'name': 'disable_depot_tools_selfupdate',
'pattern': '.',
'action': [
'python',
'third_party/depot_tools/update_depot_tools_toggle.py',
'--disable',
],
},
# {
# # This clobbers when necessary (based on get_landmines.py). It must be the
# # first hook so that other things that get/generate into the output
# # directory will not subsequently be clobbered.
# 'name': 'landmines',
# 'pattern': '.',
# 'action': [
# 'python',
# 'build/landmines.py',
# '--landmine-scripts',
# 'tools/get_landmines.py',
# ],
# },
{
'name': 'sysroot_arm',
'pattern': '.',
'condition': '(checkout_linux and checkout_arm)',
'action': ['python', 'build/linux/sysroot_scripts/install-sysroot.py',
'--arch=arm'],
},
{
'name': 'sysroot_arm64',
'pattern': '.',
'condition': '(checkout_linux and checkout_arm64)',
'action': ['python', 'build/linux/sysroot_scripts/install-sysroot.py',
'--arch=arm64'],
},
{
'name': 'sysroot_x86',
'pattern': '.',
'condition': '(checkout_linux and (checkout_x86 or checkout_x64))',
'action': ['python', 'build/linux/sysroot_scripts/install-sysroot.py',
'--arch=x86'],
},
{
'name': 'sysroot_x64',
'pattern': '.',
'condition': 'checkout_linux and checkout_x64',
'action': ['python', 'build/linux/sysroot_scripts/install-sysroot.py',
'--arch=x64'],
},
{
# Update the Windows toolchain if necessary.
'name': 'win_toolchain',
'pattern': '.',
'condition': 'checkout_win',
'action': ['python', 'build/vs_toolchain.py', 'update'],
},
{
# Update the Mac toolchain if necessary.
'name': 'mac_toolchain',
'pattern': '.',
'condition': 'checkout_mac',
'action': ['python', 'build/mac_toolchain.py'],
},
# Pull binutils for linux, enabled debug fission for faster linking /
# debugging when used with clang on Ubuntu Precise.
# https://code.google.com/p/chromium/issues/detail?id=352046
#{
# 'name': 'binutils',
# 'pattern': 'third_party/binutils',
# 'condition': 'host_os == "linux"',
# 'action': [
# 'python',
# 'v8/third_party/binutils/download.py',
# ],
#},
{
# Note: On Win, this should run after win_toolchain, as it may use it.
'name': 'clang',
'pattern': '.',
# clang not supported on aix
'condition': 'host_os != "aix"',
'action': ['python', 'tools/clang/scripts/update.py'],
},
{
# Update LASTCHANGE.
'name': 'lastchange',
'pattern': '.',
'action': ['python', 'build/util/lastchange.py',
'-o', 'build/util/LASTCHANGE'],
},
]

View file

@ -18,25 +18,18 @@ jobs:
uses: actions/checkout@v1
with:
fetch-depth: 10
submodules: true
submodules: 'recursive'
- name: Install rust
uses: hecrj/setup-rust-action@v1
with:
rust-version: "1.38.0"
- name: Remove unused versions of Python
# Depot_tools brings its own Python and bootstraps virtualenv. The
# latter fails on windows when unused versions of Python are in present
# in PATH, so we remove those.
# 🤯 Removing items from PATH does not seem possible on Github Actions,
# not even by using `echo ::set-env name=PATH`, so we have to rename
# or delete the actual Python directories.
if: startsWith(matrix.os, 'windows')
run: |-
$env:PATH -split ";" |
Where-Object { Test-Path "$_\python.exe" } |
ForEach-Object { Move-Item "$_" "$_.disabled" }
- name: Install python
uses: actions/setup-python@v1
with:
python-version: "2.7.x"
architecture: x64
- name: Environment (common)
run: echo ::set-env name=RUSTC_WRAPPER::sccache

10
.gitignore vendored
View file

@ -3,13 +3,3 @@
/.vscode/
/target/
/.cipd/
.gclient_entries
/v8/
/build/
/buildtools/
/tools/clang/
/third_party/jinja2/
/third_party/markupsafe/
/third_party/llvm-build/
.landmines

24
.gitmodules vendored
View file

@ -1,3 +1,21 @@
[submodule "depot_tools"]
path = third_party/depot_tools
url = https://chromium.googlesource.com/chromium/tools/depot_tools.git
[submodule "v8"]
path = v8
url = https://github.com/v8/v8.git
[submodule "build"]
path = build
url = https://github.com/denoland/chromium_build.git
[submodule "tools/clang"]
path = tools/clang
url = https://chromium.googlesource.com/chromium/src/tools/clang.git
[submodule "base/trace_event/common"]
path = base/trace_event/common
url = https://chromium.googlesource.com/chromium/src/base/trace_event/common.git
[submodule "third_party/jinja2"]
path = third_party/jinja2
url = https://chromium.googlesource.com/chromium/src/third_party/jinja2.git
[submodule "third_party/markupsafe"]
path = third_party/markupsafe
url = https://chromium.googlesource.com/chromium/src/third_party/markupsafe.git
[submodule "buildtools"]
path = buildtools
url = https://github.com/denoland/chromium_buildtools.git

4
.gn
View file

@ -41,6 +41,10 @@ default_args = {
# this breaks cargo build in debug mode in OSX.
is_component_build = false
use_sysroot = false
use_dummy_lastchange = true
symbol_level = 1
treat_warnings_as_errors = true

2
Cargo.lock generated
View file

@ -60,7 +60,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "rusty_v8"
version = "0.0.2"
version = "0.0.5"
dependencies = [
"cargo_gn 0.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",

View file

@ -1,23 +1,45 @@
[package]
name = "rusty_v8"
version = "0.0.2"
version = "0.0.5"
description = "Rust bindings to V8"
readme = "README.md"
authors = ["the Deno authors"]
license = "MIT"
edition = "2018"
repository = "https://github.com/denoland/rusty_v8"
exclude = [
".cipd",
".gclient_entries",
"v8",
"build",
"buildtools",
"tools/clang",
"third_party/jinja2",
"third_party/markupsafe",
"third_party/llvm-build",
".landmines",
# To keep the package under the 10mb limit imposed by crates.io we exclude
# a lot of files that are not needed for the build.
"*.md",
"*.txt",
"*.settings",
"*OWNERS*",
"AUTHORS",
"LICENSE*",
"README*",
"build/android/",
"build/chromeos/",
"build/fuchsia/",
"buildtools/third_party/libc++/trunk/test/",
"buildtools/third_party/libc++abi/trunk/test/",
"buildtools/checkdeps/",
"buildtools/clang_format/",
"v8/ChangeLog",
"v8/docs/",
"v8/benchmarks/",
"v8/samples/",
"v8/test/",
"v8/third_party/wasm-api",
"v8/tools/",
# These files are required for the build.
"!BUILD.gn",
"!test-torque.tq",
"!v8/tools/run.py",
"!v8/tools/testrunner/utils/dump_build_config.py",
"!v8/tools/gen-postmortem-metadata.py",
"!v8/tools/js2c.py",
"!tools/clang/scripts/update.py",
]
[dependencies]

@ -0,0 +1 @@
Subproject commit 5e4fce17a9d2439c44a7b57ceecef6df9287ec2f

1
build Submodule

@ -0,0 +1 @@
Subproject commit 4d6554f3741e76b4c57d4aa58d5df98716a38c05

152
build.rs
View file

@ -2,16 +2,32 @@
use cargo_gn;
use std::env;
use std::path::Path;
use std::path::PathBuf;
use std::process::Command;
use which::which;
fn main() {
init_depot_tools();
env::set_var("DEPOT_TOOLS_WIN_TOOLCHAIN", "0");
if !Path::new("v8/src").is_dir()
|| env::var_os("GCLIENT_SYNC").is_some()
{
gclient_sync();
// cargo publish doesn't like pyc files.
env::set_var("PYTHONDONTWRITEBYTECODE", "1");
// git submodule update --init --recursive
let libcxx_src = PathBuf::from("buildtools/third_party/libc++/trunk/src");
if !libcxx_src.is_dir() {
eprintln!(
"missing source code. Run 'git submodule update --init --recursive'"
);
return;
}
// Don't build if "cargo doc" is being run.
if env::var_os("RUSTDOCFLAGS").is_some() {
return;
}
if need_gn_ninja_download() {
download_gn_ninja_binaries();
}
// On windows, rustc cannot link with a V8 debug build.
@ -21,6 +37,9 @@ fn main() {
vec!["is_debug=false".to_string()]
};
let clang_base_path = clang_download();
gn_args.push(format!("clang_base_path={:?}", clang_base_path));
if let Some(p) = env::var_os("SCCACHE") {
cc_wrapper(&mut gn_args, &Path::new(&p));
} else if let Ok(p) = which("sccache") {
@ -44,78 +63,77 @@ fn main() {
}
}
fn init_depot_tools() {
env::set_var("DEPOT_TOOLS_WIN_TOOLCHAIN", "0");
env::set_var("DEPOT_TOOLS_UPDATE", "0");
env::set_var("DEPOT_TOOLS_METRICS", "0");
let depot_tools = env::current_dir()
.unwrap()
.join("third_party")
.join("depot_tools");
// Add third_party/depot_tools and buildtools/win to PATH.
// TODO: buildtools/win should not be added; instead, cargo_gn should invoke
// depot_tools/gn.bat.
let buildtools_win =
env::current_dir().unwrap().join("buildtools").join("win");
// Bootstrap depot_tools.
let path = env::var_os("PATH").unwrap();
// "Add depot_tools to the start of your PATH (must be ahead of any installs
// of Python)."
// https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up
let paths = vec![depot_tools.clone(), buildtools_win]
.into_iter()
.chain(env::split_paths(&path))
.collect::<Vec<_>>();
let path = env::join_paths(paths).unwrap();
env::set_var("PATH", &path);
env::set_var("GN", which("gn").unwrap());
if cfg!(windows) {
// Bootstrap depot_tools.
if !depot_tools.join("git.bat").is_file() {
let status = Command::new("cmd.exe")
.arg("/c")
.arg("bootstrap\\win_tools.bat")
.current_dir(&depot_tools)
.status()
.expect("bootstrapping depot_tools failed");
assert!(status.success());
}
fn platform() -> &'static str {
#[cfg(target_os = "windows")]
{
"win"
}
#[cfg(target_os = "linux")]
{
"linux64"
}
#[cfg(target_os = "macos")]
{
"mac"
}
}
fn gclient_sync() {
fn download_gn_ninja_binaries() {
let root = env::current_dir().unwrap();
let third_party = root.join("third_party");
let depot_tools = third_party.join("depot_tools");
let out_dir = root.join(env::var_os("OUT_DIR").unwrap());
let status = Command::new("python")
.arg("./tools/gn_ninja_binaries.py")
.arg("--dir")
.arg(&out_dir)
.status()
.expect("gn_ninja_binaries.py download failed");
assert!(status.success());
let gclient = depot_tools.join(if cfg!(windows) {
"gclient.bat"
} else {
"gclient"
});
if !gclient.is_file() {
panic!(
"Could not find gclient {}. Maybe run git submodule update?",
gclient.display()
);
let d = out_dir.join("gn_ninja_binaries").join(platform());
let gn = d.join("gn");
let ninja = d.join("ninja");
#[cfg(windows)]
let gn = gn.with_extension("exe");
#[cfg(windows)]
let ninja = ninja.with_extension("exe");
env::set_var("GN", gn);
env::set_var("NINJA", ninja);
}
println!("Running gclient sync to download V8. This could take a while.");
fn need_gn_ninja_download() -> bool {
!((which("ninja").is_ok() || env::var_os("NINJA").is_some())
&& env::var_os("GN").is_some())
}
let status = Command::new(gclient)
.current_dir(&root)
.arg("sync")
.arg("--no-history")
.arg("--shallow")
// Download chromium's clang into OUT_DIR because Cargo will not allow us to
// modify the source directory.
fn clang_download() -> PathBuf {
// TODO(ry) We can support clang 10 and above.... if that is installed use
// it.
/*
if let Ok(clang_path) = which("clang") {
//
let bin_path = clang_path.parent().unwrap();
return bin_path.parent().unwrap().to_path_buf();
}
*/
let root = env::current_dir().unwrap();
let out_dir = env::var_os("OUT_DIR").unwrap();
let clang_base_path = root.join(out_dir).join("clang");
println!("clang_base_path {}", clang_base_path.display());
let status = Command::new("python")
.arg("./tools/clang/scripts/update.py")
.arg("--clang-dir")
.arg(&clang_base_path)
.status()
.expect("gclient sync failed");
.expect("clang download failed");
assert!(status.success());
assert!(clang_base_path.exists());
clang_base_path
}
fn cc_wrapper(gn_args: &mut Vec<String>, sccache_path: &Path) {

1
buildtools Submodule

@ -0,0 +1 @@
Subproject commit f446d2d4fda7b7da42670ecb9b42059d561e1166

@ -1 +0,0 @@
Subproject commit ba97f6065ed1e9336585468dd85e680cf09d5166

View file

@ -0,0 +1,61 @@
// Copyright 2006, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Google C++ Testing and Mocking Framework definitions useful in production code.
// GOOGLETEST_CM0003 DO NOT DELETE
#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
// When you need to test the private or protected members of a class,
// use the FRIEND_TEST macro to declare your tests as friends of the
// class. For example:
//
// class MyClass {
// private:
// void PrivateMethod();
// FRIEND_TEST(MyClassTest, PrivateMethodWorks);
// };
//
// class MyClassTest : public testing::Test {
// // ...
// };
//
// TEST_F(MyClassTest, PrivateMethodWorks) {
// // Can call MyClass::PrivateMethod() here.
// }
//
// Note: The test class must be in the same namespace as the class being tested.
// For example, putting MyClassTest in an anonymous namespace will not work.
#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test
#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_

1
third_party/jinja2 vendored Submodule

@ -0,0 +1 @@
Subproject commit b41863e42637544c2941b574c7877d3e1f663e25

1
third_party/markupsafe vendored Submodule

@ -0,0 +1 @@
Subproject commit 8f45f5cfa0009d2a70589bcda0349b8cb2b72783

1
tools/clang Submodule

@ -0,0 +1 @@
Subproject commit c5d85f1e9d3a01e4de2ccf4dfaa7847653ae9121

134
tools/gn_ninja_binaries.py Executable file
View file

@ -0,0 +1,134 @@
#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This script is used to download prebuilt gn/ninja binaries."""
# TODO: Running stand-alone won't work on Windows due to the dia dll copying.
from __future__ import division
from __future__ import print_function
import argparse
import os
import shutil
import stat
import sys
import tarfile
import tempfile
import time
try:
from urllib2 import HTTPError, URLError, urlopen
except ImportError: # For Py3 compatibility
from urllib.error import HTTPError, URLError
from urllib.request import urlopen
URL = "https://s3.amazonaws.com/deno.land/gn_ninja_binaries.tar.gz"
DIR = None
def RmTree(dir):
"""Delete dir."""
def ChmodAndRetry(func, path, _):
# Subversion can leave read-only files around.
if not os.access(path, os.W_OK):
os.chmod(path, stat.S_IWUSR)
return func(path)
raise
shutil.rmtree(dir, onerror=ChmodAndRetry)
def DownloadUrl(url, output_file):
"""Download url into output_file."""
CHUNK_SIZE = 4096
TOTAL_DOTS = 10
num_retries = 3
retry_wait_s = 5 # Doubled at each retry.
while True:
try:
sys.stdout.write('Downloading %s ' % url)
sys.stdout.flush()
response = urlopen(url)
total_size = int(response.info().get('Content-Length').strip())
bytes_done = 0
dots_printed = 0
while True:
chunk = response.read(CHUNK_SIZE)
if not chunk:
break
output_file.write(chunk)
bytes_done += len(chunk)
num_dots = TOTAL_DOTS * bytes_done // total_size
sys.stdout.write('.' * (num_dots - dots_printed))
sys.stdout.flush()
dots_printed = num_dots
if bytes_done != total_size:
raise URLError(
"only got %d of %d bytes" % (bytes_done, total_size))
print(' Done.')
return
except URLError as e:
sys.stdout.write('\n')
print(e)
if num_retries == 0 or isinstance(e, HTTPError) and e.code == 404:
raise e
num_retries -= 1
print('Retrying in %d s ...' % retry_wait_s)
sys.stdout.flush()
time.sleep(retry_wait_s)
retry_wait_s *= 2
def EnsureDirExists(path):
if not os.path.exists(path):
os.makedirs(path)
def DownloadAndUnpack(url, output_dir, path_prefixes=None):
"""Download an archive from url and extract into output_dir. If path_prefixes
is not None, only extract files whose paths within the archive start with
any prefix in path_prefixes."""
with tempfile.TemporaryFile() as f:
DownloadUrl(url, f)
f.seek(0)
EnsureDirExists(output_dir)
t = tarfile.open(mode='r:gz', fileobj=f)
members = None
if path_prefixes is not None:
members = [
m for m in t.getmembers() if any(
m.name.startswith(p) for p in path_prefixes)
]
t.extractall(path=output_dir, members=members)
def Update():
if os.path.exists(DIR):
RmTree(DIR)
try:
DownloadAndUnpack(URL, DIR, None)
except URLError:
print('Failed to download prebuilt ninja/gn binaries %s' % URL)
print('Exiting.')
sys.exit(1)
return 0
def main():
parser = argparse.ArgumentParser(description='Download ninja/gn binaries.')
parser.add_argument('--dir', help='Where to extract the package.')
args = parser.parse_args()
if args.dir:
global DIR
DIR = os.path.abspath(args.dir)
return Update()
if __name__ == '__main__':
sys.exit(main())

1
v8 Submodule

@ -0,0 +1 @@
Subproject commit 9d867c52741eb9fd5e63918e18e124d496d526d9