From 5e8965c1c80a7ca3bb2af6da154479ed4ac25d72 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Fri, 5 Aug 2016 18:33:05 -0500 Subject: [PATCH] support targets that don't support atomics i.e. whose specification contains `"max-atomic-width": 0`. For these targets, Xargo only compiles the `core` and `rustc_unicode` crates as the other crates depend on atomics (e.g. `alloc::Arc`). closes #25 --- CHANGELOG.md | 6 ++++ Cargo.lock | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 15 +++++++- src/sysroot.rs | 11 ++++-- tests/smoke.rs | 35 ++++++++++++++++++ 6 files changed, 161 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8417d5..35a6316 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Added + +- Support targets that don't support atomics (`"max-atomic-width": 0`). For these targets, Xargo + only compiles the `core` and `rustc_unicode` crates as the other crates depend on atomics (e.g. + `alloc::Arc`). + ## [v0.1.3] - 2016-04-24 ### Added diff --git a/Cargo.lock b/Cargo.lock index de56244..1b23a25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,6 +7,7 @@ dependencies = [ "curl 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tar 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -133,6 +134,11 @@ dependencies = [ "strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "dtoa" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "env_logger" version = "0.3.3" @@ -209,6 +215,11 @@ name = "glob" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "itoa" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -415,6 +426,22 @@ dependencies = [ "nom 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde_json" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "strsim" version = "0.3.0" @@ -557,3 +584,72 @@ name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[metadata] +"checksum advapi32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "307c92332867e586720c0222ee9d890bbe8431711efed8a1b06bc5b40fc66bd7" +"checksum aho-corasick 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67077478f0a03952bed2e6786338d400d40c25e9836e08ad50af96607317fd03" +"checksum bitflags 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a6577517ecd0ee0934f48a7295a89aaef3e6dfafeac404f94c0b3448518ddfe" +"checksum cargo 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2a9eb1864c1de33114c63e7b3d23f527d3efc1efe07526219f35e17615db19e8" +"checksum chrono 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)" = "a714b6792cb4bb07643c35d2a051d92988d4e296322a60825549dd0764bcd396" +"checksum cmake 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "dfcf5bcece56ef953b8ea042509e9dcbdfe97820b7e20d86beb53df30ed94978" +"checksum crates-io 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f74ab43c18507700e414ffee7c3b74334198e896dc7d368e2a7e39564f1381c" +"checksum crossbeam 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "fb974f835e90390c5f9dfac00f05b06dc117299f5ea4e85fbc7bb443af4911cc" +"checksum curl 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "2a48b72c66a1b8fc6767fe4f3cda7d6b9bdfab8f3f168344b830eddbbe8e2da0" +"checksum curl-sys 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "93196668f75a947d849e1f2db9277223884ece3af169cbff3d36ceeeaf7736b0" +"checksum docopt 0.6.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4cc0acb4ce0828c6a5a11d47baa432fe885881c27428c3a4e473e454ffe57a76" +"checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" +"checksum env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "aba65b63ffcc17ffacd6cf5aa843da7c5a25e3bd4bbe0b7def8b214e411250e5" +"checksum filetime 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "5363ab8e4139b8568a6237db5248646e5a8a2f89bd5ccb02092182b11fd3e922" +"checksum flate2 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f9e6fc69e0509336ff58a2e5ab91c7a9629cb78bad26e67d8c4489f5a648addb" +"checksum fs2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "66fd7974e97e3c47dc89c146a05c6e8e90c4267daee9e75c229d4e049dce454d" +"checksum gcc 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)" = "806e63121fbf30760b060a5fc2d1e9f47e1bd356d183e8870367c6c12cc9d5ed" +"checksum gdi32-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "65256ec4dc2592e6f05bfc1ca3b956a4e0698aa90b1dff1f5687d55a5a3fd59a" +"checksum git2 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c663e06498eaced90ccd830ac23332b5b521b9a9ee82d095520b3394b5e9098" +"checksum git2-curl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c13dafba61b79dc9fa45b40b0478a5196cab2b571a355128667fae951bb2d0cc" +"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" +"checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "55f3730be7e803cf350d32061958171731c2395831fbd67a61083782808183e0" +"checksum libgit2-sys 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "71064054e4a63d5558793ec3a96c5e352eb39817b1f99afaaaa9f22a691cb538" +"checksum libressl-pnacl-sys 2.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "cbc058951ab6a3ef35ca16462d7642c4867e6403520811f28537a4e2f2db3e71" +"checksum libssh2-sys 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "c45fba84ee1fa05b830cb471741ef30d41eb1c3b97160b8ad8d955af824de880" +"checksum libz-sys 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "44da01105188b409d4011b19187f92fc3c4913df6a9c41f7961f65222935bff2" +"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054" +"checksum matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "15305656809ce5a4805b1ff2946892810992197ce1270ff79baded852187942e" +"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" +"checksum miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d1f4d337a01c32e1f2122510fed46393d53ca35a7f429cb0450abaedfa3ed54" +"checksum nom 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6caab12c5f97aa316cb249725aa32115118e1522b445e26c257dd77cad5ffd4e" +"checksum num 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "c04bd954dbf96f76bab6e5bd6cef6f1ce1262d15268ce4f926d2b5b778fa7af2" +"checksum num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "fb24d9bfb3f222010df27995441ded1e954f8f69cd35021f6bef02ca9552fb92" +"checksum num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "287a1c9969a847055e1122ec0ea7a5c5d6f72aad97934e131c83d5c08ab4e45c" +"checksum num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "51eab148f171aefad295f8cece636fc488b9b392ef544da31ea4b8ef6b9e9c39" +"checksum num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "51fedae97a05f7353612fe017ab705a37e6db8f4d67c5c6fe739a9e70d6eed09" +"checksum openssl-sys 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ec32ecdf14d7e65ef7a750849c3c1a2d68315d099b57a68931bca2d4d73d9721" +"checksum pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8cee804ecc7eaf201a4a207241472cc870e825206f6c031e3ee2a72fa425f2fa" +"checksum pnacl-build-helper 1.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "61c9231d31aea845007443d62fcbb58bb6949ab9c18081ee1e09920e0cf1118b" +"checksum rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2791d88c6defac799c3f20d74f094ca33b9332612d9aef9078519c82e4fe04a5" +"checksum regex 0.1.68 (registry+https://github.com/rust-lang/crates.io-index)" = "b4329b8928a284580a1c63ec9d846b12f6d3472317243ff7077aff11f23f2b29" +"checksum regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "841591b1e05609a643e3b4d0045fce04f701daba7151ddcd3ad47b080693d5a9" +"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" +"checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" +"checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" +"checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f" +"checksum serde 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad09a04412d1ac27ab9c1170190cfed637e0463f2f2ce79e718141624f43a45" +"checksum serde_json 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c86308e6709fa2c1707aa59406cb29a5018c1b33f1e4c958af36b71acbf19a3b" +"checksum strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4d73a2c36a4d095ed1a6df5cbeac159863173447f7a82b3f4757426844ab825" +"checksum tar 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b9d327376c6bb766d5eaf130784a331c91aa093ef7b2a977377c9bc93cebf0e1" +"checksum tempdir 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0b62933a3f96cd559700662c34f8bab881d9e3540289fb4f368419c7f13a5aa9" +"checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a" +"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" +"checksum thread_local 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0694f51610ef7cfac7a1b81de7f1602ee5356e76541bcd62c40e71933338cab1" +"checksum time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7ec6d62a20df54e07ab3b78b9a3932972f4b7981de295563686849eb3989af" +"checksum toml 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "fcd27a04ca509aff336ba5eb2abc58d456f52c4ff64d9724d88acb85ead560b6" +"checksum unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c1f7ceb96afdfeedee42bade65a0d585a6a0106f681b6749c8ff4daa8df30b3f" +"checksum unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26643a2f83bac55f1976fb716c10234485f9202dcd65cfbdf9da49867b271172" +"checksum url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)" = "cbaa8377a162d88e7d15db0cf110c8523453edcbc5bc66d2b6fffccffa34a068" +"checksum url 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f6d04073d0fcd045a1cf57aea560d1be5ba812d8f28814e1e1cf0e90ff4d2f03" +"checksum user32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6717129de5ac253f5642fc78a51d0c7de6f9f53d617fc94e9bae7f6e71cf5504" +"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" +"checksum uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f" +"checksum uuid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9767696a9e1bc7a73f2d5f8e0f5428b076cecd9199c200c0364aa0b2d57b8dfa" +"checksum winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4dfaaa8fbdaa618fa6914b59b2769d690dd7521920a18d84b42d254678dd5fd4" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/Cargo.toml b/Cargo.toml index 0ce999f..7a9ab83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ chrono = "0.2.20" curl = "0.2.18" flate2 = "0.2.13" rustc_version = "0.1.7" +serde_json = "0.8.0" tar = "0.4.4" tempdir = "0.3.4" term = "0.4.4" diff --git a/src/main.rs b/src/main.rs index 9c0ebad..370e065 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,23 +3,28 @@ extern crate chrono; extern crate curl; extern crate flate2; extern crate rustc_version; +extern crate serde_json; extern crate tar; extern crate tempdir; extern crate term; -use std::{env, fs, mem}; +use std::collections::HashMap; use std::ffi::OsString; use std::fs::File; use std::hash::{Hash, SipHasher}; use std::io::Read; use std::path::{Path, PathBuf}; use std::process::Command; +use std::{env, fs, mem}; use cargo::util::{self, CargoResult, ChainError, Config, Filesystem}; use cargo::core::shell::{ColorConfig, Verbosity}; +use serde_json::{de, Value}; mod sysroot; +type Spec = HashMap; + fn main() { let config_opt = &mut None; if let Err(e) = run(config_opt) { @@ -91,6 +96,7 @@ pub struct Target { hasher: SipHasher, // Path to $triple.json file path: PathBuf, + spec: Spec, triple: String, } @@ -129,11 +135,18 @@ impl Target { Ok(Target { hasher: try!(hash(path)), path: try!(fs::canonicalize(path)), + spec: try!(parse_json(path)), triple: triple, }) } } +fn parse_json(p: &Path) -> CargoResult { + let json = &mut String::new(); + try!(try!(File::open(p)).read_to_string(json)); + de::from_str(json).map_err(|_| util::human("Target specification file is not valid JSON")) +} + fn parse_args() -> CargoResult<(Command, Option, bool)> { let mut cargo = Command::new("cargo"); let mut target = None; diff --git a/src/sysroot.rs b/src/sysroot.rs index e76cae8..f19e351 100644 --- a/src/sysroot.rs +++ b/src/sysroot.rs @@ -179,6 +179,7 @@ fn rebuild_sysroot(config: &Config, } const CRATES: &'static [&'static str] = &["collections", "rand"]; + const NO_ATOMICS_CRATES: &'static [&'static str] = &["rustc_unicode"]; const TOML: &'static str = "[package] name = 'sysroot' version = '0.0.0' @@ -233,8 +234,14 @@ version = '0.0.0' if verbose { cargo.arg("--verbose"); } - for krate in CRATES { - cargo.args(&["-p", krate]); + if target.spec.get("max-atomic-width").map(|w| w.as_u64() == Some(0)) == Some(true) { + for krate in NO_ATOMICS_CRATES { + cargo.args(&["-p", krate]); + } + } else { + for krate in CRATES { + cargo.args(&["-p", krate]); + } } cargo.current_dir(td); let status = try!(cargo.status()); diff --git a/tests/smoke.rs b/tests/smoke.rs index 49368e5..38283c1 100644 --- a/tests/smoke.rs +++ b/tests/smoke.rs @@ -27,6 +27,18 @@ const CUSTOM_JSON: &'static str = r#" } "#; +const NO_ATOMICS_JSON: &'static str = r#" + { + "arch": "arm", + "data-layout": "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", + "llvm-target": "thumbv6m-none-eabi", + "max-atomic-width": 0, + "os": "none", + "target-endian": "little", + "target-pointer-width": "32" + } +"#; + fn xargo() -> Command { let mut path = try!(env::current_exe()); path.pop(); @@ -250,3 +262,26 @@ fn rebuild_on_modified_rustflags() { cleanup(TARGET); } + +// For targets that don't support atomics, Xargo only compiles the `core` crate +#[test] +fn no_atomics() { + const TARGET: &'static str = "__no_atomics"; + const CRATES: &'static [&'static str] = &["core", "rustc_unicode"]; + + let td = try!(TempDir::new("xargo")); + let td = &td.path(); + try!(try!(File::create(td.join(format!("{}.json", TARGET)))) + .write_all(NO_ATOMICS_JSON.as_bytes())); + + run(xargo().args(&["init", "--vcs", "none", "--name", TARGET]).current_dir(td)); + try!(try!(OpenOptions::new().truncate(true).write(true).open(td.join("src/lib.rs"))) + .write_all(LIB_RS)); + run(xargo().args(&["build", "--target", TARGET]).current_dir(td)); + + for krate in CRATES { + assert!(exists_rlib(krate, TARGET)); + } + + cleanup(TARGET); +}