mirror of
https://github.com/denoland/deno.git
synced 2024-11-24 15:19:26 -05:00
Publish rust crate on crates.io (#2024)
This commit is contained in:
parent
3ba4c3c2b0
commit
97265895ba
5 changed files with 196 additions and 15 deletions
|
@ -4,6 +4,9 @@
|
||||||
name = "deno"
|
name = "deno"
|
||||||
version = "0.3.5"
|
version = "0.3.5"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
description = "A secure JavaScript/TypeScript runtime built with V8, Rust, and Tokio"
|
||||||
|
authors = ["The deno authors <bertbelder@nodejs.org>"]
|
||||||
|
license = "MIT"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
path = "lib.rs"
|
path = "lib.rs"
|
||||||
|
|
|
@ -11,20 +11,6 @@ fn main() {
|
||||||
"cargo:rustc-link-search=native={}/obj/core/libdeno",
|
"cargo:rustc-link-search=native={}/obj/core/libdeno",
|
||||||
build.gn_out_dir
|
build.gn_out_dir
|
||||||
);
|
);
|
||||||
if cfg!(target_os = "windows") {
|
|
||||||
println!("cargo:rustc-link-lib=static=libdeno");
|
|
||||||
} else {
|
|
||||||
println!("cargo:rustc-link-lib=static=deno");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link the system libraries that libdeno and V8 depend on.
|
|
||||||
if cfg!(any(target_os = "macos", target_os = "freebsd")) {
|
|
||||||
println!("cargo:rustc-link-lib=dylib=c++");
|
|
||||||
} else if cfg!(target_os = "windows") {
|
|
||||||
for lib in vec!["dbghelp", "shlwapi", "winmm", "ws2_32"] {
|
|
||||||
println!("cargo:rustc-link-lib={}", lib);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
build.run("core:deno_core_deps");
|
build.run("core:deno_core_deps");
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,6 +133,34 @@ pub struct deno_config {
|
||||||
pub recv_cb: deno_recv_cb,
|
pub recv_cb: deno_recv_cb,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
#[link(name = "deno")]
|
||||||
|
extern "C" {}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "macos", target_os = "freebsd"))]
|
||||||
|
#[link(name = "c++")]
|
||||||
|
extern "C" {}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
#[link(name = "libdeno")]
|
||||||
|
extern "C" {}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
#[link(name = "shlwapi")]
|
||||||
|
extern "C" {}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
#[link(name = "winmm")]
|
||||||
|
extern "C" {}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
#[link(name = "ws2_32")]
|
||||||
|
extern "C" {}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
#[link(name = "dbghelp")]
|
||||||
|
extern "C" {}
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn deno_init();
|
pub fn deno_init();
|
||||||
pub fn deno_v8_version() -> *const c_char;
|
pub fn deno_v8_version() -> *const c_char;
|
||||||
|
|
164
tools/cargo_package.py
Executable file
164
tools/cargo_package.py
Executable file
|
@ -0,0 +1,164 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Because of limitations in Cargo, Deno must dynamically build temporary source
|
||||||
|
# directories in order to publish to crates.io.
|
||||||
|
# The "deno" crate corresponds to the //core/ directory and depends on a
|
||||||
|
# platform dependent crate binary crate containing pre-compiled libdeno
|
||||||
|
# https://crates.io/crates/deno
|
||||||
|
# https://crates.io/crates/deno-x86_64-pc-windows-msvc
|
||||||
|
# https://crates.io/crates/deno-x86_64-apple-darwin
|
||||||
|
# https://crates.io/crates/deno-x86_64-unknown-linux-gnu
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import errno
|
||||||
|
from shutil import copytree, ignore_patterns, copyfile
|
||||||
|
from tempfile import mkdtemp
|
||||||
|
from string import Template
|
||||||
|
from util import root_path
|
||||||
|
from util import run
|
||||||
|
|
||||||
|
if sys.platform == "linux2":
|
||||||
|
llvm_target = "x86_64-unknown-linux-gnu"
|
||||||
|
static_lib_suffix = ".a"
|
||||||
|
elif sys.platform == "darwin":
|
||||||
|
llvm_target = "x86_64-apple-darwin"
|
||||||
|
static_lib_suffix = ".a"
|
||||||
|
elif sys.platform == "win32":
|
||||||
|
llvm_target = "x86_64-pc-windows-msvc"
|
||||||
|
static_lib_suffix = ".lib"
|
||||||
|
else:
|
||||||
|
assert (False)
|
||||||
|
|
||||||
|
lib_name = os.path.join(root_path, "target/release/obj/core/libdeno",
|
||||||
|
"libdeno" + static_lib_suffix)
|
||||||
|
|
||||||
|
|
||||||
|
def get_version(toml_path):
|
||||||
|
for line in open(toml_path):
|
||||||
|
match = re.search('version = "(.*)"', line)
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
|
||||||
|
|
||||||
|
core_path = os.path.join(root_path, "core")
|
||||||
|
cargo_toml_path = os.path.join(core_path, "Cargo.toml")
|
||||||
|
version = get_version(cargo_toml_path)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
os.chdir(root_path)
|
||||||
|
|
||||||
|
run(["tools/build.py", "libdeno_static_lib", "--release"])
|
||||||
|
assert (os.path.exists(lib_name))
|
||||||
|
|
||||||
|
root_temp = mkdtemp()
|
||||||
|
print "cargo package temp dir", root_temp
|
||||||
|
|
||||||
|
build_core(root_temp)
|
||||||
|
build_platform_crate(root_temp)
|
||||||
|
|
||||||
|
print "Now go into %s and run 'cargo publish' manually." % root_temp
|
||||||
|
|
||||||
|
|
||||||
|
def build_core(root_temp):
|
||||||
|
core_temp = os.path.join(root_temp, "core")
|
||||||
|
|
||||||
|
# Copy entire core tree into temp directory, excluding build.rs and libdeno
|
||||||
|
# and unnecessary files.
|
||||||
|
copytree(
|
||||||
|
core_path,
|
||||||
|
core_temp,
|
||||||
|
ignore=ignore_patterns("build.rs", "libdeno", ".*", "*.gn", "*.orig"))
|
||||||
|
|
||||||
|
cargo_toml_temp = os.path.join(core_temp, "Cargo.toml")
|
||||||
|
|
||||||
|
t = cargo_toml_deps.substitute(VERSION=version)
|
||||||
|
# Append deps to //core/Cargo.toml
|
||||||
|
# This append is the entire reason we are copying the tree.
|
||||||
|
with open(cargo_toml_temp, "a") as f:
|
||||||
|
f.write(t)
|
||||||
|
|
||||||
|
|
||||||
|
def build_platform_crate(root_temp):
|
||||||
|
platform_temp = os.path.join(root_temp, "platform")
|
||||||
|
|
||||||
|
copy_static_lib(platform_temp)
|
||||||
|
|
||||||
|
inputs = {"TARGET": llvm_target, "VERSION": version}
|
||||||
|
|
||||||
|
generate(platform_temp, "build.rs", platform_build_rs.substitute(inputs))
|
||||||
|
generate(platform_temp, "Cargo.toml",
|
||||||
|
platform_cargo_toml.substitute(inputs))
|
||||||
|
generate(platform_temp, "src/lib.rs", "")
|
||||||
|
|
||||||
|
|
||||||
|
def copy_static_lib(platform_temp):
|
||||||
|
platform_lib = os.path.join(platform_temp, "lib/")
|
||||||
|
mkdir_p(platform_lib)
|
||||||
|
platform_lib_name = os.path.join(platform_lib, os.path.basename(lib_name))
|
||||||
|
assert (os.path.exists(lib_name))
|
||||||
|
copyfile(lib_name, platform_lib_name)
|
||||||
|
|
||||||
|
|
||||||
|
platform_build_rs = Template("""
|
||||||
|
fn main() {
|
||||||
|
use std::env::var;
|
||||||
|
use std::path::Path;
|
||||||
|
if var("TARGET")
|
||||||
|
.map(|target| target == "$TARGET")
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
let dir = var("CARGO_MANIFEST_DIR").unwrap();
|
||||||
|
println!(
|
||||||
|
"cargo:rustc-link-search=native={}",
|
||||||
|
Path::new(&dir).join("lib").display()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
platform_cargo_toml = Template("""
|
||||||
|
[package]
|
||||||
|
name = "deno-$TARGET"
|
||||||
|
description = "Binary dependencies for the 'deno' crate"
|
||||||
|
authors = ["The deno authors <bertbelder@nodejs.org>"]
|
||||||
|
version = "$VERSION"
|
||||||
|
build = "build.rs"
|
||||||
|
include = ["src/*", "lib/*", "Cargo.toml", "build.rs"]
|
||||||
|
license = "MIT"
|
||||||
|
repository = "https://github.com/denoland/deno"
|
||||||
|
""")
|
||||||
|
|
||||||
|
cargo_toml_deps = Template("""
|
||||||
|
[target.x86_64-apple-darwin.dependencies]
|
||||||
|
deno-x86_64-apple-darwin = "=$VERSION"
|
||||||
|
|
||||||
|
[target.x86_64-pc-windows-msvc.dependencies]
|
||||||
|
deno-x86_64-pc-windows-msvc = "=$VERSION"
|
||||||
|
|
||||||
|
[target.x86_64-unknown-linux-gnu.dependencies]
|
||||||
|
deno-x86_64-unknown-linux-gnu = "=$VERSION"
|
||||||
|
""")
|
||||||
|
|
||||||
|
|
||||||
|
def mkdir_p(path):
|
||||||
|
try:
|
||||||
|
os.makedirs(path)
|
||||||
|
except OSError as exc:
|
||||||
|
if exc.errno == errno.EEXIST and os.path.isdir(path):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def generate(out_dir, filename, content):
|
||||||
|
path = os.path.join(out_dir, filename)
|
||||||
|
d = os.path.dirname(path)
|
||||||
|
mkdir_p(d)
|
||||||
|
with open(path, "w") as f:
|
||||||
|
f.write(content)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
|
@ -115,7 +115,7 @@ def write_gn_args(args_filename, args):
|
||||||
def generate_gn_args(mode):
|
def generate_gn_args(mode):
|
||||||
out = []
|
out = []
|
||||||
if mode == "release":
|
if mode == "release":
|
||||||
out += ["is_official_build=true"]
|
out += ["is_official_build=true", "symbol_level=0"]
|
||||||
elif mode == "debug":
|
elif mode == "debug":
|
||||||
out += ["is_debug=true"]
|
out += ["is_debug=true"]
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue