From 972fbd4582834c94a6e639521a11eceece703417 Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Tue, 29 Nov 2016 16:02:55 -0600 Subject: [PATCH 1/7] rust: we need the build system snapshot, not host We need the Rust snapshot (stage0) for the build environment not the host environment. This is not affecting us currently because we are only building native versions of this today but should improve the behavior of #81 or if any Rust components are built for the target machine. --- recipes-devtools/rust/rust-source-1.10.0.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-devtools/rust/rust-source-1.10.0.inc b/recipes-devtools/rust/rust-source-1.10.0.inc index 4ee024a..45a7792 100644 --- a/recipes-devtools/rust/rust-source-1.10.0.inc +++ b/recipes-devtools/rust/rust-source-1.10.0.inc @@ -6,7 +6,7 @@ RS_VERSION = "1.9.0" RS_KEY = "e8edd0fd" -RUST_SNAPSHOT = "rustc-${RS_VERSION}-${RUST_HOST_SYS}" +RUST_SNAPSHOT = "rustc-${RS_VERSION}-${RUST_BUILD_SYS}" # These are x86_64-unknown-linux-gnu hashes, how can we add more? SRC_URI[rust-snapshot.md5sum] = "f1cf6d2fe15e4be18a08259f1540a4ae" From ba428c19bf88895b183fa04bb1e214be1a9cf37d Mon Sep 17 00:00:00 2001 From: Cody P Schafer Date: Thu, 29 Sep 2016 23:12:43 -0400 Subject: [PATCH 2/7] rust: regenerate patches for 1.12.1 --- ...lt-target.json-path-libdir-rust-targ.patch | 107 ++++++++++++++++++ ...e-RUSTFLAGS-to-override-target-libs-.patch | 73 ++++++++++++ ...3-mk-add-missing-CFG_LIBDIR_RELATIVE.patch | 27 +++++ ...cal-workaround-for-NULL-__dso_handle.patch | 25 ++++ ...mk-install-use-disable-rewrite-paths.patch | 30 +++++ ...rriding-crate_hash-with-C-crate_hash.patch | 65 +++++++++++ ...tform.mk-pass-C-crate_hash-to-builds.patch | 27 +++++ ...o-disable-rewriting-of-install-paths.patch | 58 ++++++++++ recipes-devtools/rust/rust-source-1.12.1.inc | 18 +++ 9 files changed, 430 insertions(+) create mode 100644 recipes-devtools/rust/files/rust-1.12.1/0001-Target-add-default-target.json-path-libdir-rust-targ.patch create mode 100644 recipes-devtools/rust/files/rust-1.12.1/0002-mk-for-stage0-use-RUSTFLAGS-to-override-target-libs-.patch create mode 100644 recipes-devtools/rust/files/rust-1.12.1/0003-mk-add-missing-CFG_LIBDIR_RELATIVE.patch create mode 100644 recipes-devtools/rust/files/rust-1.12.1/0005-std-thread_local-workaround-for-NULL-__dso_handle.patch create mode 100644 recipes-devtools/rust/files/rust-1.12.1/0006-mk-install-use-disable-rewrite-paths.patch create mode 100644 recipes-devtools/rust/files/rust-1.12.1/0007-Allow-overriding-crate_hash-with-C-crate_hash.patch create mode 100644 recipes-devtools/rust/files/rust-1.12.1/0008-mk-platform.mk-pass-C-crate_hash-to-builds.patch create mode 100644 recipes-devtools/rust/files/rust-installer-1.12.1/0001-add-option-to-disable-rewriting-of-install-paths.patch create mode 100644 recipes-devtools/rust/rust-source-1.12.1.inc diff --git a/recipes-devtools/rust/files/rust-1.12.1/0001-Target-add-default-target.json-path-libdir-rust-targ.patch b/recipes-devtools/rust/files/rust-1.12.1/0001-Target-add-default-target.json-path-libdir-rust-targ.patch new file mode 100644 index 0000000..6186c5b --- /dev/null +++ b/recipes-devtools/rust/files/rust-1.12.1/0001-Target-add-default-target.json-path-libdir-rust-targ.patch @@ -0,0 +1,107 @@ +From bb2d8649b2b344e0bb4b1cf94135378831735557 Mon Sep 17 00:00:00 2001 +From: Cody P Schafer +Date: Tue, 18 Nov 2014 01:40:21 -0500 +Subject: [PATCH 01/10] Target: add default target.json path: + $libdir/rust/targets + +--- + src/librustc/session/config.rs | 6 +++--- + src/librustc/session/mod.rs | 8 ++++++-- + src/librustc_back/target/mod.rs | 13 +++++++++++-- + 3 files changed, 20 insertions(+), 7 deletions(-) + +diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs +index e988ddc..563f3ac 100644 +--- a/src/librustc/session/config.rs ++++ b/src/librustc/session/config.rs +@@ -42,7 +42,7 @@ use std::env; + use std::fmt; + use std::hash::{Hasher, SipHasher}; + use std::iter::FromIterator; +-use std::path::PathBuf; ++use std::path::{Path, PathBuf}; + + pub struct Config { + pub target: Target, +@@ -1011,8 +1011,8 @@ pub fn build_configuration(sess: &Session, + v + } + +-pub fn build_target_config(opts: &Options, sp: &Handler) -> Config { +- let target = match Target::search(&opts.target_triple) { ++pub fn build_target_config(sysroot: &Path, opts: &Options, sp: &Handler) -> Config { ++ let target = match Target::search(sysroot, &opts.target_triple[..]) { + Ok(t) => t, + Err(e) => { + sp.struct_fatal(&format!("Error loading target specification: {}", e)) +diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs +index c71253a..13b4e05 100644 +--- a/src/librustc/session/mod.rs ++++ b/src/librustc/session/mod.rs +@@ -395,13 +395,17 @@ pub fn build_session_(sopts: config::Options, + codemap: Rc, + cstore: Rc CrateStore<'a>>) + -> Session { +- let host = match Target::search(config::host_triple()) { ++ let sysroot = match sopts.maybe_sysroot { ++ Some(ref x) => PathBuf::from(x), ++ None => filesearch::get_or_default_sysroot() ++ }; ++ let host = match Target::search(&sysroot, config::host_triple()) { + Ok(t) => t, + Err(e) => { + panic!(span_diagnostic.fatal(&format!("Error loading host specification: {}", e))); + } + }; +- let target_cfg = config::build_target_config(&sopts, &span_diagnostic); ++ let target_cfg = config::build_target_config(&sysroot, &sopts, &span_diagnostic); + let p_s = parse::ParseSess::with_span_handler(span_diagnostic, codemap); + let default_sysroot = match sopts.maybe_sysroot { + Some(_) => None, +diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs +index 18686e3..d439b59 100644 +--- a/src/librustc_back/target/mod.rs ++++ b/src/librustc_back/target/mod.rs +@@ -49,6 +49,8 @@ use std::collections::BTreeMap; + use std::default::Default; + use std::io::prelude::*; + use syntax::abi::Abi; ++use std::borrow::ToOwned; ++use std::path::Path; + + mod android_base; + mod apple_base; +@@ -541,12 +543,13 @@ impl Target { + /// + /// The error string could come from any of the APIs called, including + /// filesystem access and JSON decoding. +- pub fn search(target: &str) -> Result { ++ pub fn search(sysroot: &Path, target: &str) -> Result { + use std::env; + use std::ffi::OsString; + use std::fs::File; + use std::path::{Path, PathBuf}; + use serialize::json; ++ use std::iter::IntoIterator; + + fn load_file(path: &Path) -> Result { + let mut f = File::open(path).map_err(|e| e.to_string())?; +@@ -577,8 +580,14 @@ impl Target { + .unwrap_or(OsString::new()); + + // FIXME 16351: add a sane default search path? ++ let mut default_path = sysroot.to_owned(); ++ default_path.push(env!("CFG_LIBDIR_RELATIVE")); ++ default_path.push("rustlib"); + +- for dir in env::split_paths(&target_path) { ++ let paths = env::split_paths(&target_path) ++ .chain(Some(default_path).into_iter()); ++ ++ for dir in paths { + let p = dir.join(&path); + if p.is_file() { + return load_file(&p); +-- +2.10.0 + diff --git a/recipes-devtools/rust/files/rust-1.12.1/0002-mk-for-stage0-use-RUSTFLAGS-to-override-target-libs-.patch b/recipes-devtools/rust/files/rust-1.12.1/0002-mk-for-stage0-use-RUSTFLAGS-to-override-target-libs-.patch new file mode 100644 index 0000000..e1eaa05 --- /dev/null +++ b/recipes-devtools/rust/files/rust-1.12.1/0002-mk-for-stage0-use-RUSTFLAGS-to-override-target-libs-.patch @@ -0,0 +1,73 @@ +From 0829743c109a147213d06d38052662a5f2b0dd9b Mon Sep 17 00:00:00 2001 +From: Cody P Schafer +Date: Tue, 18 Nov 2014 14:52:56 -0500 +Subject: [PATCH 02/10] mk: for stage0, use RUSTFLAGS to override target libs + dir + +Setting HLIB specially for stage0 (and even more specially for windows) +also affects the location we place TLIB. To keep the TLIBs we build in +the place requested by configure, use '-L' and '--sysroot' to point +stage0-rustc at the appropriate location. +--- + mk/main.mk | 29 ++++++++++++----------------- + 1 file changed, 12 insertions(+), 17 deletions(-) + +diff --git a/mk/main.mk b/mk/main.mk +index 90d3563..cdcbdf2 100644 +--- a/mk/main.mk ++++ b/mk/main.mk +@@ -420,32 +420,26 @@ define SREQ + HROOT$(1)_H_$(3) = $(3)/stage$(1) + HBIN$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/bin + +-ifeq ($$(CFG_WINDOWSY_$(3)),1) +-# On Windows we always store host runtime libraries in the 'bin' directory because +-# there's no rpath. Target libraries go under $CFG_LIBDIR_RELATIVE (usually 'lib'). +-HLIB_RELATIVE$(1)_H_$(3) = bin +-TROOT$(1)_T_$(2)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(CFG_LIBDIR_RELATIVE)/rustlib/$(2) +-# Remove the next 3 lines after a snapshot +-ifeq ($(1),0) +-RUSTFLAGS_STAGE0 += -L $$(TROOT$(1)_T_$(2)_H_$(3))/lib +-endif +- +-else +- +-ifeq ($(1),0) +-HLIB_RELATIVE$(1)_H_$(3) = lib +-else + HLIB_RELATIVE$(1)_H_$(3) = $$(CFG_LIBDIR_RELATIVE) +-endif ++ + TROOT$(1)_T_$(2)_H_$(3) = $$(HLIB$(1)_H_$(3))/rustlib/$(2) + +-endif + HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(HLIB_RELATIVE$(1)_H_$(3)) + + # Destinations of artifacts for target architectures + TBIN$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/bin + TLIB$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/lib + ++# Don't trust stage0, be explicit about libraries ++# TODO: rather than specifying sysroot, we really want to tell which libdir to ++# use (ie: the dir containing 'rustlib'). This would allow us to avoid ++# passing the '-L' options. ++ifeq ($(1),0) ++RUSTFLAGS_S_$(1)_T_$(2)_H_$(3) += --sysroot "$$(HROOT$(1)_H_$(3))" \ ++ -L "$$(TLIB$(1)_T_$(2)_H_$(3))" ++endif ++ ++ + # Preqrequisites for using the stageN compiler + ifeq ($(1),0) + HSREQ$(1)_H_$(3) = $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) +@@ -558,6 +552,7 @@ STAGE$(1)_T_$(2)_H_$(3) := \ + $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \ + --cfg $$(CFGFLAG$(1)_T_$(2)_H_$(3)) \ + $$(CFG_RUSTC_FLAGS) $$(EXTRAFLAGS_STAGE$(1)) --target=$(2)) \ ++ $$(RUSTFLAGS_S_$(1)_T_$(2)_H_$(3)) \ + $$(RUSTC_FLAGS_$(2)) + + endef +-- +2.10.0 + diff --git a/recipes-devtools/rust/files/rust-1.12.1/0003-mk-add-missing-CFG_LIBDIR_RELATIVE.patch b/recipes-devtools/rust/files/rust-1.12.1/0003-mk-add-missing-CFG_LIBDIR_RELATIVE.patch new file mode 100644 index 0000000..dad4b4e --- /dev/null +++ b/recipes-devtools/rust/files/rust-1.12.1/0003-mk-add-missing-CFG_LIBDIR_RELATIVE.patch @@ -0,0 +1,27 @@ +From 128503bf447e82b9e99bea8ef83294a6446036b5 Mon Sep 17 00:00:00 2001 +From: Cody P Schafer +Date: Tue, 18 Nov 2014 13:48:14 -0500 +Subject: [PATCH 03/10] mk: add missing CFG_LIBDIR_RELATIVE + +--- + mk/grammar.mk | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/mk/grammar.mk b/mk/grammar.mk +index 0d527bd..926f247 100644 +--- a/mk/grammar.mk ++++ b/mk/grammar.mk +@@ -11,8 +11,8 @@ + BG = $(CFG_BUILD_DIR)/grammar/ + SG = $(S)src/grammar/ + B = $(CFG_BUILD_DIR)/$(CFG_BUILD)/stage2/ +-L = $(B)lib/rustlib/$(CFG_BUILD)/lib +-LD = $(CFG_BUILD)/stage2/lib/rustlib/$(CFG_BUILD)/lib/ ++L = $(B)$(CFG_LIBDIR_RELATIVE)/rustlib/$(CFG_BUILD)/lib ++LD = $(CFG_BUILD)/stage2/$(CFG_LIBDIR_RELATIVE)/rustlib/$(CFG_BUILD)/lib/ + RUSTC = $(STAGE2_T_$(CFG_BUILD)_H_$(CFG_BUILD)) + ifeq ($(CFG_OSTYPE),apple-darwin) + FLEX_LDFLAGS=-ll +-- +2.10.0 + diff --git a/recipes-devtools/rust/files/rust-1.12.1/0005-std-thread_local-workaround-for-NULL-__dso_handle.patch b/recipes-devtools/rust/files/rust-1.12.1/0005-std-thread_local-workaround-for-NULL-__dso_handle.patch new file mode 100644 index 0000000..42a6c88 --- /dev/null +++ b/recipes-devtools/rust/files/rust-1.12.1/0005-std-thread_local-workaround-for-NULL-__dso_handle.patch @@ -0,0 +1,25 @@ +From d73ce5d99346812fcf063a87b4efac54c263737d Mon Sep 17 00:00:00 2001 +From: Cody P Schafer +Date: Wed, 3 Dec 2014 19:15:19 -0500 +Subject: [PATCH 05/10] std/thread_local: workaround for NULL __dso_handle + +--- + src/libstd/thread/local.rs | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs +index 152b977..3c62862 100644 +--- a/src/libstd/thread/local.rs ++++ b/src/libstd/thread/local.rs +@@ -380,7 +380,7 @@ pub mod elf { + #[linkage = "extern_weak"] + static __cxa_thread_atexit_impl: *const libc::c_void; + } +- if !__cxa_thread_atexit_impl.is_null() { ++ if !__cxa_thread_atexit_impl.is_null() && !__dso_handle.is_null() { + type F = unsafe extern fn(dtor: unsafe extern fn(*mut u8), + arg: *mut u8, + dso_handle: *mut u8) -> libc::c_int; +-- +2.10.0 + diff --git a/recipes-devtools/rust/files/rust-1.12.1/0006-mk-install-use-disable-rewrite-paths.patch b/recipes-devtools/rust/files/rust-1.12.1/0006-mk-install-use-disable-rewrite-paths.patch new file mode 100644 index 0000000..1c003b5 --- /dev/null +++ b/recipes-devtools/rust/files/rust-1.12.1/0006-mk-install-use-disable-rewrite-paths.patch @@ -0,0 +1,30 @@ +From f8d4b1ea925789bca1aa6261017d63f5efa95c0f Mon Sep 17 00:00:00 2001 +From: Cody P Schafer +Date: Mon, 2 Mar 2015 13:34:59 -0500 +Subject: [PATCH 06/10] mk/install: use disable-rewrite-paths + +This stops the install scripts from doing work we've already handled. + +Path rewriting is only useful for prepackaged binary installers. +--- + mk/install.mk | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/mk/install.mk b/mk/install.mk +index d2e5449..e67650b 100644 +--- a/mk/install.mk ++++ b/mk/install.mk +@@ -12,7 +12,9 @@ RUN_INSTALLER = cd tmp/empty_dir && \ + sh ../../tmp/dist/$(1)/install.sh \ + --prefix="$(DESTDIR)$(CFG_PREFIX)" \ + --libdir="$(DESTDIR)$(CFG_LIBDIR)" \ +- --mandir="$(DESTDIR)$(CFG_MANDIR)" ++ --mandir="$(DESTDIR)$(CFG_MANDIR)" \ ++ "$(MAYBE_DISABLE_VERIFY)" \ ++ --disable-rewrite-paths + + install: + ifeq (root user, $(USER) $(patsubst %,user,$(SUDO_USER))) +-- +2.10.0 + diff --git a/recipes-devtools/rust/files/rust-1.12.1/0007-Allow-overriding-crate_hash-with-C-crate_hash.patch b/recipes-devtools/rust/files/rust-1.12.1/0007-Allow-overriding-crate_hash-with-C-crate_hash.patch new file mode 100644 index 0000000..cb8e017 --- /dev/null +++ b/recipes-devtools/rust/files/rust-1.12.1/0007-Allow-overriding-crate_hash-with-C-crate_hash.patch @@ -0,0 +1,65 @@ +From 2a42d59c3671f3ab68d8ff49c46240842aff6eb6 Mon Sep 17 00:00:00 2001 +From: Steven Walter +Date: Wed, 18 Nov 2015 08:33:26 -0500 +Subject: [PATCH 07/10] Allow overriding crate_hash with -C crate_hash + +The current crate hash is not stable from run-to-run. This causes +problems with bitbake; it needs a guarantee that every build with the +same input will generate compatible output, otherwise sstate won't work. +Using -C crate_hash, we can do that by using the bitbake input hash to +determine the crate hash; the bitbake input hash will be stable, but +still different for different rust recipes. + +Upstream-Status: not-appropriate + +Upstream wants to fix it's actual object generation here. See +https://github.com/rust-lang/rust/issues/34902 (and others) for details. +--- + src/librustc/session/config.rs | 2 ++ + src/librustc_trans/back/link.rs | 12 +++++++++++- + 2 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs +index 563f3ac..52a5130 100644 +--- a/src/librustc/session/config.rs ++++ b/src/librustc/session/config.rs +@@ -804,6 +804,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options, + "choose the code model to use (rustc --print code-models for details)"), + metadata: Vec = (Vec::new(), parse_list, [TRACKED], + "metadata to mangle symbol names with"), ++ crate_hash: String = ("".to_string(), parse_string, [TRACKED], ++ "override crate hash with given value"), + extra_filename: String = ("".to_string(), parse_string, [UNTRACKED], + "extra data to put in each output filename"), + codegen_units: usize = (1, parse_uint, [UNTRACKED], +diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs +index 3cf2500..0e48063 100644 +--- a/src/librustc_trans/back/link.rs ++++ b/src/librustc_trans/back/link.rs +@@ -125,12 +125,22 @@ pub fn find_crate_name(sess: Option<&Session>, + + } + ++use std::hash::{Hasher, SipHasher}; ++use rustc::hir::svh::Svh; ++ + pub fn build_link_meta<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, + name: &str) + -> LinkMeta { ++ let crate_hash = if tcx.sess.opts.cg.crate_hash != "" { ++ let mut state = SipHasher::new(); ++ state.write(tcx.sess.opts.cg.crate_hash.as_bytes()); ++ Svh::new(state.finish()) ++ } else { ++ tcx.calculate_krate_hash() ++ }; + let r = LinkMeta { + crate_name: name.to_owned(), +- crate_hash: tcx.calculate_krate_hash(), ++ crate_hash: crate_hash, + }; + info!("{:?}", r); + return r; +-- +2.10.0 + diff --git a/recipes-devtools/rust/files/rust-1.12.1/0008-mk-platform.mk-pass-C-crate_hash-to-builds.patch b/recipes-devtools/rust/files/rust-1.12.1/0008-mk-platform.mk-pass-C-crate_hash-to-builds.patch new file mode 100644 index 0000000..37acbe4 --- /dev/null +++ b/recipes-devtools/rust/files/rust-1.12.1/0008-mk-platform.mk-pass-C-crate_hash-to-builds.patch @@ -0,0 +1,27 @@ +From 174ae38bcc197658dd0ad6bcdae2bb06112e68a2 Mon Sep 17 00:00:00 2001 +From: Steven Walter +Date: Wed, 18 Nov 2015 08:41:17 -0500 +Subject: [PATCH 08/10] mk/platform.mk: pass -C crate_hash to builds + +bitbake recipe will export FORCE_CRATE_HASH + +Upstream-Status: not-appropriate +--- + mk/platform.mk | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/mk/platform.mk b/mk/platform.mk +index d601cab..0b5e9f2 100644 +--- a/mk/platform.mk ++++ b/mk/platform.mk +@@ -181,6 +181,7 @@ define CFG_MAKE_TOOLCHAIN + AR_$(1)=$(CROSS_PREFIX_$(1))$(AR_$(1)) + LINK_$(1)=$(CROSS_PREFIX_$(1))$(LINK_$(1)) + RUSTC_CROSS_FLAGS_$(1)=-C linker=$$(call FIND_COMPILER,$$(LINK_$(1))) \ ++ -C crate_hash=$(FORCE_CRATE_HASH) \ + -C ar=$$(call FIND_COMPILER,$$(AR_$(1))) $(RUSTC_CROSS_FLAGS_$(1)) + + RUSTC_FLAGS_$(1)=$$(RUSTC_CROSS_FLAGS_$(1)) $(RUSTC_FLAGS_$(1)) +-- +2.10.0 + diff --git a/recipes-devtools/rust/files/rust-installer-1.12.1/0001-add-option-to-disable-rewriting-of-install-paths.patch b/recipes-devtools/rust/files/rust-installer-1.12.1/0001-add-option-to-disable-rewriting-of-install-paths.patch new file mode 100644 index 0000000..9471252 --- /dev/null +++ b/recipes-devtools/rust/files/rust-installer-1.12.1/0001-add-option-to-disable-rewriting-of-install-paths.patch @@ -0,0 +1,58 @@ +From c7daec775a917d9e3017bc35ea7d88cc9418f181 Mon Sep 17 00:00:00 2001 +From: Cody P Schafer +Date: Mon, 2 Mar 2015 13:27:49 -0500 +Subject: [PATCH] add option to disable rewriting of install paths + +This is intended for use by rust & cargo's `make install`, as in that +case: + + - these paths are typically built into the pre-install layout already + - attempting to do the replacement will be incorrect subdirectory + cases (ie: libdir=lib/foo) +--- + install-template.sh | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +diff --git a/install-template.sh b/install-template.sh +index 042b955..4ecf430 100644 +--- a/install-template.sh ++++ b/install-template.sh +@@ -618,16 +618,18 @@ install_components() { + # Decide the destination of the file + local _file_install_path="$_dest_prefix/$_file" + +- if echo "$_file" | grep "^lib/" > /dev/null +- then +- local _f="$(echo "$_file" | sed 's/^lib\///')" +- _file_install_path="$CFG_LIBDIR/$_f" +- fi ++ if [ -n "${CFG_REWRITE_PATHS-}" ]; then ++ if echo "$_file" | grep "^lib/" > /dev/null ++ then ++ local _f="$(echo "$_file" | sed 's/^lib\///')" ++ _file_install_path="$CFG_LIBDIR/$_f" ++ fi + +- if echo "$_file" | grep "^share/man/" > /dev/null +- then +- local _f="$(echo "$_file" | sed 's/^share\/man\///')" +- _file_install_path="$CFG_MANDIR/$_f" ++ if echo "$_file" | grep "^share/man/" > /dev/null ++ then ++ local _f="$(echo "$_file" | sed 's/^share\/man\///')" ++ _file_install_path="$CFG_MANDIR/$_f" ++ fi + fi + + # Make sure there's a directory for it +@@ -810,6 +812,7 @@ valopt mandir "$CFG_DESTDIR_PREFIX/share/man" "install man pages in PATH" + opt ldconfig 1 "run ldconfig after installation (Linux only)" + opt verify 1 "obsolete" + flag verbose "run with verbose output" ++opt rewrite-paths 1 "rewrite install paths for libdir & mandir" + + if [ $HELP -eq 1 ] + then +-- +2.4.1 + diff --git a/recipes-devtools/rust/rust-source-1.12.1.inc b/recipes-devtools/rust/rust-source-1.12.1.inc new file mode 100644 index 0000000..b9b2a4c --- /dev/null +++ b/recipes-devtools/rust/rust-source-1.12.1.inc @@ -0,0 +1,18 @@ +# Specifics for Rust 1.12.1 + +## This is information on the rust-snapshot (binary) used to build our current release. +## snapshot info is taken from rust/src/stage0.txt +## TODO: find a way to add additional SRC_URIs based on the contents of an +## earlier SRC_URI. +RS_VERSION = "1.11.0" +RS_KEY = "5c6cf767" + +RUST_SNAPSHOT = "rustc-${RS_VERSION}-${RUST_BUILD_SYS}" + +# These are x86_64-unknown-linux-gnu hashes, how can we add more? +SRC_URI[rust-snapshot.md5sum] = "b83d7a1a90c2d80bef97a518022948c8" +SRC_URI[rust-snapshot.sha256sum] = "e9d27a72900da33c1bbd0e59dd42fd6414c6bcdfa33593fb7c7360068406394a" + +SRC_URI[rust.md5sum] = "82db5a9cb9a051bf8ece2f5174cb273b" +SRC_URI[rust.sha256sum] = "97913ae4cb255618aaacd1a534b11f343634b040b32656250d09d8d9ec02d3dc" + From 634498e0aceb2945de230dad78745922b7644f0f Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Fri, 4 Nov 2016 16:38:12 -0500 Subject: [PATCH 3/7] rust: bump versions to 1.12.1 Redid how compiler-rt is built by using the Rust makefiles to build it instead of compiler-rt's build system. Rust itself deviated from using compiler-rt's build system and provided their own rules requiring the source tree to be configured to use them. --- recipes-devtools/rust/compiler-rt_1.12.1.bb | 24 ++++++++++ recipes-devtools/rust/libstd-rs_1.12.1.bb | 37 +++++++++++++++ recipes-devtools/rust/rust-cross_1.12.1.bb | 50 ++++++++++++++++++++ recipes-devtools/rust/rust-llvm.inc | 4 -- recipes-devtools/rust/rust-llvm_1.12.1.bb | 16 +++++++ recipes-devtools/rust/rust-source-1.12.1.inc | 3 ++ recipes-devtools/rust/rust.inc | 1 - recipes-devtools/rust/rust_1.12.1.bb | 28 +++++++++++ 8 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 recipes-devtools/rust/compiler-rt_1.12.1.bb create mode 100644 recipes-devtools/rust/libstd-rs_1.12.1.bb create mode 100644 recipes-devtools/rust/rust-cross_1.12.1.bb create mode 100644 recipes-devtools/rust/rust-llvm_1.12.1.bb create mode 100644 recipes-devtools/rust/rust_1.12.1.bb diff --git a/recipes-devtools/rust/compiler-rt_1.12.1.bb b/recipes-devtools/rust/compiler-rt_1.12.1.bb new file mode 100644 index 0000000..878e59e --- /dev/null +++ b/recipes-devtools/rust/compiler-rt_1.12.1.bb @@ -0,0 +1,24 @@ +SUMMARY = "Rust compiler run-time" +HOMEPAGE = "http://www.rust-lang.org" +SECTION = "devel" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://src/compiler-rt/LICENSE.TXT;md5=bf24bca27049b52e9738451aa55771d4" + +require rust.inc +require rust-source-${PV}.inc + +DEPENDS += "rust-llvm-native (=${PV})" + +S = "${WORKDIR}/rustc-${PV}" + +DISABLE_STATIC = "" +INHIBIT_DEFAULT_RUST_DEPS = "1" + +do_compile () { + oe_runmake ${TARGET_SYS}/rt/libcompiler-rt.a +} + +do_install () { + mkdir -p ${D}${libdir} + cp ${TARGET_SYS}/rt/libcompiler-rt.a ${D}${libdir}/libcompiler-rt.a +} diff --git a/recipes-devtools/rust/libstd-rs_1.12.1.bb b/recipes-devtools/rust/libstd-rs_1.12.1.bb new file mode 100644 index 0000000..821f3cc --- /dev/null +++ b/recipes-devtools/rust/libstd-rs_1.12.1.bb @@ -0,0 +1,37 @@ +SUMMARY = "Rust standard libaries" +HOMEPAGE = "http://www.rust-lang.org" +SECTION = "devel" +LICENSE = "MIT | Apache-2.0" +LIC_FILES_CHKSUM ="file://COPYRIGHT;md5=43e1f1fb9c0ee3af66693d8c4fecafa8" + +require rust-source-${PV}.inc + +S = "${WORKDIR}/rustc-${PV}" + +CARGO_INDEX_COMMIT = "6127fc24b0b6fe73fe4d339817fbf000b9a798a2" + +SRC_URI += "\ + crate://crates.io/gcc/0.3.27 \ + crate-index://crates.io/${CARGO_INDEX_COMMIT} \ +" + +DEPENDS += "compiler-rt (=${PV})" + +RUSTLIB_DEP = "" +inherit cargo + +# Needed so cargo can find libbacktrace +RUSTFLAGS += "-L ${STAGING_LIBDIR}" + +S = "${WORKDIR}/rustc-${PV}" + +do_compile_prepend () { + cd ${S}/src/rustc/std_shim + export CARGO_TARGET_DIR="${B}" + export RUSTC_BOOTSTRAP_KEY="${RS_KEY}" +} + +do_install () { + mkdir -p ${D}${rustlibdir} + cp ${B}/${TARGET_SYS}/release/deps/* ${D}${rustlibdir} +} diff --git a/recipes-devtools/rust/rust-cross_1.12.1.bb b/recipes-devtools/rust/rust-cross_1.12.1.bb new file mode 100644 index 0000000..67b6f3c --- /dev/null +++ b/recipes-devtools/rust/rust-cross_1.12.1.bb @@ -0,0 +1,50 @@ +require rust.inc +inherit cross +require rust-source-${PV}.inc + +# Otherwise we'll depend on what we provide +INHIBIT_DEFAULT_RUST_DEPS = "1" + +# Unlike native (which nicely maps it's DEPENDS) cross wipes them out completely. +# Generally, we (and cross in general) need the same things that native needs, +# so it might make sense to take it's mapping. For now, though, we just mention +# the bits we need explicitly. +DEPENDS += "rust-llvm-native" +DEPENDS += "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}compilerlibs virtual/libc" +DEPENDS += "rust-native" + +PROVIDES = "virtual/${TARGET_PREFIX}rust" +PN = "rust-cross-${TARGET_ARCH}" + +# In the cross compilation case, rustc doesn't seem to get the rpath quite +# right. It manages to include '../../lib/${TARGET_PREFIX}', but doesn't +# include the '../../lib' (ie: relative path from cross_bindir to normal +# libdir. As a result, we end up not being able to properly reference files in normal ${libdir}. +# Most of the time this happens to work fine as the systems libraries are +# subsituted, but sometimes a host system will lack a library, or the right +# version of a library (libtinfo was how I noticed this). +# +# FIXME: this should really be fixed in rust itself. +# FIXME: using hard-coded relative paths is wrong, we should ask bitbake for +# the relative path between 2 of it's vars. +HOST_POST_LINK_ARGS_append = " -Wl,-rpath=../../lib" +BUILD_POST_LINK_ARGS_append = " -Wl,-rpath=../../lib" + +# We need the same thing for the calls to the compiler when building the runtime crap +TARGET_CC_ARCH_append = " --sysroot=${STAGING_DIR_TARGET}" + +do_configure () { +} + +do_compile () { +} + +do_install () { + mkdir -p ${D}${prefix}/${base_libdir_native}/rustlib + cp ${WORKDIR}/targets/${TARGET_SYS}.json ${D}${prefix}/${base_libdir_native}/rustlib +} + +rust_cross_sysroot_preprocess() { + sysroot_stage_dir ${D}${prefix}/${base_libdir_native}/rustlib ${SYSROOT_DESTDIR}${prefix}/${base_libdir_native}/rustlib +} +SYSROOT_PREPROCESS_FUNCS += "rust_cross_sysroot_preprocess" diff --git a/recipes-devtools/rust/rust-llvm.inc b/recipes-devtools/rust/rust-llvm.inc index fba8b22..2706ae3 100644 --- a/recipes-devtools/rust/rust-llvm.inc +++ b/recipes-devtools/rust/rust-llvm.inc @@ -1,10 +1,6 @@ SUMMARY = "LLVM compiler framework (packaged with rust)" LICENSE = "NCSA" -SRC_URI = "\ - https://static.rust-lang.org/dist/rustc-${PV}-src.tar.gz;name=rust \ -" - S = "${WORKDIR}/rustc-${PV}/src/llvm" LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=4c0bc17c954e99fd547528d938832bfa" diff --git a/recipes-devtools/rust/rust-llvm_1.12.1.bb b/recipes-devtools/rust/rust-llvm_1.12.1.bb new file mode 100644 index 0000000..12dd8e9 --- /dev/null +++ b/recipes-devtools/rust/rust-llvm_1.12.1.bb @@ -0,0 +1,16 @@ +require rust-llvm.inc +require rust-source-${PV}.inc + +LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=43fdaa303c1c5589ad60f4ffc6a0b9ce" + +do_install_prepend () { + # the install does a sed on this without installing the file + # we don't need it for anything + mkdir -p "${D}/usr/share/llvm/cmake" + touch "${D}/usr/share/llvm/cmake/LLVMExports-noconfig.cmake" +} + +do_install_append () { + # we don't need any of this stuff to build Rust + rm -rf "${D}/usr/lib/cmake" +} diff --git a/recipes-devtools/rust/rust-source-1.12.1.inc b/recipes-devtools/rust/rust-source-1.12.1.inc index b9b2a4c..add9509 100644 --- a/recipes-devtools/rust/rust-source-1.12.1.inc +++ b/recipes-devtools/rust/rust-source-1.12.1.inc @@ -13,6 +13,9 @@ RUST_SNAPSHOT = "rustc-${RS_VERSION}-${RUST_BUILD_SYS}" SRC_URI[rust-snapshot.md5sum] = "b83d7a1a90c2d80bef97a518022948c8" SRC_URI[rust-snapshot.sha256sum] = "e9d27a72900da33c1bbd0e59dd42fd6414c6bcdfa33593fb7c7360068406394a" +SRC_URI += "\ + https://static.rust-lang.org/dist/rustc-${PV}-src.tar.gz;name=rust \ + " SRC_URI[rust.md5sum] = "82db5a9cb9a051bf8ece2f5174cb273b" SRC_URI[rust.sha256sum] = "97913ae4cb255618aaacd1a534b11f343634b040b32656250d09d8d9ec02d3dc" diff --git a/recipes-devtools/rust/rust.inc b/recipes-devtools/rust/rust.inc index d104d4a..21f44b1 100644 --- a/recipes-devtools/rust/rust.inc +++ b/recipes-devtools/rust/rust.inc @@ -7,7 +7,6 @@ LIC_FILES_CHKSUM ="file://COPYRIGHT;md5=43e1f1fb9c0ee3af66693d8c4fecafa8" inherit rust SRC_URI = "\ - https://static.rust-lang.org/dist/rustc-${PV}-src.tar.gz;name=rust \ https://static.rust-lang.org/dist/${RUST_SNAPSHOT}.tar.gz;name=rust-snapshot \ " diff --git a/recipes-devtools/rust/rust_1.12.1.bb b/recipes-devtools/rust/rust_1.12.1.bb new file mode 100644 index 0000000..d6269b1 --- /dev/null +++ b/recipes-devtools/rust/rust_1.12.1.bb @@ -0,0 +1,28 @@ +inherit rust-installer +require rust.inc +require rust-source-${PV}.inc + +# the configure script always requires cmake so despite +# rust not needing this (only rust-llvm needs it) we must +# have it for the configure script to succeed. +DEPENDS += "cmake-native" + +SRC_URI += " \ + file://rust-${PV}/0001-Target-add-default-target.json-path-libdir-rust-targ.patch \ + file://rust-${PV}/0002-mk-for-stage0-use-RUSTFLAGS-to-override-target-libs-.patch \ + file://rust-${PV}/0003-mk-add-missing-CFG_LIBDIR_RELATIVE.patch \ + file://rust-${PV}/0005-std-thread_local-workaround-for-NULL-__dso_handle.patch \ + file://rust-${PV}/0006-mk-install-use-disable-rewrite-paths.patch \ + file://rust-${PV}/0007-Allow-overriding-crate_hash-with-C-crate_hash.patch \ + file://rust-${PV}/0008-mk-platform.mk-pass-C-crate_hash-to-builds.patch \ + file://rust-installer-${PV}/0001-add-option-to-disable-rewriting-of-install-paths.patch;patchdir=src/rust-installer \ + " + +DEPENDS += "rust-llvm (=${PV})" + +# Otherwise we'll depend on what we provide +INHIBIT_DEFAULT_RUST_DEPS_class-native = "1" +# We don't need to depend on gcc-native because yocto assumes it exists +PROVIDES_class-native = "virtual/${TARGET_PREFIX}rust" + +BBCLASSEXTEND = "native" From 1d0e0e834373ba8d8b92e82b5422861ad3269b5a Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Thu, 1 Dec 2016 21:38:52 -0600 Subject: [PATCH 4/7] rust: data layout changed between 1.10.0 and 1.12.1 The data layout for aarch64 changed between 1.10.0 and 1.12.1 of rust-llvm. --- recipes-devtools/rust/rust.inc | 3 ++- recipes-devtools/rust/rust_1.10.0.bb | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/recipes-devtools/rust/rust.inc b/recipes-devtools/rust/rust.inc index 21f44b1..549066c 100644 --- a/recipes-devtools/rust/rust.inc +++ b/recipes-devtools/rust/rust.inc @@ -119,7 +119,8 @@ TARGET_ENDIAN[arm] = "little" TARGET_POINTER_WIDTH[arm] = "32" FEATURES[arm] = "+v6,+vfp2" -DATA_LAYOUT[aarch64] = "e-m:e-i64:64-i128:128-n32:64-S128" +## aarch64-unknown-linux-gnu +DATA_LAYOUT[aarch64] = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" LLVM_TARGET[aarch64] = "aarch64-unknown-linux-gnu" TARGET_ENDIAN[aarch64] = "little" TARGET_POINTER_WIDTH[aarch64] = "64" diff --git a/recipes-devtools/rust/rust_1.10.0.bb b/recipes-devtools/rust/rust_1.10.0.bb index bfccfd1..6c5fbeb 100644 --- a/recipes-devtools/rust/rust_1.10.0.bb +++ b/recipes-devtools/rust/rust_1.10.0.bb @@ -2,6 +2,9 @@ inherit rust-installer require rust.inc require rust-source-${PV}.inc +# overriden due to difference between 1.10.0 and 1.12.1 +DATA_LAYOUT[aarch64] = "e-m:e-i64:64-i128:128-n32:64-S128" + SRC_URI += " \ file://rust-${PV}/0001-Add-config-for-musl-based-arm-builds.patch \ file://rust-${PV}/0002-Target-add-default-target.json-path-libdir-rust-targ.patch \ From 06cc11b2b406e26b94913de58fd91a737f6e3ff7 Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Wed, 30 Nov 2016 16:58:41 -0600 Subject: [PATCH 5/7] cargo: move explicitly versioned deps out of common These dependencies are explicitly for Cargo 0.11.0 and shouldn't appear in the common file. --- recipes-devtools/cargo/cargo.inc | 49 -------------------------- recipes-devtools/cargo/cargo_0.11.0.bb | 49 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/recipes-devtools/cargo/cargo.inc b/recipes-devtools/cargo/cargo.inc index 7b46472..7347766 100644 --- a/recipes-devtools/cargo/cargo.inc +++ b/recipes-devtools/cargo/cargo.inc @@ -13,55 +13,6 @@ CARGO_INDEX_COMMIT = "6127fc24b0b6fe73fe4d339817fbf000b9a798a2" SRC_URI = "\ http://static-rust-lang-org.s3.amazonaws.com/cargo-dist/${CARGO_SNAPSHOT} \ - crate://crates.io/advapi32-sys/0.1.2 \ - crate://crates.io/bufstream/0.1.1 \ - crate://crates.io/crossbeam/0.2.8 \ - crate://crates.io/docopt/0.6.78 \ - crate://crates.io/env_logger/0.3.2 \ - crate://crates.io/filetime/0.1.10 \ - crate://crates.io/flate2/0.2.13 \ - crate://crates.io/fs2/0.2.3 \ - crate://crates.io/glob/0.2.11 \ - crate://crates.io/hamcrest/0.1.0 \ - crate://crates.io/kernel32-sys/0.2.1 \ - crate://crates.io/libc/0.2.8 \ - crate://crates.io/log/0.3.5 \ - crate://crates.io/num_cpus/0.2.11 \ - crate://crates.io/regex/0.1.58 \ - crate://crates.io/rustc-serialize/0.3.18 \ - crate://crates.io/tar/0.4.5 \ - crate://crates.io/tempdir/0.3.4 \ - crate://crates.io/term/0.4.4 \ - crate://crates.io/toml/0.1.28 \ - crate://crates.io/url/1.1.0 \ - crate://crates.io/winapi/0.2.6 \ - crate://crates.io/semver/0.2.3 \ - crate://crates.io/regex-syntax/0.3.0 \ - crate://crates.io/utf8-ranges/0.1.3 \ - crate://crates.io/gcc/0.3.26 \ - crate://crates.io/unicode-normalization/0.1.2 \ - crate://crates.io/libz-sys/1.0.2 \ - crate://crates.io/rand/0.3.14 \ - crate://crates.io/user32-sys/0.1.2 \ - crate://crates.io/idna/0.1.0 \ - crate://crates.io/strsim/0.3.0 \ - crate://crates.io/matches/0.1.2 \ - crate://crates.io/cmake/0.1.16 \ - crate://crates.io/gdi32-sys/0.1.1 \ - crate://crates.io/bitflags/0.1.1 \ - crate://crates.io/unicode-bidi/0.2.3 \ - crate://crates.io/pkg-config/0.3.8 \ - crate://crates.io/winapi-build/0.1.1 \ - crate://crates.io/memchr/0.1.10 \ - crate://crates.io/pnacl-build-helper/1.4.10 \ - crate://crates.io/nom/1.2.2 \ - crate://crates.io/num/0.1.31 \ - crate://crates.io/uuid/0.2.3 \ - crate://crates.io/aho-corasick/0.5.1 \ - crate://crates.io/libressl-pnacl-sys/2.1.6 \ - crate://crates.io/miniz-sys/0.1.7 \ - crate://crates.io/openssl-sys/0.7.8 \ - crate://crates.io/url/0.5.10 \ crate-index://crates.io/${CARGO_INDEX_COMMIT} \ " diff --git a/recipes-devtools/cargo/cargo_0.11.0.bb b/recipes-devtools/cargo/cargo_0.11.0.bb index c70d049..08e0de3 100644 --- a/recipes-devtools/cargo/cargo_0.11.0.bb +++ b/recipes-devtools/cargo/cargo_0.11.0.bb @@ -6,6 +6,55 @@ SRC_URI += " \ file://0001-disable-cargo-snapshot-fetch.patch \ file://0001-Never-update-the-registry-index.patch \ git://github.com/rust-lang/rust-installer.git;protocol=https;name=rust-installer;destsuffix=${S}/src/rust-installer \ + crate://crates.io/advapi32-sys/0.1.2 \ + crate://crates.io/bufstream/0.1.1 \ + crate://crates.io/crossbeam/0.2.8 \ + crate://crates.io/docopt/0.6.78 \ + crate://crates.io/env_logger/0.3.2 \ + crate://crates.io/filetime/0.1.10 \ + crate://crates.io/flate2/0.2.13 \ + crate://crates.io/fs2/0.2.3 \ + crate://crates.io/glob/0.2.11 \ + crate://crates.io/hamcrest/0.1.0 \ + crate://crates.io/kernel32-sys/0.2.1 \ + crate://crates.io/libc/0.2.8 \ + crate://crates.io/log/0.3.5 \ + crate://crates.io/num_cpus/0.2.11 \ + crate://crates.io/regex/0.1.58 \ + crate://crates.io/rustc-serialize/0.3.18 \ + crate://crates.io/tar/0.4.5 \ + crate://crates.io/tempdir/0.3.4 \ + crate://crates.io/term/0.4.4 \ + crate://crates.io/toml/0.1.28 \ + crate://crates.io/url/1.1.0 \ + crate://crates.io/winapi/0.2.6 \ + crate://crates.io/semver/0.2.3 \ + crate://crates.io/regex-syntax/0.3.0 \ + crate://crates.io/utf8-ranges/0.1.3 \ + crate://crates.io/gcc/0.3.26 \ + crate://crates.io/unicode-normalization/0.1.2 \ + crate://crates.io/libz-sys/1.0.2 \ + crate://crates.io/rand/0.3.14 \ + crate://crates.io/user32-sys/0.1.2 \ + crate://crates.io/idna/0.1.0 \ + crate://crates.io/strsim/0.3.0 \ + crate://crates.io/matches/0.1.2 \ + crate://crates.io/cmake/0.1.16 \ + crate://crates.io/gdi32-sys/0.1.1 \ + crate://crates.io/bitflags/0.1.1 \ + crate://crates.io/unicode-bidi/0.2.3 \ + crate://crates.io/pkg-config/0.3.8 \ + crate://crates.io/winapi-build/0.1.1 \ + crate://crates.io/memchr/0.1.10 \ + crate://crates.io/pnacl-build-helper/1.4.10 \ + crate://crates.io/nom/1.2.2 \ + crate://crates.io/num/0.1.31 \ + crate://crates.io/uuid/0.2.3 \ + crate://crates.io/aho-corasick/0.5.1 \ + crate://crates.io/libressl-pnacl-sys/2.1.6 \ + crate://crates.io/miniz-sys/0.1.7 \ + crate://crates.io/openssl-sys/0.7.8 \ + crate://crates.io/url/0.5.10 \ " # Compatible with Rust 1.10.0 # https://static.rust-lang.org/dist/channel-rust-1.10.0.toml From 21224d76a02b952a0b4506728978b3f8c2bb2941 Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Wed, 30 Nov 2016 16:57:34 -0600 Subject: [PATCH 6/7] cargo: add version 0.13.0 This version was released alongside Rust 1.12.0 --- recipes-devtools/cargo/cargo_0.13.0.bb | 89 ++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 recipes-devtools/cargo/cargo_0.13.0.bb diff --git a/recipes-devtools/cargo/cargo_0.13.0.bb b/recipes-devtools/cargo/cargo_0.13.0.bb new file mode 100644 index 0000000..e7d0984 --- /dev/null +++ b/recipes-devtools/cargo/cargo_0.13.0.bb @@ -0,0 +1,89 @@ +require cargo-snapshot.inc +require cargo.inc + +SRC_URI += " \ + git://github.com/rust-lang/cargo.git;protocol=https;name=cargo \ + git://github.com/rust-lang/rust-installer.git;protocol=https;name=rust-installer;destsuffix=${S}/src/rust-installer \ + crate://crates.io/advapi32-sys/0.2.0 \ + crate://crates.io/aho-corasick/0.5.2 \ + crate://crates.io/bitflags/0.1.1 \ + crate://crates.io/bitflags/0.7.0 \ + crate://crates.io/bufstream/0.1.2 \ + crate://crates.io/cfg-if/0.1.0 \ + crate://crates.io/cmake/0.1.17 \ + crate://crates.io/crossbeam/0.2.9 \ + crate://crates.io/curl-sys/0.2.1 \ + crate://crates.io/curl/0.3.2 \ + crate://crates.io/docopt/0.6.82 \ + crate://crates.io/env_logger/0.3.4 \ + crate://crates.io/filetime/0.1.10 \ + crate://crates.io/flate2/0.2.14 \ + crate://crates.io/fs2/0.2.5 \ + crate://crates.io/gcc/0.3.32 \ + crate://crates.io/gdi32-sys/0.2.0 \ + crate://crates.io/git2-curl/0.5.0 \ + crate://crates.io/git2/0.4.4 \ + crate://crates.io/glob/0.2.11 \ + crate://crates.io/hamcrest/0.1.0 \ + crate://crates.io/idna/0.1.0 \ + crate://crates.io/kernel32-sys/0.2.2 \ + crate://crates.io/lazy_static/0.2.1 \ + crate://crates.io/libc/0.2.15 \ + crate://crates.io/libgit2-sys/0.4.5 \ + crate://crates.io/libressl-pnacl-sys/2.1.6 \ + crate://crates.io/libssh2-sys/0.1.38 \ + crate://crates.io/libz-sys/1.0.5 \ + crate://crates.io/log/0.3.6 \ + crate://crates.io/matches/0.1.2 \ + crate://crates.io/memchr/0.1.11 \ + crate://crates.io/miniz-sys/0.1.7 \ + crate://crates.io/miow/0.1.3 \ + crate://crates.io/net2/0.2.26 \ + crate://crates.io/nom/1.2.4 \ + crate://crates.io/num-bigint/0.1.33 \ + crate://crates.io/num-complex/0.1.33 \ + crate://crates.io/num-integer/0.1.32 \ + crate://crates.io/num-iter/0.1.32 \ + crate://crates.io/num-rational/0.1.32 \ + crate://crates.io/num-traits/0.1.34 \ + crate://crates.io/num/0.1.34 \ + crate://crates.io/num_cpus/1.0.0 \ + crate://crates.io/openssl-sys-extras/0.7.14 \ + crate://crates.io/openssl-sys/0.7.14 \ + crate://crates.io/openssl/0.7.14 \ + crate://crates.io/pkg-config/0.3.8 \ + crate://crates.io/pnacl-build-helper/1.4.10 \ + crate://crates.io/rand/0.3.14 \ + crate://crates.io/regex-syntax/0.3.4 \ + crate://crates.io/regex/0.1.73 \ + crate://crates.io/rustc-serialize/0.3.19 \ + crate://crates.io/semver/0.2.3 \ + crate://crates.io/strsim/0.3.0 \ + crate://crates.io/tar/0.4.8 \ + crate://crates.io/tempdir/0.3.5 \ + crate://crates.io/term/0.4.4 \ + crate://crates.io/thread-id/2.0.0 \ + crate://crates.io/thread_local/0.2.6 \ + crate://crates.io/toml/0.2.0 \ + crate://crates.io/unicode-bidi/0.2.3 \ + crate://crates.io/unicode-normalization/0.1.2 \ + crate://crates.io/url/1.2.0 \ + crate://crates.io/user32-sys/0.2.0 \ + crate://crates.io/utf8-ranges/0.1.3 \ + crate://crates.io/winapi-build/0.1.1 \ + crate://crates.io/winapi/0.2.8 \ + crate://crates.io/ws2_32-sys/0.2.1 \ +" +# Compatible with Rust 1.12.1 +# https://static.rust-lang.org/dist/channel-rust-1.12.1.toml +SRCREV_cargo = "109cb7c33d426044d141457049bd0fffaca1327c" + +SRCREV_rust-installer = "c37d3747da75c280237dc2d6b925078e69555499" + +S = "${WORKDIR}/git" + +LIC_FILES_CHKSUM ="\ + file://LICENSE-MIT;md5=362255802eb5aa87810d12ddf3cfedb4 \ + file://LICENSE-APACHE;md5=1836efb2eb779966696f473ee8540542 \ + file://LICENSE-THIRD-PARTY;md5=892ea68b169e69cfe75097fc38a15b56 \ +" From 846454281e64edd40b259cbfba5ce60c834b2da9 Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Thu, 1 Dec 2016 10:13:31 -0600 Subject: [PATCH 7/7] classes/cargo: implement directory source redirection Reworked the source redirection to use directory source redirection like I've done for Gentoo. This allows us to specify all crate dependencies in the bitbake SRC_URI and have Yocto fetch them down using our crate fetcher and then Cargo will build without reaching out to the network. --- classes/cargo.bbclass | 15 ++++---- lib/crate.py | 79 ++++++++++++++++++++++++++++++++----------- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/classes/cargo.bbclass b/classes/cargo.bbclass index 44ff604..2be039e 100644 --- a/classes/cargo.bbclass +++ b/classes/cargo.bbclass @@ -38,13 +38,14 @@ cargo_do_configure () { echo "]" >> ${CARGO_HOME}/config # Point cargo at our local mirror of the registry - cat >> ${CARGO_HOME}/config <> ${CARGO_HOME}/config + [source.bitbake] + directory = "${CARGO_HOME}/bitbake" + + [source.crates-io] + replace-with = "bitbake" + local-registry = "/nonexistant" + EOF echo "[target.${HOST_SYS}]" >> ${CARGO_HOME}/config echo "linker = '${RUST_TARGET_CCLD}'" >> ${CARGO_HOME}/config diff --git a/lib/crate.py b/lib/crate.py index 3197037..178e7f4 100644 --- a/lib/crate.py +++ b/lib/crate.py @@ -21,6 +21,8 @@ BitBake 'Fetch' implementation for crates.io # # Based on functions from the base bb module, Copyright 2003 Holger Schurig +import hashlib +import json import os import shutil import subprocess @@ -48,8 +50,8 @@ class Crate(Wget): def _cargo_cache_path(self, rootdir): return self._cargo_path(rootdir, "cache") - def _cargo_registry_path(self, rootdir, component=""): - return os.path.join(rootdir, "cargo_registry", component) + def _cargo_bitbake_path(self, rootdir): + return os.path.join(rootdir, "cargo_home", "bitbake") def supports(self, ud, d): """ @@ -136,18 +138,13 @@ class Crate(Wget): super(Crate, self).unpack(ud, rootdir, d) def _index_unpack(self, ud, rootdir, d): - cargo_index = self._cargo_index_path(rootdir) - self._index_unpack_to(ud, rootdir, d, cargo_index) - - cargo_registry_index = self._cargo_registry_path(rootdir, "index") - self._index_unpack_to(ud, rootdir, d, cargo_registry_index) - - def _index_unpack_to(self, ud, rootdir, d, cargo_index): """ Unpacks the index """ thefile = ud.localpath + cargo_index = self._cargo_index_path(rootdir) + cmd = "tar -xz --no-same-owner --strip-components 1 -f %s -C %s" % (thefile, cargo_index) # change to the rootdir to unpack but save the old working dir @@ -176,6 +173,9 @@ class Crate(Wget): """ thefile = ud.localpath + # possible metadata we need to write out + metadata = {} + # change to the rootdir to unpack but save the old working dir save_cwd = os.getcwd() os.chdir(rootdir) @@ -184,22 +184,22 @@ class Crate(Wget): if pn == ud.parm.get('name'): cmd = "tar -xz --no-same-owner -f %s" % thefile else: - cargo_src = self._cargo_src_path(rootdir) - cargo_cache = self._cargo_cache_path(rootdir) - cargo_registry = self._cargo_registry_path(rootdir) + self._crate_unpack_old_layout(ud, rootdir, d) - cmd = "tar -xz --no-same-owner -f %s -C %s" % (thefile, cargo_src) + cargo_bitbake = self._cargo_bitbake_path(rootdir) + + cmd = "tar -xz --no-same-owner -f %s -C %s" % (thefile, cargo_bitbake) # ensure we've got these paths made - bb.utils.mkdirhier(cargo_cache) - bb.utils.mkdirhier(cargo_registry) - bb.utils.mkdirhier(cargo_src) + bb.utils.mkdirhier(cargo_bitbake) - bb.note("Copying %s to %s/" % (thefile, cargo_cache)) - shutil.copy(thefile, cargo_cache) + # generate metadata necessary + with open(thefile, 'rb') as f: + # get the SHA256 of the original tarball + tarhash = hashlib.sha256(f.read()).hexdigest() - bb.note("Copying %s to %s/" % (thefile, cargo_registry)) - shutil.copy(thefile, cargo_registry) + metadata['files'] = {} + metadata['package'] = tarhash # path it path = d.getVar('PATH', True) @@ -214,3 +214,42 @@ class Crate(Wget): if ret != 0: raise UnpackError("Unpack command %s failed with return value %s" % (cmd, ret), ud.url) + # if we have metadata to write out.. + if len(metadata) > 0: + cratepath = os.path.splitext(os.path.basename(thefile))[0] + bbpath = self._cargo_bitbake_path(rootdir) + mdfile = '.cargo-checksum.json' + mdpath = os.path.join(bbpath, cratepath, mdfile) + with open(mdpath, "w") as f: + json.dump(metadata, f) + + + def _crate_unpack_old_layout(self, ud, rootdir, d): + """ + Unpacks a crate in the old location that tried to emulate + the Cargo registry layout. + """ + thefile = ud.localpath + + cargo_src = self._cargo_src_path(rootdir) + cargo_cache = self._cargo_cache_path(rootdir) + + cmd = "tar -xz --no-same-owner -f %s -C %s" % (thefile, cargo_src) + + # ensure we've got these paths made + bb.utils.mkdirhier(cargo_cache) + bb.utils.mkdirhier(cargo_src) + + bb.note("Copying %s to %s/" % (thefile, cargo_cache)) + shutil.copy(thefile, cargo_cache) + + # path it + path = d.getVar('PATH', True) + if path: + cmd = "PATH=\"%s\" %s" % (path, cmd) + bb.note("Unpacking %s to %s/" % (thefile, os.getcwd())) + + ret = subprocess.call(cmd, preexec_fn=subprocess_setup, shell=True) + + if ret != 0: + raise UnpackError("Unpack command %s failed with return value %s" % (cmd, ret), ud.url)