Skip to content

Commit

Permalink
Add basic Arm64 build to CI (denoland#1887)
Browse files Browse the repository at this point in the history
  • Loading branch information
afinch7 authored and ry committed Mar 8, 2019
1 parent aed3e59 commit 8c7a12d
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 18 deletions.
29 changes: 25 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ script:
jobs:
fast_finish: true
include:
- name: "gn release mac"
- name: "gn release mac x86_64"
os: osx
after_success:
- &gzip_release
Expand All @@ -93,7 +93,7 @@ jobs:
repo: denoland/deno
skip-cleanup: true

- name: "gn release linux"
- name: "gn release linux x86_64"
os: linux
after_success:
- *gzip_release
Expand All @@ -109,12 +109,33 @@ jobs:
branch: master
repo: denoland/deno
skip-cleanup: true

- name: "cargo release linux arm64"
os: linux
dist: xenial
script:
- rustup target add aarch64-unknown-linux-gnu
- sudo apt update
- |-
sudo apt -yq --no-install-suggests --no-install-recommends install \
g++-5-aarch64-linux-gnu gcc-5-aarch64-linux-gnu g++-5-multilib \
libc6-arm64-cross
- build/linux/sysroot_scripts/install-sysroot.py --arch=arm64
- export DENO_BUILD_ARGS="target_cpu=\"arm64\" v8_target_cpu=\"arm64\""
- export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER="/usr/bin/aarch64-linux-gnu-gcc-5"
- export CC_aarch64_unknown_linux_gnu="/usr/bin/aarch64-linux-gnu-gcc-5"
- cargo build -vv --target=aarch64-unknown-linux-gnu --release --locked
- cargo build -vv --target=aarch64-unknown-linux-gnu --release --tests --locked
- sudo apt -yq install qemu qemu-user binfmt-support qemu-user-binfmt
- sudo ln -s /usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 /lib/ld-linux-aarch64.so.1
- export QEMU_LD_PREFIX=/usr/aarch64-linux-gnu
- $CARGO_TARGET_DIR/aarch64-unknown-linux-gnu/release/deno tests/002_hello.ts
# - DENO_BUILD_MODE=release ./tools/test.py $CARGO_TARGET_DIR/aarch64-unknown-linux-gnu/release TODO(afinch7): Get the tests working

- name: "cargo release linux"
- name: "cargo release linux x86_64"
os: linux
script:
- cargo build -vv --release --locked

# LSAN: We are in the process of getting a completely clean LSAN build,
# but it will take some work. So for now we just run a subset of the
# tests. We want to detect leaks during the build process as well as
Expand Down
13 changes: 13 additions & 0 deletions BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,19 @@ group("deno_deps") {
]
}

# Optimized dependencies for cross compiled builds.
# This can be removed once we get snapshots into cross compiled builds.
group("deno_deps_cross") {
testonly = true
deps = [
":compiler_bundle",
":main_bundle",
":msg_rs",
"libdeno:libdeno_static_lib",
"libdeno:test_cc",
]
}

# Reads the cargo info from Cargo.toml
deno_cargo_info = exec_script("build_extra/rust/get_cargo_info.py",
[ rebase_path("Cargo.toml", root_build_dir) ],
Expand Down
50 changes: 40 additions & 10 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,33 @@ fn main() {
env::var("PROFILE").unwrap()
};

// Equivalent to target arch != host arch
let is_different_target_arch =
env::var("CARGO_CFG_TARGET_ARCH").unwrap().as_str() != env::var("HOST")
.unwrap()
.as_str()
.split("-")
.collect::<Vec<&str>>()[0];

// If we are using the same target as the host's default
// "rustup target list" should show your default target
let is_default_target =
env::var("TARGET").unwrap() == env::var("HOST").unwrap();

let cwd = env::current_dir().unwrap();
let gn_out_path = cwd.join(format!("target/{}", gn_mode));
// If not using host default target the output folder will change
// target/release will become target/$TARGET/release
// Gn should also be using this output directory as well
// most things will work with gn using the default
// output directory but some tests depend on artifacts
// being in a specific directory relative to the main build output
let gn_out_path = cwd.join(format!(
"target/{}",
match is_default_target {
true => gn_mode.clone(),
false => format!("{}/{}", env::var("TARGET").unwrap(), gn_mode.clone()),
}
));
let gn_out_dir = normalize_path(&gn_out_path);

// Tell Cargo when to re-run this file. We do this first, so these directives
Expand Down Expand Up @@ -56,8 +81,11 @@ fn main() {
println!("cargo:rustc-cfg=feature=\"check-only\"");
} else {
// "Full" (non-RLS) build.
gn_target = "deno_deps";

if is_different_target_arch {
gn_target = "deno_deps_cross";
} else {
gn_target = "deno_deps";
}
// Link with libdeno.a/.lib, which includes V8.
println!("cargo:rustc-link-search=native={}/obj/libdeno", gn_out_dir);
if cfg!(target_os = "windows") {
Expand All @@ -76,13 +104,15 @@ fn main() {
}
}

// If target_arch != host_arch disable snapshots since we are cross compiling.
if env::var("CARGO_CFG_TARGET_ARCH").unwrap().as_str() != env::var("HOST")
.unwrap()
.as_str()
.split("-")
.collect::<Vec<&str>>()[0]
{
// If target_arch != host_arch disable snapshots.
// v8 snapshots seem to not be compatible with binaries
// other than the ones used to gernerate them,
// so for non native architecture builds we don't
// have an easy way to generate these snapshots.
// We can't run any binary capable of generating
// compatible snapshots without emulating the
// target architecture.
if is_different_target_arch {
// no-snapshot-init is not related to v8_use_snapshots
println!("cargo:rustc-cfg=feature=\"no-snapshot-init\"");
}
Expand Down
8 changes: 4 additions & 4 deletions src/isolate_init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ pub fn deno_isolate_init() -> IsolateInit {
}
} else {
debug!("Deno isolate init with snapshots.");
#[cfg(not(feature = "check-only"))]
#[cfg(not(any(feature = "check-only", feature = "no-snapshot-init")))]
let data =
include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/snapshot_deno.bin"));
#[cfg(feature = "check-only")]
#[cfg(any(feature = "check-only", feature = "no-snapshot-init"))]
let data = vec![];

unsafe {
Expand Down Expand Up @@ -62,10 +62,10 @@ pub fn compiler_isolate_init() -> IsolateInit {
}
} else {
debug!("Deno isolate init with snapshots.");
#[cfg(not(feature = "check-only"))]
#[cfg(not(any(feature = "check-only", feature = "no-snapshot-init")))]
let data =
include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/snapshot_compiler.bin"));
#[cfg(feature = "check-only")]
#[cfg(any(feature = "check-only", feature = "no-snapshot-init"))]
let data = vec![];

unsafe {
Expand Down

0 comments on commit 8c7a12d

Please sign in to comment.