,
-@@ -1280,9 +1278,9 @@ pub fn expr_to_string(
- /// compilation should call
- /// `cx.parse_sess.span_diagnostic.abort_if_errors()` (this should be
- /// done as rarely as possible).
--pub fn check_zero_tts(cx: &ExtCtxt<'_>, sp: Span, tts: TokenStream, name: &str) {
-+pub fn check_zero_tts(cx: &ExtCtxt<'_>, span: Span, tts: TokenStream, name: &str) {
- if !tts.is_empty() {
-- cx.span_err(sp, &format!("{} takes no arguments", name));
-+ cx.emit_err(TakesNoArguments { span, name });
- }
- }
-
-@@ -1304,31 +1302,27 @@ pub fn parse_expr(p: &mut parser::Parser<'_>) -> Option> {
- /// expect exactly one string literal, or emit an error and return `None`.
- pub fn get_single_str_from_tts(
- cx: &mut ExtCtxt<'_>,
-- sp: Span,
-+ span: Span,
- tts: TokenStream,
- name: &str,
- ) -> Option {
- let mut p = cx.new_parser_from_tts(tts);
- if p.token == token::Eof {
-- cx.span_err(sp, &format!("{} takes 1 argument", name));
-+ cx.emit_err(OnlyOneArgument { span, name });
- return None;
- }
- let ret = parse_expr(&mut p)?;
- let _ = p.eat(&token::Comma);
-
- if p.token != token::Eof {
-- cx.span_err(sp, &format!("{} takes 1 argument", name));
-+ cx.emit_err(OnlyOneArgument { span, name });
- }
- expr_to_string(cx, ret, "argument must be a string literal").map(|(s, _)| s)
- }
-
- /// Extracts comma-separated expressions from `tts`.
- /// On error, emit it, and return `None`.
--pub fn get_exprs_from_tts(
-- cx: &mut ExtCtxt<'_>,
-- sp: Span,
-- tts: TokenStream,
--) -> Option>> {
-+pub fn get_exprs_from_tts(cx: &mut ExtCtxt<'_>, tts: TokenStream) -> Option>> {
- let mut p = cx.new_parser_from_tts(tts);
- let mut es = Vec::new();
- while p.token != token::Eof {
-@@ -1343,7 +1337,7 @@ pub fn get_exprs_from_tts(
- continue;
- }
- if p.token != token::Eof {
-- cx.span_err(sp, "expected token: `,`");
-+ cx.emit_err(ExpectedCommaInList { span: p.token.span });
- return None;
- }
- }
-@@ -1353,64 +1347,58 @@ pub fn get_exprs_from_tts(
- pub fn parse_macro_name_and_helper_attrs(
- diag: &rustc_errors::Handler,
- attr: &Attribute,
-- descr: &str,
-+ macro_type: &str,
- ) -> Option<(Symbol, Vec)> {
- // Once we've located the `#[proc_macro_derive]` attribute, verify
- // that it's of the form `#[proc_macro_derive(Foo)]` or
- // `#[proc_macro_derive(Foo, attributes(A, ..))]`
- let list = attr.meta_item_list()?;
- if list.len() != 1 && list.len() != 2 {
-- diag.span_err(attr.span, "attribute must have either one or two arguments");
-+ diag.emit_err(AttrNoArguments { span: attr.span });
- return None;
- }
- let Some(trait_attr) = list[0].meta_item() else {
-- diag.span_err(list[0].span(), "not a meta item");
-+ diag.emit_err(NotAMetaItem {span: list[0].span()});
- return None;
- };
- let trait_ident = match trait_attr.ident() {
- Some(trait_ident) if trait_attr.is_word() => trait_ident,
- _ => {
-- diag.span_err(trait_attr.span, "must only be one word");
-+ diag.emit_err(OnlyOneWord { span: trait_attr.span });
- return None;
- }
- };
-
- if !trait_ident.name.can_be_raw() {
-- diag.span_err(
-- trait_attr.span,
-- &format!("`{}` cannot be a name of {} macro", trait_ident, descr),
-- );
-+ diag.emit_err(CannotBeNameOfMacro { span: trait_attr.span, trait_ident, macro_type });
- }
-
- let attributes_attr = list.get(1);
- let proc_attrs: Vec<_> = if let Some(attr) = attributes_attr {
- if !attr.has_name(sym::attributes) {
-- diag.span_err(attr.span(), "second argument must be `attributes`");
-+ diag.emit_err(ArgumentNotAttributes { span: attr.span() });
- }
- attr.meta_item_list()
- .unwrap_or_else(|| {
-- diag.span_err(attr.span(), "attribute must be of form: `attributes(foo, bar)`");
-+ diag.emit_err(AttributesWrongForm { span: attr.span() });
- &[]
- })
- .iter()
- .filter_map(|attr| {
- let Some(attr) = attr.meta_item() else {
-- diag.span_err(attr.span(), "not a meta item");
-+ diag.emit_err(AttributeMetaItem { span: attr.span() });
- return None;
- };
-
- let ident = match attr.ident() {
- Some(ident) if attr.is_word() => ident,
- _ => {
-- diag.span_err(attr.span, "must only be one word");
-+ diag.emit_err(AttributeSingleWord { span: attr.span });
- return None;
- }
- };
- if !ident.name.can_be_raw() {
-- diag.span_err(
-- attr.span,
-- &format!("`{}` cannot be a name of derive helper attribute", ident),
-- );
-+ diag.emit_err(HelperAttributeNameInvalid { span: attr.span, name: ident });
- }
-
- Some(ident.name)
-diff --git a/compiler/rustc_expand/src/config.rs b/compiler/rustc_expand/src/config.rs
-index 2510795c2e3ed..f4c6f3386ade2 100644
---- a/compiler/rustc_expand/src/config.rs
-+++ b/compiler/rustc_expand/src/config.rs
-@@ -1,5 +1,9 @@
- //! Conditional compilation stripping.
-
-+use crate::errors::{
-+ FeatureIncludedInEdition, FeatureNotAllowed, FeatureRemoved, FeatureRemovedReason, InvalidCfg,
-+ MalformedFeatureAttribute, MalformedFeatureAttributeHelp, RemoveExprNotSupported,
-+};
- use rustc_ast::ptr::P;
- use rustc_ast::token::{Delimiter, Token, TokenKind};
- use rustc_ast::tokenstream::{AttrTokenStream, AttrTokenTree};
-@@ -10,7 +14,6 @@ use rustc_ast::{self as ast, AttrStyle, Attribute, HasAttrs, HasTokens, MetaItem
- use rustc_attr as attr;
- use rustc_data_structures::fx::FxHashMap;
- use rustc_data_structures::map_in_place::MapInPlace;
--use rustc_errors::{error_code, struct_span_err, Applicability, Handler};
- use rustc_feature::{Feature, Features, State as FeatureState};
- use rustc_feature::{
- ACCEPTED_FEATURES, ACTIVE_FEATURES, REMOVED_FEATURES, STABLE_REMOVED_FEATURES,
-@@ -33,18 +36,12 @@ pub struct StripUnconfigured<'a> {
- pub lint_node_id: NodeId,
- }
-
--fn get_features(
-- sess: &Session,
-- span_handler: &Handler,
-- krate_attrs: &[ast::Attribute],
--) -> Features {
-- fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) {
-- let mut err = struct_span_err!(span_handler, span, E0557, "feature has been removed");
-- err.span_label(span, "feature has been removed");
-- if let Some(reason) = reason {
-- err.note(reason);
-- }
-- err.emit();
-+fn get_features(sess: &Session, krate_attrs: &[ast::Attribute]) -> Features {
-+ fn feature_removed(sess: &Session, span: Span, reason: Option<&str>) {
-+ sess.emit_err(FeatureRemoved {
-+ span,
-+ reason: reason.map(|reason| FeatureRemovedReason { reason }),
-+ });
- }
-
- fn active_features_up_to(edition: Edition) -> impl Iterator- {
-@@ -117,34 +114,34 @@ fn get_features(
- continue;
- };
-
-- let bad_input = |span| {
-- struct_span_err!(span_handler, span, E0556, "malformed `feature` attribute input")
-- };
--
- for mi in list {
- let name = match mi.ident() {
- Some(ident) if mi.is_word() => ident.name,
- Some(ident) => {
-- bad_input(mi.span())
-- .span_suggestion(
-- mi.span(),
-- "expected just one word",
-- ident.name,
-- Applicability::MaybeIncorrect,
-- )
-- .emit();
-+ sess.emit_err(MalformedFeatureAttribute {
-+ span: mi.span(),
-+ help: MalformedFeatureAttributeHelp::Suggestion {
-+ span: mi.span(),
-+ suggestion: ident.name,
-+ },
-+ });
- continue;
- }
- None => {
-- bad_input(mi.span()).span_label(mi.span(), "expected just one word").emit();
-+ sess.emit_err(MalformedFeatureAttribute {
-+ span: mi.span(),
-+ help: MalformedFeatureAttributeHelp::Label { span: mi.span() },
-+ });
- continue;
- }
- };
-
-- if let Some(edition) = edition_enabled_features.get(&name) {
-- let msg =
-- &format!("the feature `{}` is included in the Rust {} edition", name, edition);
-- span_handler.struct_span_warn_with_code(mi.span(), msg, error_code!(E0705)).emit();
-+ if let Some(&edition) = edition_enabled_features.get(&name) {
-+ sess.emit_warning(FeatureIncludedInEdition {
-+ span: mi.span(),
-+ feature: name,
-+ edition,
-+ });
- continue;
- }
-
-@@ -159,7 +156,7 @@ fn get_features(
- if let FeatureState::Removed { reason } | FeatureState::Stabilized { reason } =
- state
- {
-- feature_removed(span_handler, mi.span(), *reason);
-+ feature_removed(sess, mi.span(), *reason);
- continue;
- }
- }
-@@ -173,14 +170,7 @@ fn get_features(
-
- if let Some(allowed) = sess.opts.unstable_opts.allow_features.as_ref() {
- if allowed.iter().all(|f| name.as_str() != f) {
-- struct_span_err!(
-- span_handler,
-- mi.span(),
-- E0725,
-- "the feature `{}` is not in the list of allowed features",
-- name
-- )
-- .emit();
-+ sess.emit_err(FeatureNotAllowed { span: mi.span(), name });
- continue;
- }
- }
-@@ -221,7 +211,7 @@ pub fn features(
- }
- Some(attrs) => {
- krate.attrs = attrs;
-- let features = get_features(sess, diag, &krate.attrs);
-+ let features = get_features(sess, &krate.attrs);
- if err_count == diag.err_count() {
- // Avoid reconfiguring malformed `cfg_attr`s.
- strip_unconfigured.features = Some(&features);
-@@ -503,8 +493,7 @@ impl<'a> StripUnconfigured<'a> {
- // N.B., this is intentionally not part of the visit_expr() function
- // in order for filter_map_expr() to be able to avoid this check
- if let Some(attr) = expr.attrs().iter().find(|a| is_cfg(*a)) {
-- let msg = "removing an expression is not supported in this position";
-- self.sess.parse_sess.span_diagnostic.span_err(attr.span, msg);
-+ self.sess.emit_err(RemoveExprNotSupported { span: attr.span });
- }
-
- self.process_cfg_attrs(expr);
-@@ -513,27 +502,26 @@ impl<'a> StripUnconfigured<'a> {
- }
-
- pub fn parse_cfg<'a>(meta_item: &'a MetaItem, sess: &Session) -> Option<&'a MetaItem> {
-- let error = |span, msg, suggestion: &str| {
-- let mut err = sess.parse_sess.span_diagnostic.struct_span_err(span, msg);
-- if !suggestion.is_empty() {
-- err.span_suggestion(
-- span,
-- "expected syntax is",
-- suggestion,
-- Applicability::HasPlaceholders,
-- );
-- }
-- err.emit();
-- None
-- };
- let span = meta_item.span;
- match meta_item.meta_item_list() {
-- None => error(span, "`cfg` is not followed by parentheses", "cfg(/* predicate */)"),
-- Some([]) => error(span, "`cfg` predicate is not specified", ""),
-- Some([_, .., l]) => error(l.span(), "multiple `cfg` predicates are specified", ""),
-+ None => {
-+ sess.emit_err(InvalidCfg::NotFollowedByParens { span });
-+ None
-+ }
-+ Some([]) => {
-+ sess.emit_err(InvalidCfg::NoPredicate { span });
-+ None
-+ }
-+ Some([_, .., l]) => {
-+ sess.emit_err(InvalidCfg::MultiplePredicates { span: l.span() });
-+ None
-+ }
- Some([single]) => match single.meta_item() {
- Some(meta_item) => Some(meta_item),
-- None => error(single.span(), "`cfg` predicate key cannot be a literal", ""),
-+ None => {
-+ sess.emit_err(InvalidCfg::PredicateLiteral { span: single.span() });
-+ None
-+ }
- },
- }
- }
-diff --git a/compiler/rustc_expand/src/errors.rs b/compiler/rustc_expand/src/errors.rs
-index d383f4832f699..afe5169d3f5c0 100644
---- a/compiler/rustc_expand/src/errors.rs
-+++ b/compiler/rustc_expand/src/errors.rs
-@@ -1,6 +1,10 @@
-+use rustc_ast::ast;
- use rustc_macros::Diagnostic;
--use rustc_span::symbol::MacroRulesNormalizedIdent;
--use rustc_span::Span;
-+use rustc_session::Limit;
-+use rustc_span::edition::Edition;
-+use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent};
-+use rustc_span::{Span, Symbol};
-+use std::borrow::Cow;
-
- #[derive(Diagnostic)]
- #[diag(expand_expr_repeat_no_syntax_vars)]
-@@ -46,3 +50,321 @@ pub(crate) struct MetaVarsDifSeqMatchers {
- pub span: Span,
- pub msg: String,
- }
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_resolve_relative_path)]
-+pub(crate) struct ResolveRelativePath {
-+ #[primary_span]
-+ pub span: Span,
-+ pub path: String,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_macro_const_stability)]
-+pub(crate) struct MacroConstStability {
-+ #[primary_span]
-+ #[label]
-+ pub span: Span,
-+ #[label(label2)]
-+ pub head_span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_macro_body_stability)]
-+pub(crate) struct MacroBodyStability {
-+ #[primary_span]
-+ #[label]
-+ pub span: Span,
-+ #[label(label2)]
-+ pub head_span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_attr_no_arguments)]
-+pub(crate) struct AttrNoArguments {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_not_a_meta_item)]
-+pub(crate) struct NotAMetaItem {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_only_one_word)]
-+pub(crate) struct OnlyOneWord {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_cannot_be_name_of_macro)]
-+pub(crate) struct CannotBeNameOfMacro<'a> {
-+ #[primary_span]
-+ pub span: Span,
-+ pub trait_ident: Ident,
-+ pub macro_type: &'a str,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_arg_not_attributes)]
-+pub(crate) struct ArgumentNotAttributes {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_attributes_wrong_form)]
-+pub(crate) struct AttributesWrongForm {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_attribute_meta_item)]
-+pub(crate) struct AttributeMetaItem {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_attribute_single_word)]
-+pub(crate) struct AttributeSingleWord {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_helper_attribute_name_invalid)]
-+pub(crate) struct HelperAttributeNameInvalid {
-+ #[primary_span]
-+ pub span: Span,
-+ pub name: Ident,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_expected_comma_in_list)]
-+pub(crate) struct ExpectedCommaInList {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_only_one_argument)]
-+pub(crate) struct OnlyOneArgument<'a> {
-+ #[primary_span]
-+ pub span: Span,
-+ pub name: &'a str,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_takes_no_arguments)]
-+pub(crate) struct TakesNoArguments<'a> {
-+ #[primary_span]
-+ pub span: Span,
-+ pub name: &'a str,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_feature_included_in_edition, code = "E0705")]
-+pub(crate) struct FeatureIncludedInEdition {
-+ #[primary_span]
-+ pub span: Span,
-+ pub feature: Symbol,
-+ pub edition: Edition,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_feature_removed, code = "E0557")]
-+pub(crate) struct FeatureRemoved<'a> {
-+ #[primary_span]
-+ #[label]
-+ pub span: Span,
-+ #[subdiagnostic]
-+ pub reason: Option>,
-+}
-+
-+#[derive(Subdiagnostic)]
-+#[note(reason)]
-+pub(crate) struct FeatureRemovedReason<'a> {
-+ pub reason: &'a str,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_feature_not_allowed, code = "E0725")]
-+pub(crate) struct FeatureNotAllowed {
-+ #[primary_span]
-+ pub span: Span,
-+ pub name: Symbol,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_recursion_limit_reached)]
-+#[help]
-+pub(crate) struct RecursionLimitReached<'a> {
-+ #[primary_span]
-+ pub span: Span,
-+ pub descr: String,
-+ pub suggested_limit: Limit,
-+ pub crate_name: &'a str,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_malformed_feature_attribute, code = "E0556")]
-+pub(crate) struct MalformedFeatureAttribute {
-+ #[primary_span]
-+ pub span: Span,
-+ #[subdiagnostic]
-+ pub help: MalformedFeatureAttributeHelp,
-+}
-+
-+#[derive(Subdiagnostic)]
-+pub(crate) enum MalformedFeatureAttributeHelp {
-+ #[label(expected)]
-+ Label {
-+ #[primary_span]
-+ span: Span,
-+ },
-+ #[suggestion(expected, code = "{suggestion}", applicability = "maybe-incorrect")]
-+ Suggestion {
-+ #[primary_span]
-+ span: Span,
-+ suggestion: Symbol,
-+ },
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_remove_expr_not_supported)]
-+pub(crate) struct RemoveExprNotSupported {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+pub(crate) enum InvalidCfg {
-+ #[diag(expand_invalid_cfg_no_parens)]
-+ NotFollowedByParens {
-+ #[primary_span]
-+ #[suggestion(
-+ expand_invalid_cfg_expected_syntax,
-+ code = "cfg(/* predicate */)",
-+ applicability = "has-placeholders"
-+ )]
-+ span: Span,
-+ },
-+ #[diag(expand_invalid_cfg_no_predicate)]
-+ NoPredicate {
-+ #[primary_span]
-+ #[suggestion(
-+ expand_invalid_cfg_expected_syntax,
-+ code = "cfg(/* predicate */)",
-+ applicability = "has-placeholders"
-+ )]
-+ span: Span,
-+ },
-+ #[diag(expand_invalid_cfg_multiple_predicates)]
-+ MultiplePredicates {
-+ #[primary_span]
-+ span: Span,
-+ },
-+ #[diag(expand_invalid_cfg_predicate_literal)]
-+ PredicateLiteral {
-+ #[primary_span]
-+ span: Span,
-+ },
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_wrong_fragment_kind)]
-+pub(crate) struct WrongFragmentKind<'a> {
-+ #[primary_span]
-+ pub span: Span,
-+ pub kind: &'a str,
-+ pub name: &'a ast::Path,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_unsupported_key_value)]
-+pub(crate) struct UnsupportedKeyValue {
-+ #[primary_span]
-+ pub span: Span,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_incomplete_parse)]
-+#[note]
-+pub(crate) struct IncompleteParse<'a> {
-+ #[primary_span]
-+ pub span: Span,
-+ pub token: Cow<'a, str>,
-+ #[label]
-+ pub label_span: Span,
-+ pub macro_path: &'a ast::Path,
-+ pub kind_name: &'a str,
-+
-+ #[suggestion(
-+ suggestion_add_semi,
-+ style = "verbose",
-+ code = ";",
-+ applicability = "maybe-incorrect"
-+ )]
-+ pub add_semicolon: Option,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_remove_node_not_supported)]
-+pub(crate) struct RemoveNodeNotSupported {
-+ #[primary_span]
-+ pub span: Span,
-+ pub descr: &'static str,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_module_circular)]
-+pub(crate) struct ModuleCircular {
-+ #[primary_span]
-+ pub span: Span,
-+ pub modules: String,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_module_in_block)]
-+pub(crate) struct ModuleInBlock {
-+ #[primary_span]
-+ pub span: Span,
-+ #[subdiagnostic]
-+ pub name: Option,
-+}
-+
-+#[derive(Subdiagnostic)]
-+#[note(note)]
-+pub(crate) struct ModuleInBlockName {
-+ #[primary_span]
-+ pub span: Span,
-+ pub name: Ident,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_module_file_not_found, code = "E0583")]
-+#[help]
-+pub(crate) struct ModuleFileNotFound {
-+ #[primary_span]
-+ pub span: Span,
-+ pub name: Ident,
-+ pub default_path: String,
-+ pub secondary_path: String,
-+}
-+
-+#[derive(Diagnostic)]
-+#[diag(expand_module_multiple_candidates, code = "E0761")]
-+#[help]
-+pub(crate) struct ModuleMultipleCandidates {
-+ #[primary_span]
-+ pub span: Span,
-+ pub name: Ident,
-+ pub default_path: String,
-+ pub secondary_path: String,
-+}
-diff --git a/compiler/rustc_expand/src/expand.rs b/compiler/rustc_expand/src/expand.rs
-index 1014ec2209c61..e26c16dcd7ee7 100644
---- a/compiler/rustc_expand/src/expand.rs
-+++ b/compiler/rustc_expand/src/expand.rs
-@@ -1,5 +1,9 @@
- use crate::base::*;
- use crate::config::StripUnconfigured;
-+use crate::errors::{
-+ IncompleteParse, RecursionLimitReached, RemoveExprNotSupported, RemoveNodeNotSupported,
-+ UnsupportedKeyValue, WrongFragmentKind,
-+};
- use crate::hygiene::SyntaxContext;
- use crate::mbe::diagnostics::annotate_err_with_kind;
- use crate::module::{mod_dir_path, parse_external_mod, DirOwnership, ParsedExternalMod};
-@@ -18,7 +22,7 @@ use rustc_ast::{NestedMetaItem, NodeId, PatKind, StmtKind, TyKind};
- use rustc_ast_pretty::pprust;
- use rustc_data_structures::map_in_place::MapInPlace;
- use rustc_data_structures::sync::Lrc;
--use rustc_errors::{Applicability, PResult};
-+use rustc_errors::PResult;
- use rustc_feature::Features;
- use rustc_parse::parser::{
- AttemptLocalParseRecovery, CommaRecoveryMode, ForceCollect, Parser, RecoverColon, RecoverComma,
-@@ -606,29 +610,22 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
- Limit(0) => Limit(2),
- limit => limit * 2,
- };
-- self.cx
-- .struct_span_err(
-- expn_data.call_site,
-- &format!("recursion limit reached while expanding `{}`", expn_data.kind.descr()),
-- )
-- .help(&format!(
-- "consider increasing the recursion limit by adding a \
-- `#![recursion_limit = \"{}\"]` attribute to your crate (`{}`)",
-- suggested_limit, self.cx.ecfg.crate_name,
-- ))
-- .emit();
-+
-+ self.cx.emit_err(RecursionLimitReached {
-+ span: expn_data.call_site,
-+ descr: expn_data.kind.descr(),
-+ suggested_limit,
-+ crate_name: &self.cx.ecfg.crate_name,
-+ });
-+
- self.cx.trace_macros_diag();
- }
-
- /// A macro's expansion does not fit in this fragment kind.
- /// For example, a non-type macro in a type position.
- fn error_wrong_fragment_kind(&mut self, kind: AstFragmentKind, mac: &ast::MacCall, span: Span) {
-- let msg = format!(
-- "non-{kind} macro in {kind} position: {path}",
-- kind = kind.name(),
-- path = pprust::path_to_string(&mac.path),
-- );
-- self.cx.span_err(span, &msg);
-+ self.cx.emit_err(WrongFragmentKind { span, kind: kind.name(), name: &mac.path });
-+
- self.cx.trace_macros_diag();
- }
-
-@@ -707,7 +704,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
- };
- let attr_item = attr.unwrap_normal_item();
- if let AttrArgs::Eq(..) = attr_item.args {
-- self.cx.span_err(span, "key-value macro attributes are not supported");
-+ self.cx.emit_err(UnsupportedKeyValue { span });
- }
- let inner_tokens = attr_item.args.inner_tokens();
- let Ok(tok_result) = expander.expand(self.cx, span, inner_tokens, tokens) else {
-@@ -729,9 +726,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
- }
- };
- if fragment_kind == AstFragmentKind::Expr && items.is_empty() {
-- let msg =
-- "removing an expression is not supported in this position";
-- self.cx.span_err(span, msg);
-+ self.cx.emit_err(RemoveExprNotSupported { span });
- fragment_kind.dummy(span)
- } else {
- fragment_kind.expect_from_annotatables(items)
-@@ -939,38 +934,32 @@ pub fn parse_ast_fragment<'a>(
- }
-
- pub fn ensure_complete_parse<'a>(
-- this: &mut Parser<'a>,
-+ parser: &mut Parser<'a>,
- macro_path: &ast::Path,
- kind_name: &str,
- span: Span,
- ) {
-- if this.token != token::Eof {
-- let token = pprust::token_to_string(&this.token);
-- let msg = format!("macro expansion ignores token `{}` and any following", token);
-+ if parser.token != token::Eof {
-+ let token = pprust::token_to_string(&parser.token);
- // Avoid emitting backtrace info twice.
-- let def_site_span = this.token.span.with_ctxt(SyntaxContext::root());
-- let mut err = this.struct_span_err(def_site_span, &msg);
-- err.span_label(span, "caused by the macro expansion here");
-- let msg = format!(
-- "the usage of `{}!` is likely invalid in {} context",
-- pprust::path_to_string(macro_path),
-- kind_name,
-- );
-- err.note(&msg);
-+ let def_site_span = parser.token.span.with_ctxt(SyntaxContext::root());
-
-- let semi_span = this.sess.source_map().next_point(span);
-- match this.sess.source_map().span_to_snippet(semi_span) {
-+ let semi_span = parser.sess.source_map().next_point(span);
-+ let add_semicolon = match parser.sess.source_map().span_to_snippet(semi_span) {
- Ok(ref snippet) if &snippet[..] != ";" && kind_name == "expression" => {
-- err.span_suggestion(
-- span.shrink_to_hi(),
-- "you might be missing a semicolon here",
-- ";",
-- Applicability::MaybeIncorrect,
-- );
-+ Some(span.shrink_to_hi())
- }
-- _ => {}
-- }
-- err.emit();
-+ _ => None,
-+ };
-+
-+ parser.sess.emit_err(IncompleteParse {
-+ span: def_site_span,
-+ token,
-+ label_span: span,
-+ macro_path,
-+ kind_name,
-+ add_semicolon,
-+ });
- }
- }
-
-@@ -1766,9 +1755,8 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
- if self.expand_cfg_true(node, attr, pos) {
- continue;
- }
-- let msg =
-- format!("removing {} is not supported in this position", Node::descr());
-- self.cx.span_err(span, &msg);
-+
-+ self.cx.emit_err(RemoveNodeNotSupported { span, descr: Node::descr() });
- continue;
- }
- sym::cfg_attr => {
-diff --git a/compiler/rustc_expand/src/lib.rs b/compiler/rustc_expand/src/lib.rs
-index b34de94fb7db4..897268566358a 100644
---- a/compiler/rustc_expand/src/lib.rs
-+++ b/compiler/rustc_expand/src/lib.rs
-@@ -10,6 +10,7 @@
- #![feature(rustc_attrs)]
- #![feature(try_blocks)]
- #![recursion_limit = "256"]
-+#![deny(rustc::untranslatable_diagnostic)]
-
- #[macro_use]
- extern crate rustc_macros;
-@@ -31,8 +32,13 @@ pub mod config;
- pub mod errors;
- pub mod expand;
- pub mod module;
-+
-+// FIXME(Nilstrieb) Translate proc_macro diagnostics
-+#[allow(rustc::untranslatable_diagnostic)]
- pub mod proc_macro;
-
-+// FIXME(Nilstrieb) Translate macro_rules diagnostics
-+#[allow(rustc::untranslatable_diagnostic)]
- pub(crate) mod mbe;
-
- // HACK(Centril, #64197): These shouldn't really be here.
-diff --git a/compiler/rustc_expand/src/module.rs b/compiler/rustc_expand/src/module.rs
-index 9002a24e42f9d..07f47a9c3a4f2 100644
---- a/compiler/rustc_expand/src/module.rs
-+++ b/compiler/rustc_expand/src/module.rs
-@@ -1,13 +1,17 @@
- use crate::base::ModuleData;
-+use crate::errors::{
-+ ModuleCircular, ModuleFileNotFound, ModuleInBlock, ModuleInBlockName, ModuleMultipleCandidates,
-+};
- use rustc_ast::ptr::P;
- use rustc_ast::{token, AttrVec, Attribute, Inline, Item, ModSpans};
--use rustc_errors::{struct_span_err, DiagnosticBuilder, ErrorGuaranteed};
-+use rustc_errors::{DiagnosticBuilder, ErrorGuaranteed};
- use rustc_parse::new_parser_from_file;
- use rustc_parse::validate_attr;
- use rustc_session::parse::ParseSess;
- use rustc_session::Session;
- use rustc_span::symbol::{sym, Ident};
- use rustc_span::Span;
-+use std::iter::once;
-
- use std::path::{self, Path, PathBuf};
-
-@@ -242,57 +246,41 @@ pub fn default_submod_path<'a>(
-
- impl ModError<'_> {
- fn report(self, sess: &Session, span: Span) -> ErrorGuaranteed {
-- let diag = &sess.parse_sess.span_diagnostic;
- match self {
- ModError::CircularInclusion(file_paths) => {
-- let mut msg = String::from("circular modules: ");
-- for file_path in &file_paths {
-- msg.push_str(&file_path.display().to_string());
-- msg.push_str(" -> ");
-- }
-- msg.push_str(&file_paths[0].display().to_string());
-- diag.struct_span_err(span, &msg)
-- }
-- ModError::ModInBlock(ident) => {
-- let msg = "cannot declare a non-inline module inside a block unless it has a path attribute";
-- let mut err = diag.struct_span_err(span, msg);
-- if let Some(ident) = ident {
-- let note =
-- format!("maybe `use` the module `{}` instead of redeclaring it", ident);
-- err.span_note(span, ¬e);
-- }
-- err
-+ let path_to_string = |path: &PathBuf| path.display().to_string();
-+
-+ let paths = file_paths
-+ .iter()
-+ .map(path_to_string)
-+ .chain(once(path_to_string(&file_paths[0])))
-+ .collect::>();
-+
-+ let modules = paths.join(" -> ");
-+
-+ sess.emit_err(ModuleCircular { span, modules })
- }
-- ModError::FileNotFound(ident, default_path, secondary_path) => {
-- let mut err = struct_span_err!(
-- diag,
-+ ModError::ModInBlock(ident) => sess.emit_err(ModuleInBlock {
-+ span,
-+ name: ident.map(|name| ModuleInBlockName { span, name }),
-+ }),
-+ ModError::FileNotFound(name, default_path, secondary_path) => {
-+ sess.emit_err(ModuleFileNotFound {
- span,
-- E0583,
-- "file not found for module `{}`",
-- ident,
-- );
-- err.help(&format!(
-- "to create the module `{}`, create file \"{}\" or \"{}\"",
-- ident,
-- default_path.display(),
-- secondary_path.display(),
-- ));
-- err
-+ name,
-+ default_path: default_path.display().to_string(),
-+ secondary_path: secondary_path.display().to_string(),
-+ })
- }
-- ModError::MultipleCandidates(ident, default_path, secondary_path) => {
-- let mut err = struct_span_err!(
-- diag,
-+ ModError::MultipleCandidates(name, default_path, secondary_path) => {
-+ sess.emit_err(ModuleMultipleCandidates {
- span,
-- E0761,
-- "file for module `{}` found at both \"{}\" and \"{}\"",
-- ident,
-- default_path.display(),
-- secondary_path.display(),
-- );
-- err.help("delete or rename one of them to remove the ambiguity");
-- err
-+ name,
-+ default_path: default_path.display().to_string(),
-+ secondary_path: secondary_path.display().to_string(),
-+ })
- }
-- ModError::ParserError(err) => err,
-- }.emit()
-+ ModError::ParserError(mut err) => err.emit(),
-+ }
- }
- }
-diff --git a/compiler/rustc_expand/src/tests.rs b/compiler/rustc_expand/src/tests.rs
-index 539b04535a0d0..8f3bea29ffd28 100644
---- a/compiler/rustc_expand/src/tests.rs
-+++ b/compiler/rustc_expand/src/tests.rs
-@@ -154,6 +154,7 @@ fn test_harness(file_text: &str, span_labels: Vec, expected_output: &
- false,
- );
- let handler = Handler::with_emitter(true, None, Box::new(emitter));
-+ #[allow(rustc::untranslatable_diagnostic)]
- handler.span_err(msp, "foo");
-
- assert!(
-diff --git a/src/test/rustdoc-ui/doc-cfg.stderr b/src/test/rustdoc-ui/doc-cfg.stderr
-index b379f6febe29f..14b7b17e04d3a 100644
---- a/src/test/rustdoc-ui/doc-cfg.stderr
-+++ b/src/test/rustdoc-ui/doc-cfg.stderr
-@@ -2,7 +2,7 @@ error: `cfg` predicate is not specified
- --> $DIR/doc-cfg.rs:3:7
- |
- LL | #[doc(cfg(), cfg(foo, bar))]
-- | ^^^^^
-+ | ^^^^^ help: expected syntax is: `cfg(/* predicate */)`
-
- error: multiple `cfg` predicates are specified
- --> $DIR/doc-cfg.rs:3:23
-@@ -14,7 +14,7 @@ error: `cfg` predicate is not specified
- --> $DIR/doc-cfg.rs:7:7
- |
- LL | #[doc(cfg())]
-- | ^^^^^
-+ | ^^^^^ help: expected syntax is: `cfg(/* predicate */)`
-
- error: multiple `cfg` predicates are specified
- --> $DIR/doc-cfg.rs:8:16
-diff --git a/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr b/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr
-index d4bd673b84e1b..d5b4349c00f6f 100644
---- a/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr
-+++ b/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr
-@@ -14,7 +14,7 @@ error: `cfg` predicate is not specified
- --> $DIR/cfg-attr-syntax-validation.rs:7:1
- |
- LL | #[cfg()]
-- | ^^^^^^^^
-+ | ^^^^^^^^ help: expected syntax is: `cfg(/* predicate */)`
-
- error: multiple `cfg` predicates are specified
- --> $DIR/cfg-attr-syntax-validation.rs:10:10
-diff --git a/src/test/ui/macros/macro-in-expression-context.stderr b/src/test/ui/macros/macro-in-expression-context.stderr
-index 1023189eaa30f..36aba8aa08a0b 100644
---- a/src/test/ui/macros/macro-in-expression-context.stderr
-+++ b/src/test/ui/macros/macro-in-expression-context.stderr
-@@ -5,11 +5,13 @@ LL | assert_eq!("B", "B");
- | ^^^^^^^^^
- ...
- LL | foo!()
-- | ------- help: you might be missing a semicolon here: `;`
-- | |
-- | caused by the macro expansion here
-+ | ------ caused by the macro expansion here
- |
- = note: the usage of `foo!` is likely invalid in expression context
-+help: you might be missing a semicolon here
-+ |
-+LL | foo!();
-+ | +
-
- warning: trailing semicolon in macro used in expression position
- --> $DIR/macro-in-expression-context.rs:5:29
-diff --git a/src/test/ui/proc-macro/attr-invalid-exprs.stderr b/src/test/ui/proc-macro/attr-invalid-exprs.stderr
-index bcb54df0ecac7..f96939bb6efce 100644
---- a/src/test/ui/proc-macro/attr-invalid-exprs.stderr
-+++ b/src/test/ui/proc-macro/attr-invalid-exprs.stderr
-@@ -8,21 +8,25 @@ error: macro expansion ignores token `,` and any following
- --> $DIR/attr-invalid-exprs.rs:15:13
- |
- LL | let _ = #[duplicate] "Hello, world!";
-- | ^^^^^^^^^^^^- help: you might be missing a semicolon here: `;`
-- | |
-- | caused by the macro expansion here
-+ | ^^^^^^^^^^^^ caused by the macro expansion here
- |
- = note: the usage of `duplicate!` is likely invalid in expression context
-+help: you might be missing a semicolon here
-+ |
-+LL | let _ = #[duplicate]; "Hello, world!";
-+ | +
-
- error: macro expansion ignores token `,` and any following
- --> $DIR/attr-invalid-exprs.rs:24:9
- |
- LL | #[duplicate]
-- | ^^^^^^^^^^^^- help: you might be missing a semicolon here: `;`
-- | |
-- | caused by the macro expansion here
-+ | ^^^^^^^^^^^^ caused by the macro expansion here
- |
- = note: the usage of `duplicate!` is likely invalid in expression context
-+help: you might be missing a semicolon here
-+ |
-+LL | #[duplicate];
-+ | +
-
- error: aborting due to 3 previous errors
-
-diff --git a/src/test/ui/proc-macro/attribute.rs b/src/test/ui/proc-macro/attribute.rs
-index 5531b32362125..9e40e4d9ba63e 100644
---- a/src/test/ui/proc-macro/attribute.rs
-+++ b/src/test/ui/proc-macro/attribute.rs
-@@ -53,19 +53,19 @@ pub fn foo11(input: TokenStream) -> TokenStream { input }
- pub fn foo12(input: TokenStream) -> TokenStream { input }
-
- #[proc_macro_derive(d13, attributes("a"))]
--//~^ ERROR: not a meta item
-+//~^ ERROR: attribute must be a meta item, not a literal
- pub fn foo13(input: TokenStream) -> TokenStream { input }
-
- #[proc_macro_derive(d14, attributes(a = ""))]
--//~^ ERROR: must only be one word
-+//~^ ERROR: attribute must only be a single word
- pub fn foo14(input: TokenStream) -> TokenStream { input }
-
- #[proc_macro_derive(d15, attributes(m::a))]
--//~^ ERROR: must only be one word
-+//~^ ERROR: attribute must only be a single word
- pub fn foo15(input: TokenStream) -> TokenStream { input }
-
- #[proc_macro_derive(d16, attributes(a(b)))]
--//~^ ERROR: must only be one word
-+//~^ ERROR: attribute must only be a single word
- pub fn foo16(input: TokenStream) -> TokenStream { input }
-
- #[proc_macro_derive(d17, attributes(self))]
-diff --git a/src/test/ui/proc-macro/attribute.stderr b/src/test/ui/proc-macro/attribute.stderr
-index 021e7cad09b69..3269aaf7f917e 100644
---- a/src/test/ui/proc-macro/attribute.stderr
-+++ b/src/test/ui/proc-macro/attribute.stderr
-@@ -70,25 +70,25 @@ error: attribute must be of form: `attributes(foo, bar)`
- LL | #[proc_macro_derive(d12, attributes)]
- | ^^^^^^^^^^
-
--error: not a meta item
-+error: attribute must be a meta item, not a literal
- --> $DIR/attribute.rs:55:37
- |
- LL | #[proc_macro_derive(d13, attributes("a"))]
- | ^^^
-
--error: must only be one word
-+error: attribute must only be a single word
- --> $DIR/attribute.rs:59:37
- |
- LL | #[proc_macro_derive(d14, attributes(a = ""))]
- | ^^^^^^
-
--error: must only be one word
-+error: attribute must only be a single word
- --> $DIR/attribute.rs:63:37
- |
- LL | #[proc_macro_derive(d15, attributes(m::a))]
- | ^^^^
-
--error: must only be one word
-+error: attribute must only be a single word
- --> $DIR/attribute.rs:67:37
- |
- LL | #[proc_macro_derive(d16, attributes(a(b)))]
-diff --git a/src/test/ui/proc-macro/expand-expr.stderr b/src/test/ui/proc-macro/expand-expr.stderr
-index c6c4695fd9c43..0004f2fe17f01 100644
---- a/src/test/ui/proc-macro/expand-expr.stderr
-+++ b/src/test/ui/proc-macro/expand-expr.stderr
-@@ -26,21 +26,25 @@ error: macro expansion ignores token `hello` and any following
- --> $DIR/expand-expr.rs:115:47
- |
- LL | expand_expr_is!("string", echo_tts!("string"; hello));
-- | --------------------^^^^^-- help: you might be missing a semicolon here: `;`
-- | |
-- | caused by the macro expansion here
-+ | --------------------^^^^^- caused by the macro expansion here
- |
- = note: the usage of `echo_tts!` is likely invalid in expression context
-+help: you might be missing a semicolon here
-+ |
-+LL | expand_expr_is!("string", echo_tts!("string"; hello););
-+ | +
-
- error: macro expansion ignores token `;` and any following
- --> $DIR/expand-expr.rs:116:44
- |
- LL | expand_expr_is!("string", echo_pm!("string"; hello));
-- | -----------------^-------- help: you might be missing a semicolon here: `;`
-- | |
-- | caused by the macro expansion here
-+ | -----------------^------- caused by the macro expansion here
- |
- = note: the usage of `echo_pm!` is likely invalid in expression context
-+help: you might be missing a semicolon here
-+ |
-+LL | expand_expr_is!("string", echo_pm!("string"; hello););
-+ | +
-
- error: recursion limit reached while expanding `recursive_expand!`
- --> $DIR/expand-expr.rs:124:16
diff --git a/dev-lang/rust/rust-1.65.0.ebuild b/dev-lang/rust/rust-1.65.0.ebuild
deleted file mode 100644
index b12ab0d6de08..000000000000
--- a/dev-lang/rust/rust-1.65.0.ebuild
+++ /dev/null
@@ -1,754 +0,0 @@
-# Copyright 1999-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..11} )
-
-inherit bash-completion-r1 check-reqs estack flag-o-matic llvm multiprocessing \
- multilib multilib-build python-any-r1 rust-toolchain toolchain-funcs verify-sig
-
-if [[ ${PV} = *beta* ]]; then
- betaver=${PV//*beta}
- BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
- MY_P="rustc-beta"
- SLOT="beta/${PV}"
- SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz"
-else
- ABI_VER="$(ver_cut 1-2)"
- SLOT="stable/${ABI_VER}"
- MY_P="rustc-${PV}"
- SRC="${MY_P}-src.tar.xz"
- KEYWORDS="amd64 arm arm64 ~mips ~ppc ppc64 ~riscv sparc x86"
-fi
-
-RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).0"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="https://www.rust-lang.org/"
-
-SRC_URI="
- https://static.rust-lang.org/dist/${SRC}
- verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc )
- !system-bootstrap? ( $(rust_all_arch_uris rust-${RUST_STAGE0_VERSION}) )
-"
-
-# keep in sync with llvm ebuild of the same version as bundled one.
-ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai Mips MSP430
- NVPTX PowerPC RISCV Sparc SystemZ WebAssembly X86 XCore )
-ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
-LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind miri nightly parallel-compiler profiler rustfmt rust-analyzer rust-src system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"
-
-# Please keep the LLVM dependency block separate. Since LLVM is slotted,
-# we need to *really* make sure we're not pulling more than one slot
-# simultaneously.
-
-# How to use it:
-# List all the working slots in LLVM_VALID_SLOTS, newest first.
-LLVM_VALID_SLOTS=( 15 )
-LLVM_MAX_SLOT="${LLVM_VALID_SLOTS[0]}"
-
-# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation
-# (-) usedep needed because we may build with older llvm without that target
-LLVM_DEPEND="|| ( "
-for _s in ${LLVM_VALID_SLOTS[@]}; do
- LLVM_DEPEND+=" ( "
- for _x in ${ALL_LLVM_TARGETS[@]}; do
- LLVM_DEPEND+="
- ${_x}? ( sys-devel/llvm:${_s}[${_x}(-)] )
- wasm? ( sys-devel/lld:${_s} )"
- done
- LLVM_DEPEND+=" )"
-done
-unset _s _x
-LLVM_DEPEND+=" )
- =sys-devel/gcc-4.7
- >=sys-devel/clang-3.5
- )
- system-bootstrap? ( ${BOOTSTRAP_DEPEND} )
- !system-llvm? (
- >=dev-build/cmake-3.13.4
- app-alternatives/ninja
- )
- test? ( dev-debug/gdb )
- verify-sig? ( sec-keys/openpgp-keys-rust )
-"
-
-DEPEND="
- >=app-arch/xz-utils-5.2
- net-misc/curl:=[http2,ssl]
- sys-libs/zlib:=
- dev-libs/openssl:0=
- system-llvm? (
- ${LLVM_DEPEND}
- llvm-libunwind? ( sys-libs/llvm-libunwind:= )
- )
- !system-llvm? (
- !llvm-libunwind? (
- elibc_musl? ( sys-libs/libunwind:= )
- )
- )
-"
-
-RDEPEND="${DEPEND}
- app-eselect/eselect-rust
- sys-apps/lsb-release
-"
-
-# FIXME: https://bugs.gentoo.org/874885
-# rust-analyzer should work with wasm, but currently does not
-REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )
- miri? ( nightly )
- parallel-compiler? ( nightly )
- rust-analyzer? ( !wasm rust-src )
- test? ( ${ALL_LLVM_TARGETS[*]} )
- wasm? ( llvm_targets_WebAssembly )
- x86? ( cpu_flags_x86_sse2 )
-"
-
-# we don't use cmake.eclass, but can get a warning
-CMAKE_WARN_UNUSED_CLI=no
-
-QA_FLAGS_IGNORED="
- usr/lib/${PN}/${PV}/bin/.*
- usr/lib/${PN}/${PV}/libexec/.*
- usr/lib/${PN}/${PV}/lib/lib.*.so
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_SONAME="
- usr/lib/${PN}/${PV}/lib/lib.*.so.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_PRESTRIPPED="
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o
-"
-
-# An rmeta file is custom binary format that contains the metadata for the crate.
-# rmeta files do not support linking, since they do not contain compiled object files.
-# so we can safely silence the warning for this QA check.
-QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta"
-
-# causes double bootstrap
-RESTRICT="test"
-
-VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
-
-PATCHES=(
- "${FILESDIR}"/1.65.0-ignore-broken-and-non-applicable-tests.patch
- "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch
- "${FILESDIR}"/1.64.0-vendor-rustix-sparc-has-no-SIGSTKFLT.patch
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-toml_usex() {
- usex "${1}" true false
-}
-
-bootstrap_rust_version_check() {
- # never call from pkg_pretend. eselect-rust may be not installed yet.
- [[ ${MERGE_TYPE} == binary ]] && return
- local rustc_wanted="$(ver_cut 1).$(($(ver_cut 2) - 1))"
- local rustc_toonew="$(ver_cut 1).$(($(ver_cut 2) + 1))"
- local rustc_version=( $(eselect --brief rust show 2>/dev/null) )
- rustc_version=${rustc_version[0]#rust-bin-}
- rustc_version=${rustc_version#rust-}
-
- [[ -z "${rustc_version}" ]] && die "Failed to determine rust version, check 'eselect rust' output"
-
- if ver_test "${rustc_version}" -lt "${rustc_wanted}" ; then
- eerror "Rust >=${rustc_wanted} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too old"
- elif ver_test "${rustc_version}" -ge "${rustc_toonew}" ; then
- eerror "Rust <${rustc_toonew} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too new"
- else
- einfo "Using rust ${rustc_version} to build"
- fi
-}
-
-pre_build_checks() {
- local M=8192
- # multiply requirements by 1.3 if we are doing x86-multilib
- if use amd64; then
- M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 ))
- fi
- M=$(( $(usex clippy 128 0) + ${M} ))
- M=$(( $(usex miri 128 0) + ${M} ))
- M=$(( $(usex rustfmt 256 0) + ${M} ))
- # add 2G if we compile llvm and 256M per llvm_target
- if ! use system-llvm; then
- M=$(( 2048 + ${M} ))
- local ltarget
- for ltarget in ${ALL_LLVM_TARGETS[@]}; do
- M=$(( $(usex ${ltarget} 256 0) + ${M} ))
- done
- fi
- M=$(( $(usex wasm 256 0) + ${M} ))
- M=$(( $(usex debug 2 1) * ${M} ))
- eshopts_push -s extglob
- if is-flagq '-g?(gdb)?([1-9])'; then
- M=$(( 15 * ${M} / 10 ))
- fi
- eshopts_pop
- M=$(( $(usex system-bootstrap 0 1024) + ${M} ))
- M=$(( $(usex doc 256 0) + ${M} ))
- CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
-}
-
-llvm_check_deps() {
- has_version -r "sys-devel/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]"
-}
-
-# Is LLVM being linked against libc++?
-is_libcxx_linked() {
- local code='#include
-#if defined(_LIBCPP_VERSION)
- HAVE_LIBCXX
-#endif
-'
- local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
- [[ ${out} == *HAVE_LIBCXX* ]]
-}
-
-pkg_pretend() {
- pre_build_checks
-}
-
-pkg_setup() {
- pre_build_checks
- python-any-r1_pkg_setup
-
- export LIBGIT2_NO_PKG_CONFIG=1 #749381
-
- use system-bootstrap && bootstrap_rust_version_check
-
- if use system-llvm; then
- llvm_pkg_setup
-
- local llvm_config="$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- export LLVM_LINK_SHARED=1
- export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)"
- fi
-}
-
-esetup_unwind_hack() {
- # https://bugs.gentoo.org/870280
- # this is a hack needed to bootstrap with libgcc_s linked tarball on llvm-libunwind system.
- # it should trigger for internal bootstrap or system-bootstrap with rust-bin.
- # the whole idea is for stage0 to bootstrap with fake libgcc_s.
- # final stage will receive -L${T}/lib but not -lgcc_s args, producing clean compiler.
- local fakelib="${T}/fakelib"
- mkdir -p "${fakelib}" || die
- # we need both symlinks, one for cargo runtime, other for linker.
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so.1" || die
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so" || die
- export LD_LIBRARY_PATH="${fakelib}"
- export RUSTFLAGS+=" -L${fakelib}"
- # this is a literally magic variable that gets through cargo cache, without it some
- # crates ignore RUSTFLAGS.
- # this variable can not contain leading space.
- export MAGIC_EXTRA_RUSTFLAGS+="${MAGIC_EXTRA_RUSTFLAGS:+ }-L${fakelib}"
-}
-
-src_prepare() {
- # this supidity is needed because patch is too large to be in filesdir
- # and if we move it to devspace - it lacks checksum for sig verification
- if [[ "${PV}" == 1.65.0 ]]; then
- sed -i \
- -e 's/516ba32a547b46a8e80ad20d4a17bf24a00bff0b69b74f56df119f770f3dfff6/fc7eb88c2f5104865379128b76767d36ce5b5fdb9f3483e683d150e514ebc3a3/' \
- -e 's/fba10dc8ca9eaf4d481cb82bd1540cf5c05620533c44f917c09a22ea55ef408c/9cc4d1b4511a1f0d91231eb0f11c67ae5e8e38e4becd0bf5eb9e26d043796056/' \
- vendor/rustix/.cargo-checksum.json || die
- else
- die "remove sed mr forgetful maintainer"
- fi
- if ! use system-bootstrap; then
- has_version sys-devel/gcc || esetup_unwind_hack
- local rust_stage0_root="${WORKDIR}"/rust-stage0
- local rust_stage0="rust-${RUST_STAGE0_VERSION}-$(rust_abi)"
-
- "${WORKDIR}/${rust_stage0}"/install.sh --disable-ldconfig \
- --without=rust-docs --destdir="${rust_stage0_root}" --prefix=/ || die
- fi
-
- default
-}
-
-src_configure() {
- filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231
-
- local rust_target="" rust_targets="" arch_cflags
-
- # Collect rust target names to compile standard libs for all ABIs.
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\""
- done
- if use wasm; then
- rust_targets+=",\"wasm32-unknown-unknown\""
- if use system-llvm; then
- # un-hardcode rust-lld linker for this target
- # https://bugs.gentoo.org/715348
- sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die
- fi
- fi
- rust_targets="${rust_targets#,}"
-
- local tools='"cargo"'
- use clippy && tools+=',"clippy"'
- use miri && tools+=',"miri"'
- use profiler && tools+=',"rust-demangler"'
- use rustfmt && tools+=',"rustfmt"'
- use rust-analyzer && tools+=',"rust-analyzer","analysis"'
- use rust-src && tools+=',"src"'
-
- local rust_stage0_root
- if use system-bootstrap; then
- local printsysroot
- printsysroot="$(rustc --print sysroot || die "Can't determine rust's sysroot")"
- rust_stage0_root="${printsysroot}"
- else
- rust_stage0_root="${WORKDIR}"/rust-stage0
- fi
- # in case of prefix it will be already prefixed, as --print sysroot returns full path
- [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory"
-
- rust_target="$(rust_abi)"
-
- local cm_btype="$(usex debug DEBUG RELEASE)"
- cat <<- _EOF_ > "${S}"/config.toml
- changelog-seen = 2
- [llvm]
- download-ci-llvm = false
- optimize = $(toml_usex !debug)
- release-debuginfo = $(toml_usex debug)
- assertions = $(toml_usex debug)
- ninja = true
- targets = "${LLVM_TARGETS// /;}"
- experimental-targets = ""
- link-shared = $(toml_usex system-llvm)
- $(if is_libcxx_linked; then
- # https://bugs.gentoo.org/732632
- echo "use-libcxx = true"
- echo "static-libstdcpp = false"
- fi)
- $(case "${rust_target}" in
- i586-*-linux-*)
- # https://github.com/rust-lang/rust/issues/93059
- echo 'cflags = "-fcf-protection=none"'
- echo 'cxxflags = "-fcf-protection=none"'
- echo 'ldflags = "-fcf-protection=none"'
- ;;
- *)
- ;;
- esac)
- [llvm.build-config]
- CMAKE_VERBOSE_MAKEFILE = "ON"
- CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}"
- CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}"
- CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}"
- [build]
- build-stage = 2
- test-stage = 2
- build = "${rust_target}"
- host = ["${rust_target}"]
- target = [${rust_targets}]
- cargo = "${rust_stage0_root}/bin/cargo"
- rustc = "${rust_stage0_root}/bin/rustc"
- rustfmt = "${rust_stage0_root}/bin/rustfmt"
- docs = $(toml_usex doc)
- compiler-docs = false
- submodules = false
- python = "${EPYTHON}"
- locked-deps = true
- vendor = true
- extended = true
- tools = [${tools}]
- verbose = 2
- sanitizers = false
- profiler = $(toml_usex profiler)
- cargo-native-static = false
- [install]
- prefix = "${EPREFIX}/usr/lib/${PN}/${PV}"
- sysconfdir = "etc"
- docdir = "share/doc/rust"
- bindir = "bin"
- libdir = "lib"
- mandir = "share/man"
- [rust]
- # https://github.com/rust-lang/rust/issues/54872
- codegen-units-std = 1
- optimize = true
- debug = $(toml_usex debug)
- debug-assertions = $(toml_usex debug)
- debug-assertions-std = $(toml_usex debug)
- debuginfo-level = $(usex debug 2 0)
- debuginfo-level-rustc = $(usex debug 2 0)
- debuginfo-level-std = $(usex debug 2 0)
- debuginfo-level-tools = $(usex debug 2 0)
- debuginfo-level-tests = 0
- backtrace = true
- incremental = false
- default-linker = "$(tc-getCC)"
- parallel-compiler = $(toml_usex parallel-compiler)
- channel = "$(usex nightly nightly stable)"
- description = "gentoo"
- rpath = false
- verbose-tests = true
- optimize-tests = $(toml_usex !debug)
- codegen-tests = true
- dist-src = false
- remap-debuginfo = true
- lld = $(usex system-llvm false $(toml_usex wasm))
- # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it
- # https://github.com/rust-lang/rust/issues/74976
- # https://github.com/rust-lang/rust/issues/76526
- deny-warnings = $(usex wasm $(usex doc false true) true)
- backtrace-on-ice = true
- jemalloc = false
- [dist]
- src-tarball = false
- compression-formats = ["xz"]
- _EOF_
-
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_target=$(rust_abi $(get_abi_CHOST ${v##*.}))
- arch_cflags="$(get_abi_CFLAGS ${v##*.})"
-
- export CFLAGS_${rust_target//-/_}="${arch_cflags}"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${rust_target}]
- ar = "$(tc-getAR)"
- cc = "$(tc-getCC)"
- cxx = "$(tc-getCXX)"
- linker = "$(tc-getCC)"
- ranlib = "$(tc-getRANLIB)"
- llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true;
- # but we patch it and set to false here as well
- if use elibc_musl; then
- cat <<- _EOF_ >> "${S}"/config.toml
- crt-static = false
- _EOF_
- fi
- done
- if use wasm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.wasm32-unknown-unknown]
- linker = "$(usex system-llvm lld rust-lld)"
- # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483
- profiler = false
- _EOF_
- fi
-
- if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below
- # experimental cross support
- # discussion: https://bugs.gentoo.org/679878
- # TODO: c*flags, clang, system-llvm, cargo.eclass target support
- # it would be much better if we could split out stdlib
- # complilation to separate ebuild and abuse CATEGORY to
- # just install to /usr/lib/rustlib/
-
- # extra targets defined as a bash array
- # spec format: ::
- # best place would be /etc/portage/env/dev-lang/rust
- # Example:
- # RUST_CROSS_TARGETS=(
- # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu"
- # )
- # no extra hand holding is done, no target transformations, all
- # values are passed as-is with just basic checks, so it's up to user to supply correct values
- # valid rust targets can be obtained with
- # rustc --print target-list
- # matching cross toolchain has to be installed
- # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one)
- # only gcc toolchains installed with crossdev are checked for now.
-
- # BUG: we can't pass host flags to cross compiler, so just filter for now
- # BUG: this should be more fine-grained.
- filter-flags '-mcpu=*' '-march=*' '-mtune=*'
-
- local cross_target_spec
- for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do
- # extracts first element form ::
- local cross_llvm_target="${cross_target_spec%%:*}"
- # extracts toolchain triples, :
- local cross_triples="${cross_target_spec#*:}"
- # extracts first element after before : separator
- local cross_rust_target="${cross_triples%%:*}"
- # extracts last element after : separator
- local cross_toolchain="${cross_triples##*:}"
- use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled"
- command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${cross_rust_target}]
- ar = "${cross_toolchain}-ar"
- cc = "${cross_toolchain}-gcc"
- cxx = "${cross_toolchain}-g++"
- linker = "${cross_toolchain}-gcc"
- ranlib = "${cross_toolchain}-ranlib"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- if [[ "${cross_toolchain}" == *-musl* ]]; then
- cat <<- _EOF_ >> "${S}"/config.toml
- musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr"
- _EOF_
- fi
-
- # append cross target to "normal" target list
- # example 'target = ["powerpc64le-unknown-linux-gnu"]'
- # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]'
-
- rust_targets="${rust_targets},\"${cross_rust_target}\""
- sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die
-
- ewarn
- ewarn "Enabled ${cross_rust_target} rust target"
- ewarn "Using ${cross_toolchain} cross toolchain"
- ewarn
- if ! has_version -b 'sys-devel/binutils[multitarget]' ; then
- ewarn "'sys-devel/binutils[multitarget]' is not installed"
- ewarn "'strip' will be unable to strip cross libraries"
- ewarn "cross targets will be installed with full debug information"
- ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files"
- ewarn
- ewarn "Alternatively llvm-strip can be used, it supports stripping any target"
- ewarn "define STRIP=\"llvm-strip\" to use it (experimental)"
- ewarn
- fi
- done
- fi # I_KNOW_WHAT_I_AM_DOING_CROSS
-
- einfo "Rust configured with the following flags:"
- echo
- echo RUSTFLAGS="\"${RUSTFLAGS}\""
- echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\""
- echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\""
- echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\""
- env | grep "CARGO_TARGET_.*_RUSTFLAGS="
- env | grep "CFLAGS_.*"
- echo
- einfo "config.toml contents:"
- cat "${S}"/config.toml || die
- echo
-}
-
-src_compile() {
- RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-}
-
-src_test() {
- # https://rustc-dev-guide.rust-lang.org/tests/intro.html
-
- # those are basic and codegen tests.
- local tests=(
- codegen
- codegen-units
- compile-fail
- incremental
- mir-opt
- pretty
- run-make
- )
-
- # fails if llvm is not built with ALL targets.
- # and known to fail with system llvm sometimes.
- use system-llvm || tests+=( assembly )
-
- # fragile/expensive/less important tests
- # or tests that require extra builds
- # TODO: instead of skipping, just make some nonfatal.
- if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then
- tests+=(
- rustdoc
- rustdoc-js
- rustdoc-js-std
- rustdoc-ui
- run-make-fulldeps
- ui
- ui-fulldeps
- )
- fi
-
- local i failed=()
- einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}"
- for i in "${tests[@]}"; do
- local t="src/test/${i}"
- einfo "rust_src_test: running ${t}"
- if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \
- -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}"
- then
- failed+=( "${t}" )
- eerror "rust_src_test: ${t} failed"
- fi
- done
-
- if [[ ${#failed[@]} -ne 0 ]]; then
- eerror "rust_src_test: failure summary: ${failed[@]}"
- die "aborting due to test failures"
- fi
-}
-
-src_install() {
- DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-
- # bug #689562, #689160
- rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die
- rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die
- newbashcomp src/tools/cargo/src/etc/cargo.bashcomp.sh cargo
-
- local symlinks=(
- cargo
- rustc
- rustdoc
- rust-gdb
- rust-gdbgui
- rust-lldb
- )
-
- use clippy && symlinks+=( clippy-driver cargo-clippy )
- use miri && symlinks+=( miri cargo-miri )
- use profiler && symlinks+=( rust-demangler )
- use rustfmt && symlinks+=( rustfmt cargo-fmt )
- use rust-analyzer && symlinks+=( rust-analyzer )
-
- einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}"
- local i
- for i in "${symlinks[@]}"; do
- # we need realpath on /usr/bin/* symlink return version-appended binary path.
- # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc-
- # need to fix eselect-rust to remove this hack.
- local ver_i="${i}-${PV}"
- if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then
- einfo "Installing ${i} symlink"
- ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die
- else
- ewarn "${i} symlink requested, but source file not found"
- ewarn "please report this"
- fi
- dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}"
- done
-
- # symlinks to switch components to active rust in eselect
- dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}"
- dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}"
- dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}"
- dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}"
- dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}"
-
- newenvd - "50${P}" <<-_EOF_
- LDPATH="${EPREFIX}/usr/lib/rust/lib"
- MANPATH="${EPREFIX}/usr/lib/rust/man"
- _EOF_
-
- rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die
-
- # note: eselect-rust adds EROOT to all paths below
- cat <<-_EOF_ > "${T}/provider-${P}"
- /usr/bin/cargo
- /usr/bin/rustdoc
- /usr/bin/rust-gdb
- /usr/bin/rust-gdbgui
- /usr/bin/rust-lldb
- /usr/lib/rustlib
- /usr/lib/rust/lib
- /usr/lib/rust/libexec
- /usr/lib/rust/man
- /usr/share/doc/rust
- _EOF_
-
- if use clippy; then
- echo /usr/bin/clippy-driver >> "${T}/provider-${P}"
- echo /usr/bin/cargo-clippy >> "${T}/provider-${P}"
- fi
- if use miri; then
- echo /usr/bin/miri >> "${T}/provider-${P}"
- echo /usr/bin/cargo-miri >> "${T}/provider-${P}"
- fi
- if use profiler; then
- echo /usr/bin/rust-demangler >> "${T}/provider-${P}"
- fi
- if use rustfmt; then
- echo /usr/bin/rustfmt >> "${T}/provider-${P}"
- echo /usr/bin/cargo-fmt >> "${T}/provider-${P}"
- fi
- if use rust-analyzer; then
- echo /usr/bin/rust-analyzer >> "${T}/provider-${P}"
- fi
-
- insinto /etc/env.d/rust
- doins "${T}/provider-${P}"
-
- if use dist; then
- insinto "/usr/lib/${PN}/${PV}/dist"
- doins -r "${S}/build/dist/."
- fi
-}
-
-pkg_postinst() {
- eselect rust update
-
- if has_version dev-debug/gdb || has_version dev-debug/lldb; then
- elog "Rust installs a helper script for calling GDB and LLDB,"
- elog "for your convenience it is installed under /usr/bin/rust-{gdb,lldb}-${PV}."
- fi
-
- if has_version app-editors/emacs; then
- elog "install app-emacs/rust-mode to get emacs support for rust."
- fi
-
- if has_version app-editors/gvim || has_version app-editors/vim; then
- elog "install app-vim/rust-vim to get vim support for rust."
- fi
-}
-
-pkg_postrm() {
- eselect rust cleanup
-}
diff --git a/dev-lang/rust/rust-1.66.1.ebuild b/dev-lang/rust/rust-1.66.1.ebuild
deleted file mode 100644
index 34c13db52dcf..000000000000
--- a/dev-lang/rust/rust-1.66.1.ebuild
+++ /dev/null
@@ -1,752 +0,0 @@
-# Copyright 1999-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..11} )
-
-inherit bash-completion-r1 check-reqs estack flag-o-matic llvm multiprocessing \
- multilib multilib-build python-any-r1 rust-toolchain toolchain-funcs verify-sig
-
-if [[ ${PV} = *beta* ]]; then
- betaver=${PV//*beta}
- BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
- MY_P="rustc-beta"
- SLOT="beta/${PV}"
- SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz"
-else
- ABI_VER="$(ver_cut 1-2)"
- SLOT="stable/${ABI_VER}"
- MY_P="rustc-${PV}"
- SRC="${MY_P}-src.tar.xz"
- KEYWORDS="amd64 arm arm64 ~mips ppc ppc64 ~riscv sparc x86"
-fi
-
-RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).0"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="https://www.rust-lang.org/"
-
-SRC_URI="
- https://static.rust-lang.org/dist/${SRC}
- verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc )
- !system-bootstrap? ( $(rust_all_arch_uris rust-${RUST_STAGE0_VERSION}) )
-"
-
-# keep in sync with llvm ebuild of the same version as bundled one.
-ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai Mips MSP430
- NVPTX PowerPC RISCV Sparc SystemZ WebAssembly X86 XCore )
-ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
-LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind miri nightly parallel-compiler profiler rustfmt rust-analyzer rust-src system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"
-
-# Please keep the LLVM dependency block separate. Since LLVM is slotted,
-# we need to *really* make sure we're not pulling more than one slot
-# simultaneously.
-
-# How to use it:
-# List all the working slots in LLVM_VALID_SLOTS, newest first.
-LLVM_VALID_SLOTS=( 15 )
-LLVM_MAX_SLOT="${LLVM_VALID_SLOTS[0]}"
-
-# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation
-# (-) usedep needed because we may build with older llvm without that target
-LLVM_DEPEND="|| ( "
-for _s in ${LLVM_VALID_SLOTS[@]}; do
- LLVM_DEPEND+=" ( "
- for _x in ${ALL_LLVM_TARGETS[@]}; do
- LLVM_DEPEND+="
- ${_x}? ( sys-devel/llvm:${_s}[${_x}(-)] )
- wasm? ( sys-devel/lld:${_s} )"
- done
- LLVM_DEPEND+=" )"
-done
-unset _s _x
-LLVM_DEPEND+=" )
- =sys-devel/gcc-4.7
- >=sys-devel/clang-3.5
- )
- system-bootstrap? ( ${BOOTSTRAP_DEPEND} )
- !system-llvm? (
- >=dev-build/cmake-3.13.4
- app-alternatives/ninja
- )
- test? ( dev-debug/gdb )
- verify-sig? ( sec-keys/openpgp-keys-rust )
-"
-
-DEPEND="
- >=app-arch/xz-utils-5.2
- net-misc/curl:=[http2,ssl]
- sys-libs/zlib:=
- dev-libs/openssl:0=
- system-llvm? (
- ${LLVM_DEPEND}
- llvm-libunwind? ( sys-libs/llvm-libunwind:= )
- )
- !system-llvm? (
- !llvm-libunwind? (
- elibc_musl? ( sys-libs/libunwind:= )
- )
- )
-"
-
-RDEPEND="${DEPEND}
- app-eselect/eselect-rust
- sys-apps/lsb-release
-"
-
-REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )
- miri? ( nightly )
- parallel-compiler? ( nightly )
- rust-analyzer? ( rust-src )
- test? ( ${ALL_LLVM_TARGETS[*]} )
- wasm? ( llvm_targets_WebAssembly )
- x86? ( cpu_flags_x86_sse2 )
-"
-
-# we don't use cmake.eclass, but can get a warning
-CMAKE_WARN_UNUSED_CLI=no
-
-QA_FLAGS_IGNORED="
- usr/lib/${PN}/${PV}/bin/.*
- usr/lib/${PN}/${PV}/libexec/.*
- usr/lib/${PN}/${PV}/lib/lib.*.so
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_SONAME="
- usr/lib/${PN}/${PV}/lib/lib.*.so.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_PRESTRIPPED="
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o
-"
-
-# An rmeta file is custom binary format that contains the metadata for the crate.
-# rmeta files do not support linking, since they do not contain compiled object files.
-# so we can safely silence the warning for this QA check.
-QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta"
-
-# causes double bootstrap
-RESTRICT="test"
-
-VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
-
-PATCHES=(
- "${FILESDIR}"/1.65.0-ignore-broken-and-non-applicable-tests.patch
- "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch
- "${FILESDIR}"/1.64.0-vendor-rustix-sparc-has-no-SIGSTKFLT.patch
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-toml_usex() {
- usex "${1}" true false
-}
-
-bootstrap_rust_version_check() {
- # never call from pkg_pretend. eselect-rust may be not installed yet.
- [[ ${MERGE_TYPE} == binary ]] && return
- local rustc_wanted="$(ver_cut 1).$(($(ver_cut 2) - 1))"
- local rustc_toonew="$(ver_cut 1).$(($(ver_cut 2) + 1))"
- local rustc_version=( $(eselect --brief rust show 2>/dev/null) )
- rustc_version=${rustc_version[0]#rust-bin-}
- rustc_version=${rustc_version#rust-}
-
- [[ -z "${rustc_version}" ]] && die "Failed to determine rust version, check 'eselect rust' output"
-
- if ver_test "${rustc_version}" -lt "${rustc_wanted}" ; then
- eerror "Rust >=${rustc_wanted} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too old"
- elif ver_test "${rustc_version}" -ge "${rustc_toonew}" ; then
- eerror "Rust <${rustc_toonew} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too new"
- else
- einfo "Using rust ${rustc_version} to build"
- fi
-}
-
-pre_build_checks() {
- local M=8192
- # multiply requirements by 1.3 if we are doing x86-multilib
- if use amd64; then
- M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 ))
- fi
- M=$(( $(usex clippy 128 0) + ${M} ))
- M=$(( $(usex miri 128 0) + ${M} ))
- M=$(( $(usex rustfmt 256 0) + ${M} ))
- # add 2G if we compile llvm and 256M per llvm_target
- if ! use system-llvm; then
- M=$(( 2048 + ${M} ))
- local ltarget
- for ltarget in ${ALL_LLVM_TARGETS[@]}; do
- M=$(( $(usex ${ltarget} 256 0) + ${M} ))
- done
- fi
- M=$(( $(usex wasm 256 0) + ${M} ))
- M=$(( $(usex debug 2 1) * ${M} ))
- eshopts_push -s extglob
- if is-flagq '-g?(gdb)?([1-9])'; then
- M=$(( 15 * ${M} / 10 ))
- fi
- eshopts_pop
- M=$(( $(usex system-bootstrap 0 1024) + ${M} ))
- M=$(( $(usex doc 256 0) + ${M} ))
- CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
-}
-
-llvm_check_deps() {
- has_version -r "sys-devel/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]"
-}
-
-# Is LLVM being linked against libc++?
-is_libcxx_linked() {
- local code='#include
-#if defined(_LIBCPP_VERSION)
- HAVE_LIBCXX
-#endif
-'
- local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
- [[ ${out} == *HAVE_LIBCXX* ]]
-}
-
-pkg_pretend() {
- pre_build_checks
-}
-
-pkg_setup() {
- pre_build_checks
- python-any-r1_pkg_setup
-
- export LIBGIT2_NO_PKG_CONFIG=1 #749381
-
- use system-bootstrap && bootstrap_rust_version_check
-
- if use system-llvm; then
- llvm_pkg_setup
-
- local llvm_config="$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- export LLVM_LINK_SHARED=1
- export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)"
- fi
-}
-
-esetup_unwind_hack() {
- # https://bugs.gentoo.org/870280
- # this is a hack needed to bootstrap with libgcc_s linked tarball on llvm-libunwind system.
- # it should trigger for internal bootstrap or system-bootstrap with rust-bin.
- # the whole idea is for stage0 to bootstrap with fake libgcc_s.
- # final stage will receive -L${T}/lib but not -lgcc_s args, producing clean compiler.
- local fakelib="${T}/fakelib"
- mkdir -p "${fakelib}" || die
- # we need both symlinks, one for cargo runtime, other for linker.
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so.1" || die
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so" || die
- export LD_LIBRARY_PATH="${fakelib}"
- export RUSTFLAGS+=" -L${fakelib}"
- # this is a literally magic variable that gets through cargo cache, without it some
- # crates ignore RUSTFLAGS.
- # this variable can not contain leading space.
- export MAGIC_EXTRA_RUSTFLAGS+="${MAGIC_EXTRA_RUSTFLAGS:+ }-L${fakelib}"
-}
-
-src_prepare() {
- # this supidity is needed because patch is too large to be in filesdir
- # and if we move it to devspace - it lacks checksum for sig verification
- if [[ "${PV}" == 1.66.1 ]]; then
- sed -i \
- -e 's/516ba32a547b46a8e80ad20d4a17bf24a00bff0b69b74f56df119f770f3dfff6/fc7eb88c2f5104865379128b76767d36ce5b5fdb9f3483e683d150e514ebc3a3/' \
- -e 's/fba10dc8ca9eaf4d481cb82bd1540cf5c05620533c44f917c09a22ea55ef408c/9cc4d1b4511a1f0d91231eb0f11c67ae5e8e38e4becd0bf5eb9e26d043796056/' \
- vendor/rustix/.cargo-checksum.json || die
- else
- die "remove sed mr forgetful maintainer"
- fi
- if ! use system-bootstrap; then
- has_version sys-devel/gcc || esetup_unwind_hack
- local rust_stage0_root="${WORKDIR}"/rust-stage0
- local rust_stage0="rust-${RUST_STAGE0_VERSION}-$(rust_abi)"
-
- "${WORKDIR}/${rust_stage0}"/install.sh --disable-ldconfig \
- --without=rust-docs --destdir="${rust_stage0_root}" --prefix=/ || die
- fi
-
- default
-}
-
-src_configure() {
- filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231
-
- local rust_target="" rust_targets="" arch_cflags
-
- # Collect rust target names to compile standard libs for all ABIs.
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\""
- done
- if use wasm; then
- rust_targets+=",\"wasm32-unknown-unknown\""
- if use system-llvm; then
- # un-hardcode rust-lld linker for this target
- # https://bugs.gentoo.org/715348
- sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die
- fi
- fi
- rust_targets="${rust_targets#,}"
-
- local tools='"cargo"'
- use clippy && tools+=',"clippy"'
- use miri && tools+=',"miri"'
- use profiler && tools+=',"rust-demangler"'
- use rustfmt && tools+=',"rustfmt"'
- use rust-analyzer && tools+=',"rust-analyzer","analysis"'
- use rust-src && tools+=',"src"'
-
- local rust_stage0_root
- if use system-bootstrap; then
- local printsysroot
- printsysroot="$(rustc --print sysroot || die "Can't determine rust's sysroot")"
- rust_stage0_root="${printsysroot}"
- else
- rust_stage0_root="${WORKDIR}"/rust-stage0
- fi
- # in case of prefix it will be already prefixed, as --print sysroot returns full path
- [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory"
-
- rust_target="$(rust_abi)"
-
- local cm_btype="$(usex debug DEBUG RELEASE)"
- cat <<- _EOF_ > "${S}"/config.toml
- changelog-seen = 2
- [llvm]
- download-ci-llvm = false
- optimize = $(toml_usex !debug)
- release-debuginfo = $(toml_usex debug)
- assertions = $(toml_usex debug)
- ninja = true
- targets = "${LLVM_TARGETS// /;}"
- experimental-targets = ""
- link-shared = $(toml_usex system-llvm)
- $(if is_libcxx_linked; then
- # https://bugs.gentoo.org/732632
- echo "use-libcxx = true"
- echo "static-libstdcpp = false"
- fi)
- $(case "${rust_target}" in
- i586-*-linux-*)
- # https://github.com/rust-lang/rust/issues/93059
- echo 'cflags = "-fcf-protection=none"'
- echo 'cxxflags = "-fcf-protection=none"'
- echo 'ldflags = "-fcf-protection=none"'
- ;;
- *)
- ;;
- esac)
- [llvm.build-config]
- CMAKE_VERBOSE_MAKEFILE = "ON"
- CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}"
- CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}"
- CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}"
- [build]
- build-stage = 2
- test-stage = 2
- build = "${rust_target}"
- host = ["${rust_target}"]
- target = [${rust_targets}]
- cargo = "${rust_stage0_root}/bin/cargo"
- rustc = "${rust_stage0_root}/bin/rustc"
- rustfmt = "${rust_stage0_root}/bin/rustfmt"
- docs = $(toml_usex doc)
- compiler-docs = false
- submodules = false
- python = "${EPYTHON}"
- locked-deps = true
- vendor = true
- extended = true
- tools = [${tools}]
- verbose = 2
- sanitizers = false
- profiler = $(toml_usex profiler)
- cargo-native-static = false
- [install]
- prefix = "${EPREFIX}/usr/lib/${PN}/${PV}"
- sysconfdir = "etc"
- docdir = "share/doc/rust"
- bindir = "bin"
- libdir = "lib"
- mandir = "share/man"
- [rust]
- # https://github.com/rust-lang/rust/issues/54872
- codegen-units-std = 1
- optimize = true
- debug = $(toml_usex debug)
- debug-assertions = $(toml_usex debug)
- debug-assertions-std = $(toml_usex debug)
- debuginfo-level = $(usex debug 2 0)
- debuginfo-level-rustc = $(usex debug 2 0)
- debuginfo-level-std = $(usex debug 2 0)
- debuginfo-level-tools = $(usex debug 2 0)
- debuginfo-level-tests = 0
- backtrace = true
- incremental = false
- default-linker = "$(tc-getCC)"
- parallel-compiler = $(toml_usex parallel-compiler)
- channel = "$(usex nightly nightly stable)"
- description = "gentoo"
- rpath = false
- verbose-tests = true
- optimize-tests = $(toml_usex !debug)
- codegen-tests = true
- dist-src = false
- remap-debuginfo = true
- lld = $(usex system-llvm false $(toml_usex wasm))
- # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it
- # https://github.com/rust-lang/rust/issues/74976
- # https://github.com/rust-lang/rust/issues/76526
- deny-warnings = $(usex wasm $(usex doc false true) true)
- backtrace-on-ice = true
- jemalloc = false
- [dist]
- src-tarball = false
- compression-formats = ["xz"]
- _EOF_
-
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_target=$(rust_abi $(get_abi_CHOST ${v##*.}))
- arch_cflags="$(get_abi_CFLAGS ${v##*.})"
-
- export CFLAGS_${rust_target//-/_}="${arch_cflags}"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${rust_target}]
- ar = "$(tc-getAR)"
- cc = "$(tc-getCC)"
- cxx = "$(tc-getCXX)"
- linker = "$(tc-getCC)"
- ranlib = "$(tc-getRANLIB)"
- llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true;
- # but we patch it and set to false here as well
- if use elibc_musl; then
- cat <<- _EOF_ >> "${S}"/config.toml
- crt-static = false
- _EOF_
- fi
- done
- if use wasm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.wasm32-unknown-unknown]
- linker = "$(usex system-llvm lld rust-lld)"
- # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483
- profiler = false
- _EOF_
- fi
-
- if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below
- # experimental cross support
- # discussion: https://bugs.gentoo.org/679878
- # TODO: c*flags, clang, system-llvm, cargo.eclass target support
- # it would be much better if we could split out stdlib
- # complilation to separate ebuild and abuse CATEGORY to
- # just install to /usr/lib/rustlib/
-
- # extra targets defined as a bash array
- # spec format: ::
- # best place would be /etc/portage/env/dev-lang/rust
- # Example:
- # RUST_CROSS_TARGETS=(
- # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu"
- # )
- # no extra hand holding is done, no target transformations, all
- # values are passed as-is with just basic checks, so it's up to user to supply correct values
- # valid rust targets can be obtained with
- # rustc --print target-list
- # matching cross toolchain has to be installed
- # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one)
- # only gcc toolchains installed with crossdev are checked for now.
-
- # BUG: we can't pass host flags to cross compiler, so just filter for now
- # BUG: this should be more fine-grained.
- filter-flags '-mcpu=*' '-march=*' '-mtune=*'
-
- local cross_target_spec
- for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do
- # extracts first element form ::
- local cross_llvm_target="${cross_target_spec%%:*}"
- # extracts toolchain triples, :
- local cross_triples="${cross_target_spec#*:}"
- # extracts first element after before : separator
- local cross_rust_target="${cross_triples%%:*}"
- # extracts last element after : separator
- local cross_toolchain="${cross_triples##*:}"
- use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled"
- command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${cross_rust_target}]
- ar = "${cross_toolchain}-ar"
- cc = "${cross_toolchain}-gcc"
- cxx = "${cross_toolchain}-g++"
- linker = "${cross_toolchain}-gcc"
- ranlib = "${cross_toolchain}-ranlib"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- if [[ "${cross_toolchain}" == *-musl* ]]; then
- cat <<- _EOF_ >> "${S}"/config.toml
- musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr"
- _EOF_
- fi
-
- # append cross target to "normal" target list
- # example 'target = ["powerpc64le-unknown-linux-gnu"]'
- # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]'
-
- rust_targets="${rust_targets},\"${cross_rust_target}\""
- sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die
-
- ewarn
- ewarn "Enabled ${cross_rust_target} rust target"
- ewarn "Using ${cross_toolchain} cross toolchain"
- ewarn
- if ! has_version -b 'sys-devel/binutils[multitarget]' ; then
- ewarn "'sys-devel/binutils[multitarget]' is not installed"
- ewarn "'strip' will be unable to strip cross libraries"
- ewarn "cross targets will be installed with full debug information"
- ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files"
- ewarn
- ewarn "Alternatively llvm-strip can be used, it supports stripping any target"
- ewarn "define STRIP=\"llvm-strip\" to use it (experimental)"
- ewarn
- fi
- done
- fi # I_KNOW_WHAT_I_AM_DOING_CROSS
-
- einfo "Rust configured with the following flags:"
- echo
- echo RUSTFLAGS="\"${RUSTFLAGS}\""
- echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\""
- echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\""
- echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\""
- env | grep "CARGO_TARGET_.*_RUSTFLAGS="
- env | grep "CFLAGS_.*"
- echo
- einfo "config.toml contents:"
- cat "${S}"/config.toml || die
- echo
-}
-
-src_compile() {
- RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-}
-
-src_test() {
- # https://rustc-dev-guide.rust-lang.org/tests/intro.html
-
- # those are basic and codegen tests.
- local tests=(
- codegen
- codegen-units
- compile-fail
- incremental
- mir-opt
- pretty
- run-make
- )
-
- # fails if llvm is not built with ALL targets.
- # and known to fail with system llvm sometimes.
- use system-llvm || tests+=( assembly )
-
- # fragile/expensive/less important tests
- # or tests that require extra builds
- # TODO: instead of skipping, just make some nonfatal.
- if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then
- tests+=(
- rustdoc
- rustdoc-js
- rustdoc-js-std
- rustdoc-ui
- run-make-fulldeps
- ui
- ui-fulldeps
- )
- fi
-
- local i failed=()
- einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}"
- for i in "${tests[@]}"; do
- local t="src/test/${i}"
- einfo "rust_src_test: running ${t}"
- if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \
- -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}"
- then
- failed+=( "${t}" )
- eerror "rust_src_test: ${t} failed"
- fi
- done
-
- if [[ ${#failed[@]} -ne 0 ]]; then
- eerror "rust_src_test: failure summary: ${failed[@]}"
- die "aborting due to test failures"
- fi
-}
-
-src_install() {
- DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-
- # bug #689562, #689160
- rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die
- rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die
- newbashcomp src/tools/cargo/src/etc/cargo.bashcomp.sh cargo
-
- local symlinks=(
- cargo
- rustc
- rustdoc
- rust-gdb
- rust-gdbgui
- rust-lldb
- )
-
- use clippy && symlinks+=( clippy-driver cargo-clippy )
- use miri && symlinks+=( miri cargo-miri )
- use profiler && symlinks+=( rust-demangler )
- use rustfmt && symlinks+=( rustfmt cargo-fmt )
- use rust-analyzer && symlinks+=( rust-analyzer )
-
- einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}"
- local i
- for i in "${symlinks[@]}"; do
- # we need realpath on /usr/bin/* symlink return version-appended binary path.
- # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc-
- # need to fix eselect-rust to remove this hack.
- local ver_i="${i}-${PV}"
- if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then
- einfo "Installing ${i} symlink"
- ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die
- else
- ewarn "${i} symlink requested, but source file not found"
- ewarn "please report this"
- fi
- dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}"
- done
-
- # symlinks to switch components to active rust in eselect
- dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}"
- dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}"
- dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}"
- dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}"
- dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}"
-
- newenvd - "50${P}" <<-_EOF_
- LDPATH="${EPREFIX}/usr/lib/rust/lib"
- MANPATH="${EPREFIX}/usr/lib/rust/man"
- _EOF_
-
- rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die
-
- # note: eselect-rust adds EROOT to all paths below
- cat <<-_EOF_ > "${T}/provider-${P}"
- /usr/bin/cargo
- /usr/bin/rustdoc
- /usr/bin/rust-gdb
- /usr/bin/rust-gdbgui
- /usr/bin/rust-lldb
- /usr/lib/rustlib
- /usr/lib/rust/lib
- /usr/lib/rust/libexec
- /usr/lib/rust/man
- /usr/share/doc/rust
- _EOF_
-
- if use clippy; then
- echo /usr/bin/clippy-driver >> "${T}/provider-${P}"
- echo /usr/bin/cargo-clippy >> "${T}/provider-${P}"
- fi
- if use miri; then
- echo /usr/bin/miri >> "${T}/provider-${P}"
- echo /usr/bin/cargo-miri >> "${T}/provider-${P}"
- fi
- if use profiler; then
- echo /usr/bin/rust-demangler >> "${T}/provider-${P}"
- fi
- if use rustfmt; then
- echo /usr/bin/rustfmt >> "${T}/provider-${P}"
- echo /usr/bin/cargo-fmt >> "${T}/provider-${P}"
- fi
- if use rust-analyzer; then
- echo /usr/bin/rust-analyzer >> "${T}/provider-${P}"
- fi
-
- insinto /etc/env.d/rust
- doins "${T}/provider-${P}"
-
- if use dist; then
- insinto "/usr/lib/${PN}/${PV}/dist"
- doins -r "${S}/build/dist/."
- fi
-}
-
-pkg_postinst() {
- eselect rust update
-
- if has_version dev-debug/gdb || has_version dev-debug/lldb; then
- elog "Rust installs a helper script for calling GDB and LLDB,"
- elog "for your convenience it is installed under /usr/bin/rust-{gdb,lldb}-${PV}."
- fi
-
- if has_version app-editors/emacs; then
- elog "install app-emacs/rust-mode to get emacs support for rust."
- fi
-
- if has_version app-editors/gvim || has_version app-editors/vim; then
- elog "install app-vim/rust-vim to get vim support for rust."
- fi
-}
-
-pkg_postrm() {
- eselect rust cleanup
-}
diff --git a/dev-lang/rust/rust-1.67.1-r1.ebuild b/dev-lang/rust/rust-1.67.1-r1.ebuild
deleted file mode 100644
index c887478cbeda..000000000000
--- a/dev-lang/rust/rust-1.67.1-r1.ebuild
+++ /dev/null
@@ -1,743 +0,0 @@
-# Copyright 1999-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..11} )
-
-inherit bash-completion-r1 check-reqs estack flag-o-matic llvm multiprocessing \
- multilib multilib-build python-any-r1 rust-toolchain toolchain-funcs verify-sig
-
-if [[ ${PV} = *beta* ]]; then
- betaver=${PV//*beta}
- BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
- MY_P="rustc-beta"
- SLOT="beta/${PV}"
- SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz"
-else
- ABI_VER="$(ver_cut 1-2)"
- SLOT="stable/${ABI_VER}"
- MY_P="rustc-${PV}"
- SRC="${MY_P}-src.tar.xz"
- KEYWORDS="~amd64 ~arm ~arm64 ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86"
-fi
-
-RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).1"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="https://www.rust-lang.org/"
-
-SRC_URI="
- https://static.rust-lang.org/dist/${SRC}
- verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc )
- !system-bootstrap? ( $(rust_all_arch_uris rust-${RUST_STAGE0_VERSION}) )
-"
-
-# keep in sync with llvm ebuild of the same version as bundled one.
-ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai Mips MSP430
- NVPTX PowerPC RISCV Sparc SystemZ WebAssembly X86 XCore )
-ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
-LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind miri nightly parallel-compiler profiler rustfmt rust-analyzer rust-src system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"
-
-# Please keep the LLVM dependency block separate. Since LLVM is slotted,
-# we need to *really* make sure we're not pulling more than one slot
-# simultaneously.
-
-# How to use it:
-# List all the working slots in LLVM_VALID_SLOTS, newest first.
-LLVM_VALID_SLOTS=( 15 )
-LLVM_MAX_SLOT="${LLVM_VALID_SLOTS[0]}"
-
-# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation
-# (-) usedep needed because we may build with older llvm without that target
-LLVM_DEPEND="|| ( "
-for _s in ${LLVM_VALID_SLOTS[@]}; do
- LLVM_DEPEND+=" ( "
- for _x in ${ALL_LLVM_TARGETS[@]}; do
- LLVM_DEPEND+="
- ${_x}? ( sys-devel/llvm:${_s}[${_x}(-)] )
- wasm? ( sys-devel/lld:${_s} )"
- done
- LLVM_DEPEND+=" )"
-done
-unset _s _x
-LLVM_DEPEND+=" )
- =sys-devel/gcc-4.7
- >=sys-devel/clang-3.5
- )
- system-bootstrap? ( ${BOOTSTRAP_DEPEND} )
- !system-llvm? (
- >=dev-build/cmake-3.13.4
- app-alternatives/ninja
- )
- test? ( dev-debug/gdb )
- verify-sig? ( sec-keys/openpgp-keys-rust )
-"
-
-DEPEND="
- >=app-arch/xz-utils-5.2
- net-misc/curl:=[http2,ssl]
- sys-libs/zlib:=
- dev-libs/openssl:0=
- system-llvm? (
- ${LLVM_DEPEND}
- llvm-libunwind? ( sys-libs/llvm-libunwind:= )
- )
- !system-llvm? (
- !llvm-libunwind? (
- elibc_musl? ( sys-libs/libunwind:= )
- )
- )
-"
-
-RDEPEND="${DEPEND}
- app-eselect/eselect-rust
- sys-apps/lsb-release
-"
-
-REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )
- miri? ( nightly )
- parallel-compiler? ( nightly )
- rust-analyzer? ( rust-src )
- test? ( ${ALL_LLVM_TARGETS[*]} )
- wasm? ( llvm_targets_WebAssembly )
- x86? ( cpu_flags_x86_sse2 )
-"
-
-# we don't use cmake.eclass, but can get a warning
-CMAKE_WARN_UNUSED_CLI=no
-
-QA_FLAGS_IGNORED="
- usr/lib/${PN}/${PV}/bin/.*
- usr/lib/${PN}/${PV}/libexec/.*
- usr/lib/${PN}/${PV}/lib/lib.*.so
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_SONAME="
- usr/lib/${PN}/${PV}/lib/lib.*.so.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_PRESTRIPPED="
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o
-"
-
-# An rmeta file is custom binary format that contains the metadata for the crate.
-# rmeta files do not support linking, since they do not contain compiled object files.
-# so we can safely silence the warning for this QA check.
-QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta"
-
-# causes double bootstrap
-RESTRICT="test"
-
-VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
-
-PATCHES=(
- "${FILESDIR}"/1.65.0-ignore-broken-and-non-applicable-tests.patch
- "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch
- "${FILESDIR}"/1.67.0-doc-wasm.patch
- "${FILESDIR}"/1.67.1-rustc_expand.patch
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-toml_usex() {
- usex "${1}" true false
-}
-
-bootstrap_rust_version_check() {
- # never call from pkg_pretend. eselect-rust may be not installed yet.
- [[ ${MERGE_TYPE} == binary ]] && return
- local rustc_wanted="$(ver_cut 1).$(($(ver_cut 2) - 1))"
- local rustc_toonew="$(ver_cut 1).$(($(ver_cut 2) + 1))"
- local rustc_version=( $(eselect --brief rust show 2>/dev/null) )
- rustc_version=${rustc_version[0]#rust-bin-}
- rustc_version=${rustc_version#rust-}
-
- [[ -z "${rustc_version}" ]] && die "Failed to determine rust version, check 'eselect rust' output"
-
- if ver_test "${rustc_version}" -lt "${rustc_wanted}" ; then
- eerror "Rust >=${rustc_wanted} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too old"
- elif ver_test "${rustc_version}" -ge "${rustc_toonew}" ; then
- eerror "Rust <${rustc_toonew} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too new"
- else
- einfo "Using rust ${rustc_version} to build"
- fi
-}
-
-pre_build_checks() {
- local M=8192
- # multiply requirements by 1.3 if we are doing x86-multilib
- if use amd64; then
- M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 ))
- fi
- M=$(( $(usex clippy 128 0) + ${M} ))
- M=$(( $(usex miri 128 0) + ${M} ))
- M=$(( $(usex rustfmt 256 0) + ${M} ))
- # add 2G if we compile llvm and 256M per llvm_target
- if ! use system-llvm; then
- M=$(( 2048 + ${M} ))
- local ltarget
- for ltarget in ${ALL_LLVM_TARGETS[@]}; do
- M=$(( $(usex ${ltarget} 256 0) + ${M} ))
- done
- fi
- M=$(( $(usex wasm 256 0) + ${M} ))
- M=$(( $(usex debug 2 1) * ${M} ))
- eshopts_push -s extglob
- if is-flagq '-g?(gdb)?([1-9])'; then
- M=$(( 15 * ${M} / 10 ))
- fi
- eshopts_pop
- M=$(( $(usex system-bootstrap 0 1024) + ${M} ))
- M=$(( $(usex doc 256 0) + ${M} ))
- CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
-}
-
-llvm_check_deps() {
- has_version -r "sys-devel/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]"
-}
-
-# Is LLVM being linked against libc++?
-is_libcxx_linked() {
- local code='#include
-#if defined(_LIBCPP_VERSION)
- HAVE_LIBCXX
-#endif
-'
- local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
- [[ ${out} == *HAVE_LIBCXX* ]]
-}
-
-pkg_pretend() {
- pre_build_checks
-}
-
-pkg_setup() {
- pre_build_checks
- python-any-r1_pkg_setup
-
- export LIBGIT2_NO_PKG_CONFIG=1 #749381
-
- use system-bootstrap && bootstrap_rust_version_check
-
- if use system-llvm; then
- llvm_pkg_setup
-
- local llvm_config="$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- export LLVM_LINK_SHARED=1
- export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)"
- fi
-}
-
-esetup_unwind_hack() {
- # https://bugs.gentoo.org/870280
- # this is a hack needed to bootstrap with libgcc_s linked tarball on llvm-libunwind system.
- # it should trigger for internal bootstrap or system-bootstrap with rust-bin.
- # the whole idea is for stage0 to bootstrap with fake libgcc_s.
- # final stage will receive -L${T}/lib but not -lgcc_s args, producing clean compiler.
- local fakelib="${T}/fakelib"
- mkdir -p "${fakelib}" || die
- # we need both symlinks, one for cargo runtime, other for linker.
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so.1" || die
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so" || die
- export LD_LIBRARY_PATH="${fakelib}"
- export RUSTFLAGS+=" -L${fakelib}"
- # this is a literally magic variable that gets through cargo cache, without it some
- # crates ignore RUSTFLAGS.
- # this variable can not contain leading space.
- export MAGIC_EXTRA_RUSTFLAGS+="${MAGIC_EXTRA_RUSTFLAGS:+ }-L${fakelib}"
-}
-
-src_prepare() {
- if ! use system-bootstrap; then
- has_version sys-devel/gcc || esetup_unwind_hack
- local rust_stage0_root="${WORKDIR}"/rust-stage0
- local rust_stage0="rust-${RUST_STAGE0_VERSION}-$(rust_abi)"
-
- "${WORKDIR}/${rust_stage0}"/install.sh --disable-ldconfig \
- --without=rust-docs-json-preview,rust-docs --destdir="${rust_stage0_root}" --prefix=/ || die
- fi
-
- default
-}
-
-src_configure() {
- filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231
-
- local rust_target="" rust_targets="" arch_cflags
-
- # Collect rust target names to compile standard libs for all ABIs.
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\""
- done
- if use wasm; then
- rust_targets+=",\"wasm32-unknown-unknown\""
- if use system-llvm; then
- # un-hardcode rust-lld linker for this target
- # https://bugs.gentoo.org/715348
- sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die
- fi
- fi
- rust_targets="${rust_targets#,}"
-
- local tools='"cargo"'
- use clippy && tools+=',"clippy"'
- use miri && tools+=',"miri"'
- use profiler && tools+=',"rust-demangler"'
- use rustfmt && tools+=',"rustfmt"'
- use rust-analyzer && tools+=',"rust-analyzer","analysis"'
- use rust-src && tools+=',"src"'
-
- local rust_stage0_root
- if use system-bootstrap; then
- local printsysroot
- printsysroot="$(rustc --print sysroot || die "Can't determine rust's sysroot")"
- rust_stage0_root="${printsysroot}"
- else
- rust_stage0_root="${WORKDIR}"/rust-stage0
- fi
- # in case of prefix it will be already prefixed, as --print sysroot returns full path
- [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory"
-
- rust_target="$(rust_abi)"
-
- local cm_btype="$(usex debug DEBUG RELEASE)"
- cat <<- _EOF_ > "${S}"/config.toml
- changelog-seen = 2
- [llvm]
- download-ci-llvm = false
- optimize = $(toml_usex !debug)
- release-debuginfo = $(toml_usex debug)
- assertions = $(toml_usex debug)
- ninja = true
- targets = "${LLVM_TARGETS// /;}"
- experimental-targets = ""
- link-shared = $(toml_usex system-llvm)
- $(if is_libcxx_linked; then
- # https://bugs.gentoo.org/732632
- echo "use-libcxx = true"
- echo "static-libstdcpp = false"
- fi)
- $(case "${rust_target}" in
- i586-*-linux-*)
- # https://github.com/rust-lang/rust/issues/93059
- echo 'cflags = "-fcf-protection=none"'
- echo 'cxxflags = "-fcf-protection=none"'
- echo 'ldflags = "-fcf-protection=none"'
- ;;
- *)
- ;;
- esac)
- [llvm.build-config]
- CMAKE_VERBOSE_MAKEFILE = "ON"
- CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}"
- CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}"
- CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}"
- [build]
- build-stage = 2
- test-stage = 2
- build = "${rust_target}"
- host = ["${rust_target}"]
- target = [${rust_targets}]
- cargo = "${rust_stage0_root}/bin/cargo"
- rustc = "${rust_stage0_root}/bin/rustc"
- rustfmt = "${rust_stage0_root}/bin/rustfmt"
- docs = $(toml_usex doc)
- compiler-docs = false
- submodules = false
- python = "${EPYTHON}"
- locked-deps = true
- vendor = true
- extended = true
- tools = [${tools}]
- verbose = 2
- sanitizers = false
- profiler = $(toml_usex profiler)
- cargo-native-static = false
- [install]
- prefix = "${EPREFIX}/usr/lib/${PN}/${PV}"
- sysconfdir = "etc"
- docdir = "share/doc/rust"
- bindir = "bin"
- libdir = "lib"
- mandir = "share/man"
- [rust]
- # https://github.com/rust-lang/rust/issues/54872
- codegen-units-std = 1
- optimize = true
- debug = $(toml_usex debug)
- debug-assertions = $(toml_usex debug)
- debug-assertions-std = $(toml_usex debug)
- debuginfo-level = $(usex debug 2 0)
- debuginfo-level-rustc = $(usex debug 2 0)
- debuginfo-level-std = $(usex debug 2 0)
- debuginfo-level-tools = $(usex debug 2 0)
- debuginfo-level-tests = 0
- backtrace = true
- incremental = false
- default-linker = "$(tc-getCC)"
- parallel-compiler = $(toml_usex parallel-compiler)
- channel = "$(usex nightly nightly stable)"
- description = "gentoo"
- rpath = false
- verbose-tests = true
- optimize-tests = $(toml_usex !debug)
- codegen-tests = true
- dist-src = false
- remap-debuginfo = true
- lld = $(usex system-llvm false $(toml_usex wasm))
- # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it
- # https://github.com/rust-lang/rust/issues/74976
- # https://github.com/rust-lang/rust/issues/76526
- deny-warnings = $(usex wasm $(usex doc false true) true)
- backtrace-on-ice = true
- jemalloc = false
- [dist]
- src-tarball = false
- compression-formats = ["xz"]
- _EOF_
-
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_target=$(rust_abi $(get_abi_CHOST ${v##*.}))
- arch_cflags="$(get_abi_CFLAGS ${v##*.})"
-
- export CFLAGS_${rust_target//-/_}="${arch_cflags}"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${rust_target}]
- ar = "$(tc-getAR)"
- cc = "$(tc-getCC)"
- cxx = "$(tc-getCXX)"
- linker = "$(tc-getCC)"
- ranlib = "$(tc-getRANLIB)"
- llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true;
- # but we patch it and set to false here as well
- if use elibc_musl; then
- cat <<- _EOF_ >> "${S}"/config.toml
- crt-static = false
- _EOF_
- fi
- done
- if use wasm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.wasm32-unknown-unknown]
- linker = "$(usex system-llvm lld rust-lld)"
- # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483
- profiler = false
- _EOF_
- fi
-
- if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below
- # experimental cross support
- # discussion: https://bugs.gentoo.org/679878
- # TODO: c*flags, clang, system-llvm, cargo.eclass target support
- # it would be much better if we could split out stdlib
- # complilation to separate ebuild and abuse CATEGORY to
- # just install to /usr/lib/rustlib/
-
- # extra targets defined as a bash array
- # spec format: ::
- # best place would be /etc/portage/env/dev-lang/rust
- # Example:
- # RUST_CROSS_TARGETS=(
- # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu"
- # )
- # no extra hand holding is done, no target transformations, all
- # values are passed as-is with just basic checks, so it's up to user to supply correct values
- # valid rust targets can be obtained with
- # rustc --print target-list
- # matching cross toolchain has to be installed
- # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one)
- # only gcc toolchains installed with crossdev are checked for now.
-
- # BUG: we can't pass host flags to cross compiler, so just filter for now
- # BUG: this should be more fine-grained.
- filter-flags '-mcpu=*' '-march=*' '-mtune=*'
-
- local cross_target_spec
- for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do
- # extracts first element form ::
- local cross_llvm_target="${cross_target_spec%%:*}"
- # extracts toolchain triples, :
- local cross_triples="${cross_target_spec#*:}"
- # extracts first element after before : separator
- local cross_rust_target="${cross_triples%%:*}"
- # extracts last element after : separator
- local cross_toolchain="${cross_triples##*:}"
- use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled"
- command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${cross_rust_target}]
- ar = "${cross_toolchain}-ar"
- cc = "${cross_toolchain}-gcc"
- cxx = "${cross_toolchain}-g++"
- linker = "${cross_toolchain}-gcc"
- ranlib = "${cross_toolchain}-ranlib"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- if [[ "${cross_toolchain}" == *-musl* ]]; then
- cat <<- _EOF_ >> "${S}"/config.toml
- musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr"
- _EOF_
- fi
-
- # append cross target to "normal" target list
- # example 'target = ["powerpc64le-unknown-linux-gnu"]'
- # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]'
-
- rust_targets="${rust_targets},\"${cross_rust_target}\""
- sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die
-
- ewarn
- ewarn "Enabled ${cross_rust_target} rust target"
- ewarn "Using ${cross_toolchain} cross toolchain"
- ewarn
- if ! has_version -b 'sys-devel/binutils[multitarget]' ; then
- ewarn "'sys-devel/binutils[multitarget]' is not installed"
- ewarn "'strip' will be unable to strip cross libraries"
- ewarn "cross targets will be installed with full debug information"
- ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files"
- ewarn
- ewarn "Alternatively llvm-strip can be used, it supports stripping any target"
- ewarn "define STRIP=\"llvm-strip\" to use it (experimental)"
- ewarn
- fi
- done
- fi # I_KNOW_WHAT_I_AM_DOING_CROSS
-
- einfo "Rust configured with the following flags:"
- echo
- echo RUSTFLAGS="\"${RUSTFLAGS}\""
- echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\""
- echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\""
- echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\""
- env | grep "CARGO_TARGET_.*_RUSTFLAGS="
- env | grep "CFLAGS_.*"
- echo
- einfo "config.toml contents:"
- cat "${S}"/config.toml || die
- echo
-}
-
-src_compile() {
- RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-}
-
-src_test() {
- # https://rustc-dev-guide.rust-lang.org/tests/intro.html
-
- # those are basic and codegen tests.
- local tests=(
- codegen
- codegen-units
- compile-fail
- incremental
- mir-opt
- pretty
- run-make
- )
-
- # fails if llvm is not built with ALL targets.
- # and known to fail with system llvm sometimes.
- use system-llvm || tests+=( assembly )
-
- # fragile/expensive/less important tests
- # or tests that require extra builds
- # TODO: instead of skipping, just make some nonfatal.
- if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then
- tests+=(
- rustdoc
- rustdoc-js
- rustdoc-js-std
- rustdoc-ui
- run-make-fulldeps
- ui
- ui-fulldeps
- )
- fi
-
- local i failed=()
- einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}"
- for i in "${tests[@]}"; do
- local t="src/test/${i}"
- einfo "rust_src_test: running ${t}"
- if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \
- -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}"
- then
- failed+=( "${t}" )
- eerror "rust_src_test: ${t} failed"
- fi
- done
-
- if [[ ${#failed[@]} -ne 0 ]]; then
- eerror "rust_src_test: failure summary: ${failed[@]}"
- die "aborting due to test failures"
- fi
-}
-
-src_install() {
- DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-
- # bug #689562, #689160
- rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die
- rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die
- newbashcomp src/tools/cargo/src/etc/cargo.bashcomp.sh cargo
-
- local symlinks=(
- cargo
- rustc
- rustdoc
- rust-gdb
- rust-gdbgui
- rust-lldb
- )
-
- use clippy && symlinks+=( clippy-driver cargo-clippy )
- use miri && symlinks+=( miri cargo-miri )
- use profiler && symlinks+=( rust-demangler )
- use rustfmt && symlinks+=( rustfmt cargo-fmt )
- use rust-analyzer && symlinks+=( rust-analyzer )
-
- einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}"
- local i
- for i in "${symlinks[@]}"; do
- # we need realpath on /usr/bin/* symlink return version-appended binary path.
- # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc-
- # need to fix eselect-rust to remove this hack.
- local ver_i="${i}-${PV}"
- if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then
- einfo "Installing ${i} symlink"
- ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die
- else
- ewarn "${i} symlink requested, but source file not found"
- ewarn "please report this"
- fi
- dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}"
- done
-
- # symlinks to switch components to active rust in eselect
- dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}"
- dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}"
- dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}"
- dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}"
- dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}"
-
- newenvd - "50${P}" <<-_EOF_
- LDPATH="${EPREFIX}/usr/lib/rust/lib"
- MANPATH="${EPREFIX}/usr/lib/rust/man"
- _EOF_
-
- rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die
-
- # note: eselect-rust adds EROOT to all paths below
- cat <<-_EOF_ > "${T}/provider-${P}"
- /usr/bin/cargo
- /usr/bin/rustdoc
- /usr/bin/rust-gdb
- /usr/bin/rust-gdbgui
- /usr/bin/rust-lldb
- /usr/lib/rustlib
- /usr/lib/rust/lib
- /usr/lib/rust/libexec
- /usr/lib/rust/man
- /usr/share/doc/rust
- _EOF_
-
- if use clippy; then
- echo /usr/bin/clippy-driver >> "${T}/provider-${P}"
- echo /usr/bin/cargo-clippy >> "${T}/provider-${P}"
- fi
- if use miri; then
- echo /usr/bin/miri >> "${T}/provider-${P}"
- echo /usr/bin/cargo-miri >> "${T}/provider-${P}"
- fi
- if use profiler; then
- echo /usr/bin/rust-demangler >> "${T}/provider-${P}"
- fi
- if use rustfmt; then
- echo /usr/bin/rustfmt >> "${T}/provider-${P}"
- echo /usr/bin/cargo-fmt >> "${T}/provider-${P}"
- fi
- if use rust-analyzer; then
- echo /usr/bin/rust-analyzer >> "${T}/provider-${P}"
- fi
-
- insinto /etc/env.d/rust
- doins "${T}/provider-${P}"
-
- if use dist; then
- insinto "/usr/lib/${PN}/${PV}/dist"
- doins -r "${S}/build/dist/."
- fi
-}
-
-pkg_postinst() {
- eselect rust update
-
- if has_version dev-debug/gdb || has_version dev-debug/lldb; then
- elog "Rust installs a helper script for calling GDB and LLDB,"
- elog "for your convenience it is installed under /usr/bin/rust-{gdb,lldb}-${PV}."
- fi
-
- if has_version app-editors/emacs; then
- elog "install app-emacs/rust-mode to get emacs support for rust."
- fi
-
- if has_version app-editors/gvim || has_version app-editors/vim; then
- elog "install app-vim/rust-vim to get vim support for rust."
- fi
-}
-
-pkg_postrm() {
- eselect rust cleanup
-}
diff --git a/dev-lang/rust/rust-1.68.2.ebuild b/dev-lang/rust/rust-1.68.2.ebuild
deleted file mode 100644
index 70aaa2ddd1e6..000000000000
--- a/dev-lang/rust/rust-1.68.2.ebuild
+++ /dev/null
@@ -1,742 +0,0 @@
-# Copyright 1999-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..11} )
-
-inherit bash-completion-r1 check-reqs estack flag-o-matic llvm multiprocessing \
- multilib multilib-build python-any-r1 rust-toolchain toolchain-funcs verify-sig
-
-if [[ ${PV} = *beta* ]]; then
- betaver=${PV//*beta}
- BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
- MY_P="rustc-beta"
- SLOT="beta/${PV}"
- SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz"
-else
- ABI_VER="$(ver_cut 1-2)"
- SLOT="stable/${ABI_VER}"
- MY_P="rustc-${PV}"
- SRC="${MY_P}-src.tar.xz"
- KEYWORDS="~amd64 ~arm ~arm64 ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86"
-fi
-
-RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).1"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="https://www.rust-lang.org/"
-
-SRC_URI="
- https://static.rust-lang.org/dist/${SRC}
- verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc )
- !system-bootstrap? ( $(rust_all_arch_uris rust-${RUST_STAGE0_VERSION}) )
-"
-
-# keep in sync with llvm ebuild of the same version as bundled one.
-ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai Mips MSP430
- NVPTX PowerPC RISCV Sparc SystemZ WebAssembly X86 XCore )
-ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
-LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind miri nightly parallel-compiler profiler rustfmt rust-analyzer rust-src system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"
-
-# Please keep the LLVM dependency block separate. Since LLVM is slotted,
-# we need to *really* make sure we're not pulling more than one slot
-# simultaneously.
-
-# How to use it:
-# List all the working slots in LLVM_VALID_SLOTS, newest first.
-LLVM_VALID_SLOTS=( 15 )
-LLVM_MAX_SLOT="${LLVM_VALID_SLOTS[0]}"
-
-# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation
-# (-) usedep needed because we may build with older llvm without that target
-LLVM_DEPEND="|| ( "
-for _s in ${LLVM_VALID_SLOTS[@]}; do
- LLVM_DEPEND+=" ( "
- for _x in ${ALL_LLVM_TARGETS[@]}; do
- LLVM_DEPEND+="
- ${_x}? ( sys-devel/llvm:${_s}[${_x}(-)] )
- wasm? ( sys-devel/lld:${_s} )"
- done
- LLVM_DEPEND+=" )"
-done
-unset _s _x
-LLVM_DEPEND+=" )
- =sys-devel/gcc-4.7
- >=sys-devel/clang-3.5
- )
- system-bootstrap? ( ${BOOTSTRAP_DEPEND} )
- !system-llvm? (
- >=dev-build/cmake-3.13.4
- app-alternatives/ninja
- )
- test? ( dev-debug/gdb )
- verify-sig? ( sec-keys/openpgp-keys-rust )
-"
-
-DEPEND="
- >=app-arch/xz-utils-5.2
- net-misc/curl:=[http2,ssl]
- sys-libs/zlib:=
- dev-libs/openssl:0=
- system-llvm? (
- ${LLVM_DEPEND}
- llvm-libunwind? ( sys-libs/llvm-libunwind:= )
- )
- !system-llvm? (
- !llvm-libunwind? (
- elibc_musl? ( sys-libs/libunwind:= )
- )
- )
-"
-
-RDEPEND="${DEPEND}
- app-eselect/eselect-rust
- sys-apps/lsb-release
-"
-
-REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )
- miri? ( nightly )
- parallel-compiler? ( nightly )
- rust-analyzer? ( rust-src )
- test? ( ${ALL_LLVM_TARGETS[*]} )
- wasm? ( llvm_targets_WebAssembly )
- x86? ( cpu_flags_x86_sse2 )
-"
-
-# we don't use cmake.eclass, but can get a warning
-CMAKE_WARN_UNUSED_CLI=no
-
-QA_FLAGS_IGNORED="
- usr/lib/${PN}/${PV}/bin/.*
- usr/lib/${PN}/${PV}/libexec/.*
- usr/lib/${PN}/${PV}/lib/lib.*.so
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_SONAME="
- usr/lib/${PN}/${PV}/lib/lib.*.so.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_PRESTRIPPED="
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o
-"
-
-# An rmeta file is custom binary format that contains the metadata for the crate.
-# rmeta files do not support linking, since they do not contain compiled object files.
-# so we can safely silence the warning for this QA check.
-QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta"
-
-# causes double bootstrap
-RESTRICT="test"
-
-VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
-
-PATCHES=(
- "${FILESDIR}"/1.68.0-ignore-broken-and-non-applicable-tests.patch
- "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch
- "${FILESDIR}"/1.67.0-doc-wasm.patch
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-toml_usex() {
- usex "${1}" true false
-}
-
-bootstrap_rust_version_check() {
- # never call from pkg_pretend. eselect-rust may be not installed yet.
- [[ ${MERGE_TYPE} == binary ]] && return
- local rustc_wanted="$(ver_cut 1).$(($(ver_cut 2) - 1))"
- local rustc_toonew="$(ver_cut 1).$(($(ver_cut 2) + 1))"
- local rustc_version=( $(eselect --brief rust show 2>/dev/null) )
- rustc_version=${rustc_version[0]#rust-bin-}
- rustc_version=${rustc_version#rust-}
-
- [[ -z "${rustc_version}" ]] && die "Failed to determine rust version, check 'eselect rust' output"
-
- if ver_test "${rustc_version}" -lt "${rustc_wanted}" ; then
- eerror "Rust >=${rustc_wanted} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too old"
- elif ver_test "${rustc_version}" -ge "${rustc_toonew}" ; then
- eerror "Rust <${rustc_toonew} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too new"
- else
- einfo "Using rust ${rustc_version} to build"
- fi
-}
-
-pre_build_checks() {
- local M=8192
- # multiply requirements by 1.3 if we are doing x86-multilib
- if use amd64; then
- M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 ))
- fi
- M=$(( $(usex clippy 128 0) + ${M} ))
- M=$(( $(usex miri 128 0) + ${M} ))
- M=$(( $(usex rustfmt 256 0) + ${M} ))
- # add 2G if we compile llvm and 256M per llvm_target
- if ! use system-llvm; then
- M=$(( 2048 + ${M} ))
- local ltarget
- for ltarget in ${ALL_LLVM_TARGETS[@]}; do
- M=$(( $(usex ${ltarget} 256 0) + ${M} ))
- done
- fi
- M=$(( $(usex wasm 256 0) + ${M} ))
- M=$(( $(usex debug 2 1) * ${M} ))
- eshopts_push -s extglob
- if is-flagq '-g?(gdb)?([1-9])'; then
- M=$(( 15 * ${M} / 10 ))
- fi
- eshopts_pop
- M=$(( $(usex system-bootstrap 0 1024) + ${M} ))
- M=$(( $(usex doc 256 0) + ${M} ))
- CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
-}
-
-llvm_check_deps() {
- has_version -r "sys-devel/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]"
-}
-
-# Is LLVM being linked against libc++?
-is_libcxx_linked() {
- local code='#include
-#if defined(_LIBCPP_VERSION)
- HAVE_LIBCXX
-#endif
-'
- local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
- [[ ${out} == *HAVE_LIBCXX* ]]
-}
-
-pkg_pretend() {
- pre_build_checks
-}
-
-pkg_setup() {
- pre_build_checks
- python-any-r1_pkg_setup
-
- export LIBGIT2_NO_PKG_CONFIG=1 #749381
-
- use system-bootstrap && bootstrap_rust_version_check
-
- if use system-llvm; then
- llvm_pkg_setup
-
- local llvm_config="$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- export LLVM_LINK_SHARED=1
- export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)"
- fi
-}
-
-esetup_unwind_hack() {
- # https://bugs.gentoo.org/870280
- # this is a hack needed to bootstrap with libgcc_s linked tarball on llvm-libunwind system.
- # it should trigger for internal bootstrap or system-bootstrap with rust-bin.
- # the whole idea is for stage0 to bootstrap with fake libgcc_s.
- # final stage will receive -L${T}/lib but not -lgcc_s args, producing clean compiler.
- local fakelib="${T}/fakelib"
- mkdir -p "${fakelib}" || die
- # we need both symlinks, one for cargo runtime, other for linker.
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so.1" || die
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so" || die
- export LD_LIBRARY_PATH="${fakelib}"
- export RUSTFLAGS+=" -L${fakelib}"
- # this is a literally magic variable that gets through cargo cache, without it some
- # crates ignore RUSTFLAGS.
- # this variable can not contain leading space.
- export MAGIC_EXTRA_RUSTFLAGS+="${MAGIC_EXTRA_RUSTFLAGS:+ }-L${fakelib}"
-}
-
-src_prepare() {
- if ! use system-bootstrap; then
- has_version sys-devel/gcc || esetup_unwind_hack
- local rust_stage0_root="${WORKDIR}"/rust-stage0
- local rust_stage0="rust-${RUST_STAGE0_VERSION}-$(rust_abi)"
-
- "${WORKDIR}/${rust_stage0}"/install.sh --disable-ldconfig \
- --without=rust-docs-json-preview,rust-docs --destdir="${rust_stage0_root}" --prefix=/ || die
- fi
-
- default
-}
-
-src_configure() {
- filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231
-
- local rust_target="" rust_targets="" arch_cflags
-
- # Collect rust target names to compile standard libs for all ABIs.
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\""
- done
- if use wasm; then
- rust_targets+=",\"wasm32-unknown-unknown\""
- if use system-llvm; then
- # un-hardcode rust-lld linker for this target
- # https://bugs.gentoo.org/715348
- sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die
- fi
- fi
- rust_targets="${rust_targets#,}"
-
- local tools='"cargo"'
- use clippy && tools+=',"clippy"'
- use miri && tools+=',"miri"'
- use profiler && tools+=',"rust-demangler"'
- use rustfmt && tools+=',"rustfmt"'
- use rust-analyzer && tools+=',"rust-analyzer","analysis"'
- use rust-src && tools+=',"src"'
-
- local rust_stage0_root
- if use system-bootstrap; then
- local printsysroot
- printsysroot="$(rustc --print sysroot || die "Can't determine rust's sysroot")"
- rust_stage0_root="${printsysroot}"
- else
- rust_stage0_root="${WORKDIR}"/rust-stage0
- fi
- # in case of prefix it will be already prefixed, as --print sysroot returns full path
- [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory"
-
- rust_target="$(rust_abi)"
-
- local cm_btype="$(usex debug DEBUG RELEASE)"
- cat <<- _EOF_ > "${S}"/config.toml
- changelog-seen = 2
- [llvm]
- download-ci-llvm = false
- optimize = $(toml_usex !debug)
- release-debuginfo = $(toml_usex debug)
- assertions = $(toml_usex debug)
- ninja = true
- targets = "${LLVM_TARGETS// /;}"
- experimental-targets = ""
- link-shared = $(toml_usex system-llvm)
- $(if is_libcxx_linked; then
- # https://bugs.gentoo.org/732632
- echo "use-libcxx = true"
- echo "static-libstdcpp = false"
- fi)
- $(case "${rust_target}" in
- i586-*-linux-*)
- # https://github.com/rust-lang/rust/issues/93059
- echo 'cflags = "-fcf-protection=none"'
- echo 'cxxflags = "-fcf-protection=none"'
- echo 'ldflags = "-fcf-protection=none"'
- ;;
- *)
- ;;
- esac)
- [llvm.build-config]
- CMAKE_VERBOSE_MAKEFILE = "ON"
- CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}"
- CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}"
- CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}"
- [build]
- build-stage = 2
- test-stage = 2
- build = "${rust_target}"
- host = ["${rust_target}"]
- target = [${rust_targets}]
- cargo = "${rust_stage0_root}/bin/cargo"
- rustc = "${rust_stage0_root}/bin/rustc"
- rustfmt = "${rust_stage0_root}/bin/rustfmt"
- docs = $(toml_usex doc)
- compiler-docs = false
- submodules = false
- python = "${EPYTHON}"
- locked-deps = true
- vendor = true
- extended = true
- tools = [${tools}]
- verbose = 2
- sanitizers = false
- profiler = $(toml_usex profiler)
- cargo-native-static = false
- [install]
- prefix = "${EPREFIX}/usr/lib/${PN}/${PV}"
- sysconfdir = "etc"
- docdir = "share/doc/rust"
- bindir = "bin"
- libdir = "lib"
- mandir = "share/man"
- [rust]
- # https://github.com/rust-lang/rust/issues/54872
- codegen-units-std = 1
- optimize = true
- debug = $(toml_usex debug)
- debug-assertions = $(toml_usex debug)
- debug-assertions-std = $(toml_usex debug)
- debuginfo-level = $(usex debug 2 0)
- debuginfo-level-rustc = $(usex debug 2 0)
- debuginfo-level-std = $(usex debug 2 0)
- debuginfo-level-tools = $(usex debug 2 0)
- debuginfo-level-tests = 0
- backtrace = true
- incremental = false
- default-linker = "$(tc-getCC)"
- parallel-compiler = $(toml_usex parallel-compiler)
- channel = "$(usex nightly nightly stable)"
- description = "gentoo"
- rpath = false
- verbose-tests = true
- optimize-tests = $(toml_usex !debug)
- codegen-tests = true
- dist-src = false
- remap-debuginfo = true
- lld = $(usex system-llvm false $(toml_usex wasm))
- # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it
- # https://github.com/rust-lang/rust/issues/74976
- # https://github.com/rust-lang/rust/issues/76526
- deny-warnings = $(usex wasm $(usex doc false true) true)
- backtrace-on-ice = true
- jemalloc = false
- [dist]
- src-tarball = false
- compression-formats = ["xz"]
- _EOF_
-
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_target=$(rust_abi $(get_abi_CHOST ${v##*.}))
- arch_cflags="$(get_abi_CFLAGS ${v##*.})"
-
- export CFLAGS_${rust_target//-/_}="${arch_cflags}"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${rust_target}]
- ar = "$(tc-getAR)"
- cc = "$(tc-getCC)"
- cxx = "$(tc-getCXX)"
- linker = "$(tc-getCC)"
- ranlib = "$(tc-getRANLIB)"
- llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true;
- # but we patch it and set to false here as well
- if use elibc_musl; then
- cat <<- _EOF_ >> "${S}"/config.toml
- crt-static = false
- _EOF_
- fi
- done
- if use wasm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.wasm32-unknown-unknown]
- linker = "$(usex system-llvm lld rust-lld)"
- # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483
- profiler = false
- _EOF_
- fi
-
- if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below
- # experimental cross support
- # discussion: https://bugs.gentoo.org/679878
- # TODO: c*flags, clang, system-llvm, cargo.eclass target support
- # it would be much better if we could split out stdlib
- # complilation to separate ebuild and abuse CATEGORY to
- # just install to /usr/lib/rustlib/
-
- # extra targets defined as a bash array
- # spec format: ::
- # best place would be /etc/portage/env/dev-lang/rust
- # Example:
- # RUST_CROSS_TARGETS=(
- # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu"
- # )
- # no extra hand holding is done, no target transformations, all
- # values are passed as-is with just basic checks, so it's up to user to supply correct values
- # valid rust targets can be obtained with
- # rustc --print target-list
- # matching cross toolchain has to be installed
- # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one)
- # only gcc toolchains installed with crossdev are checked for now.
-
- # BUG: we can't pass host flags to cross compiler, so just filter for now
- # BUG: this should be more fine-grained.
- filter-flags '-mcpu=*' '-march=*' '-mtune=*'
-
- local cross_target_spec
- for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do
- # extracts first element form ::
- local cross_llvm_target="${cross_target_spec%%:*}"
- # extracts toolchain triples, :
- local cross_triples="${cross_target_spec#*:}"
- # extracts first element after before : separator
- local cross_rust_target="${cross_triples%%:*}"
- # extracts last element after : separator
- local cross_toolchain="${cross_triples##*:}"
- use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled"
- command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${cross_rust_target}]
- ar = "${cross_toolchain}-ar"
- cc = "${cross_toolchain}-gcc"
- cxx = "${cross_toolchain}-g++"
- linker = "${cross_toolchain}-gcc"
- ranlib = "${cross_toolchain}-ranlib"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- if [[ "${cross_toolchain}" == *-musl* ]]; then
- cat <<- _EOF_ >> "${S}"/config.toml
- musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr"
- _EOF_
- fi
-
- # append cross target to "normal" target list
- # example 'target = ["powerpc64le-unknown-linux-gnu"]'
- # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]'
-
- rust_targets="${rust_targets},\"${cross_rust_target}\""
- sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die
-
- ewarn
- ewarn "Enabled ${cross_rust_target} rust target"
- ewarn "Using ${cross_toolchain} cross toolchain"
- ewarn
- if ! has_version -b 'sys-devel/binutils[multitarget]' ; then
- ewarn "'sys-devel/binutils[multitarget]' is not installed"
- ewarn "'strip' will be unable to strip cross libraries"
- ewarn "cross targets will be installed with full debug information"
- ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files"
- ewarn
- ewarn "Alternatively llvm-strip can be used, it supports stripping any target"
- ewarn "define STRIP=\"llvm-strip\" to use it (experimental)"
- ewarn
- fi
- done
- fi # I_KNOW_WHAT_I_AM_DOING_CROSS
-
- einfo "Rust configured with the following flags:"
- echo
- echo RUSTFLAGS="\"${RUSTFLAGS}\""
- echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\""
- echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\""
- echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\""
- env | grep "CARGO_TARGET_.*_RUSTFLAGS="
- env | grep "CFLAGS_.*"
- echo
- einfo "config.toml contents:"
- cat "${S}"/config.toml || die
- echo
-}
-
-src_compile() {
- RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-}
-
-src_test() {
- # https://rustc-dev-guide.rust-lang.org/tests/intro.html
-
- # those are basic and codegen tests.
- local tests=(
- codegen
- codegen-units
- compile-fail
- incremental
- mir-opt
- pretty
- run-make
- )
-
- # fails if llvm is not built with ALL targets.
- # and known to fail with system llvm sometimes.
- use system-llvm || tests+=( assembly )
-
- # fragile/expensive/less important tests
- # or tests that require extra builds
- # TODO: instead of skipping, just make some nonfatal.
- if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then
- tests+=(
- rustdoc
- rustdoc-js
- rustdoc-js-std
- rustdoc-ui
- run-make-fulldeps
- ui
- ui-fulldeps
- )
- fi
-
- local i failed=()
- einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}"
- for i in "${tests[@]}"; do
- local t="src/test/${i}"
- einfo "rust_src_test: running ${t}"
- if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \
- -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}"
- then
- failed+=( "${t}" )
- eerror "rust_src_test: ${t} failed"
- fi
- done
-
- if [[ ${#failed[@]} -ne 0 ]]; then
- eerror "rust_src_test: failure summary: ${failed[@]}"
- die "aborting due to test failures"
- fi
-}
-
-src_install() {
- DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-
- # bug #689562, #689160
- rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die
- rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die
- newbashcomp src/tools/cargo/src/etc/cargo.bashcomp.sh cargo
-
- local symlinks=(
- cargo
- rustc
- rustdoc
- rust-gdb
- rust-gdbgui
- rust-lldb
- )
-
- use clippy && symlinks+=( clippy-driver cargo-clippy )
- use miri && symlinks+=( miri cargo-miri )
- use profiler && symlinks+=( rust-demangler )
- use rustfmt && symlinks+=( rustfmt cargo-fmt )
- use rust-analyzer && symlinks+=( rust-analyzer )
-
- einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}"
- local i
- for i in "${symlinks[@]}"; do
- # we need realpath on /usr/bin/* symlink return version-appended binary path.
- # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc-
- # need to fix eselect-rust to remove this hack.
- local ver_i="${i}-${PV}"
- if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then
- einfo "Installing ${i} symlink"
- ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die
- else
- ewarn "${i} symlink requested, but source file not found"
- ewarn "please report this"
- fi
- dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}"
- done
-
- # symlinks to switch components to active rust in eselect
- dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}"
- dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}"
- dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}"
- dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}"
- dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}"
-
- newenvd - "50${P}" <<-_EOF_
- LDPATH="${EPREFIX}/usr/lib/rust/lib"
- MANPATH="${EPREFIX}/usr/lib/rust/man"
- _EOF_
-
- rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die
-
- # note: eselect-rust adds EROOT to all paths below
- cat <<-_EOF_ > "${T}/provider-${P}"
- /usr/bin/cargo
- /usr/bin/rustdoc
- /usr/bin/rust-gdb
- /usr/bin/rust-gdbgui
- /usr/bin/rust-lldb
- /usr/lib/rustlib
- /usr/lib/rust/lib
- /usr/lib/rust/libexec
- /usr/lib/rust/man
- /usr/share/doc/rust
- _EOF_
-
- if use clippy; then
- echo /usr/bin/clippy-driver >> "${T}/provider-${P}"
- echo /usr/bin/cargo-clippy >> "${T}/provider-${P}"
- fi
- if use miri; then
- echo /usr/bin/miri >> "${T}/provider-${P}"
- echo /usr/bin/cargo-miri >> "${T}/provider-${P}"
- fi
- if use profiler; then
- echo /usr/bin/rust-demangler >> "${T}/provider-${P}"
- fi
- if use rustfmt; then
- echo /usr/bin/rustfmt >> "${T}/provider-${P}"
- echo /usr/bin/cargo-fmt >> "${T}/provider-${P}"
- fi
- if use rust-analyzer; then
- echo /usr/bin/rust-analyzer >> "${T}/provider-${P}"
- fi
-
- insinto /etc/env.d/rust
- doins "${T}/provider-${P}"
-
- if use dist; then
- insinto "/usr/lib/${PN}/${PV}/dist"
- doins -r "${S}/build/dist/."
- fi
-}
-
-pkg_postinst() {
- eselect rust update
-
- if has_version dev-debug/gdb || has_version dev-debug/lldb; then
- elog "Rust installs a helper script for calling GDB and LLDB,"
- elog "for your convenience it is installed under /usr/bin/rust-{gdb,lldb}-${PV}."
- fi
-
- if has_version app-editors/emacs; then
- elog "install app-emacs/rust-mode to get emacs support for rust."
- fi
-
- if has_version app-editors/gvim || has_version app-editors/vim; then
- elog "install app-vim/rust-vim to get vim support for rust."
- fi
-}
-
-pkg_postrm() {
- eselect rust cleanup
-}
diff --git a/dev-lang/rust/rust-1.69.0-r1.ebuild b/dev-lang/rust/rust-1.69.0-r1.ebuild
deleted file mode 100644
index 4fdb4ca0f359..000000000000
--- a/dev-lang/rust/rust-1.69.0-r1.ebuild
+++ /dev/null
@@ -1,743 +0,0 @@
-# Copyright 1999-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..11} )
-
-inherit bash-completion-r1 check-reqs estack flag-o-matic llvm multiprocessing \
- multilib multilib-build python-any-r1 rust-toolchain toolchain-funcs verify-sig
-
-if [[ ${PV} = *beta* ]]; then
- betaver=${PV//*beta}
- BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
- MY_P="rustc-beta"
- SLOT="beta/${PV}"
- SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz"
-else
- ABI_VER="$(ver_cut 1-2)"
- SLOT="stable/${ABI_VER}"
- MY_P="rustc-${PV}"
- SRC="${MY_P}-src.tar.xz"
- KEYWORDS="amd64 arm arm64 ~mips ~ppc ppc64 ~riscv sparc x86"
-fi
-
-RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).2"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="https://www.rust-lang.org/"
-
-SRC_URI="
- https://static.rust-lang.org/dist/${SRC}
- verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc )
- !system-bootstrap? ( $(rust_all_arch_uris rust-${RUST_STAGE0_VERSION}) )
-"
-
-# keep in sync with llvm ebuild of the same version as bundled one.
-ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai Mips MSP430
- NVPTX PowerPC RISCV Sparc SystemZ WebAssembly X86 XCore )
-ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
-LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind miri nightly parallel-compiler profiler rustfmt rust-analyzer rust-src system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"
-
-# Please keep the LLVM dependency block separate. Since LLVM is slotted,
-# we need to *really* make sure we're not pulling more than one slot
-# simultaneously.
-
-# How to use it:
-# List all the working slots in LLVM_VALID_SLOTS, newest first.
-LLVM_VALID_SLOTS=( 15 )
-LLVM_MAX_SLOT="${LLVM_VALID_SLOTS[0]}"
-
-# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation
-# (-) usedep needed because we may build with older llvm without that target
-LLVM_DEPEND="|| ( "
-for _s in ${LLVM_VALID_SLOTS[@]}; do
- LLVM_DEPEND+=" ( "
- for _x in ${ALL_LLVM_TARGETS[@]}; do
- LLVM_DEPEND+="
- ${_x}? ( sys-devel/llvm:${_s}[${_x}(-)] )
- wasm? ( sys-devel/lld:${_s} )"
- done
- LLVM_DEPEND+=" )"
-done
-unset _s _x
-LLVM_DEPEND+=" )
- =sys-devel/gcc-4.7
- >=sys-devel/clang-3.5
- )
- system-bootstrap? ( ${BOOTSTRAP_DEPEND} )
- !system-llvm? (
- >=dev-build/cmake-3.13.4
- app-alternatives/ninja
- )
- test? ( dev-debug/gdb )
- verify-sig? ( sec-keys/openpgp-keys-rust )
-"
-
-DEPEND="
- >=app-arch/xz-utils-5.2
- net-misc/curl:=[http2,ssl]
- sys-libs/zlib:=
- dev-libs/openssl:0=
- system-llvm? (
- ${LLVM_DEPEND}
- llvm-libunwind? ( sys-libs/llvm-libunwind:= )
- )
- !system-llvm? (
- !llvm-libunwind? (
- elibc_musl? ( sys-libs/libunwind:= )
- )
- )
-"
-
-RDEPEND="${DEPEND}
- app-eselect/eselect-rust
- sys-apps/lsb-release
-"
-
-REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )
- miri? ( nightly )
- parallel-compiler? ( nightly )
- rust-analyzer? ( rust-src )
- test? ( ${ALL_LLVM_TARGETS[*]} )
- wasm? ( llvm_targets_WebAssembly )
- x86? ( cpu_flags_x86_sse2 )
-"
-
-# we don't use cmake.eclass, but can get a warning
-CMAKE_WARN_UNUSED_CLI=no
-
-QA_FLAGS_IGNORED="
- usr/lib/${PN}/${PV}/bin/.*
- usr/lib/${PN}/${PV}/libexec/.*
- usr/lib/${PN}/${PV}/lib/lib.*.so
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_SONAME="
- usr/lib/${PN}/${PV}/lib/lib.*.so.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_PRESTRIPPED="
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o
-"
-
-# An rmeta file is custom binary format that contains the metadata for the crate.
-# rmeta files do not support linking, since they do not contain compiled object files.
-# so we can safely silence the warning for this QA check.
-QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta"
-
-# causes double bootstrap
-RESTRICT="test"
-
-VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
-
-PATCHES=(
- "${FILESDIR}"/1.68.0-ignore-broken-and-non-applicable-tests.patch
- "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch
- "${FILESDIR}"/1.67.0-doc-wasm.patch
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-toml_usex() {
- usex "${1}" true false
-}
-
-bootstrap_rust_version_check() {
- # never call from pkg_pretend. eselect-rust may be not installed yet.
- [[ ${MERGE_TYPE} == binary ]] && return
- local rustc_wanted="$(ver_cut 1).$(($(ver_cut 2) - 1))"
- local rustc_toonew="$(ver_cut 1).$(($(ver_cut 2) + 1))"
- local rustc_version=( $(eselect --brief rust show 2>/dev/null) )
- rustc_version=${rustc_version[0]#rust-bin-}
- rustc_version=${rustc_version#rust-}
-
- [[ -z "${rustc_version}" ]] && die "Failed to determine rust version, check 'eselect rust' output"
-
- if ver_test "${rustc_version}" -lt "${rustc_wanted}" ; then
- eerror "Rust >=${rustc_wanted} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too old"
- elif ver_test "${rustc_version}" -ge "${rustc_toonew}" ; then
- eerror "Rust <${rustc_toonew} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too new"
- else
- einfo "Using rust ${rustc_version} to build"
- fi
-}
-
-pre_build_checks() {
- local M=8192
- # multiply requirements by 1.3 if we are doing x86-multilib
- if use amd64; then
- M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 ))
- fi
- M=$(( $(usex clippy 128 0) + ${M} ))
- M=$(( $(usex miri 128 0) + ${M} ))
- M=$(( $(usex rustfmt 256 0) + ${M} ))
- # add 2G if we compile llvm and 256M per llvm_target
- if ! use system-llvm; then
- M=$(( 2048 + ${M} ))
- local ltarget
- for ltarget in ${ALL_LLVM_TARGETS[@]}; do
- M=$(( $(usex ${ltarget} 256 0) + ${M} ))
- done
- fi
- M=$(( $(usex wasm 256 0) + ${M} ))
- M=$(( $(usex debug 2 1) * ${M} ))
- eshopts_push -s extglob
- if is-flagq '-g?(gdb)?([1-9])'; then
- M=$(( 15 * ${M} / 10 ))
- fi
- eshopts_pop
- M=$(( $(usex system-bootstrap 0 1024) + ${M} ))
- M=$(( $(usex doc 256 0) + ${M} ))
- CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
-}
-
-llvm_check_deps() {
- has_version -r "sys-devel/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]"
-}
-
-# Is LLVM being linked against libc++?
-is_libcxx_linked() {
- local code='#include
-#if defined(_LIBCPP_VERSION)
- HAVE_LIBCXX
-#endif
-'
- local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
- [[ ${out} == *HAVE_LIBCXX* ]]
-}
-
-pkg_pretend() {
- pre_build_checks
-}
-
-pkg_setup() {
- pre_build_checks
- python-any-r1_pkg_setup
-
- export LIBGIT2_NO_PKG_CONFIG=1 #749381
-
- use system-bootstrap && bootstrap_rust_version_check
-
- if use system-llvm; then
- llvm_pkg_setup
-
- local llvm_config="$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- export LLVM_LINK_SHARED=1
- export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)"
- fi
-}
-
-esetup_unwind_hack() {
- # https://bugs.gentoo.org/870280
- # this is a hack needed to bootstrap with libgcc_s linked tarball on llvm-libunwind system.
- # it should trigger for internal bootstrap or system-bootstrap with rust-bin.
- # the whole idea is for stage0 to bootstrap with fake libgcc_s.
- # final stage will receive -L${T}/lib but not -lgcc_s args, producing clean compiler.
- local fakelib="${T}/fakelib"
- mkdir -p "${fakelib}" || die
- # we need both symlinks, one for cargo runtime, other for linker.
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so.1" || die
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so" || die
- export LD_LIBRARY_PATH="${fakelib}"
- export RUSTFLAGS+=" -L${fakelib}"
- # this is a literally magic variable that gets through cargo cache, without it some
- # crates ignore RUSTFLAGS.
- # this variable can not contain leading space.
- export MAGIC_EXTRA_RUSTFLAGS+="${MAGIC_EXTRA_RUSTFLAGS:+ }-L${fakelib}"
-}
-
-src_prepare() {
- if ! use system-bootstrap; then
- has_version sys-devel/gcc || esetup_unwind_hack
- local rust_stage0_root="${WORKDIR}"/rust-stage0
- local rust_stage0="rust-${RUST_STAGE0_VERSION}-$(rust_abi)"
-
- "${WORKDIR}/${rust_stage0}"/install.sh --disable-ldconfig \
- --without=rust-docs-json-preview,rust-docs --destdir="${rust_stage0_root}" --prefix=/ || die
- fi
-
- default
-}
-
-src_configure() {
- filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231
-
- local rust_target="" rust_targets="" arch_cflags
-
- # Collect rust target names to compile standard libs for all ABIs.
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\""
- done
- if use wasm; then
- rust_targets+=",\"wasm32-unknown-unknown\""
- if use system-llvm; then
- # un-hardcode rust-lld linker for this target
- # https://bugs.gentoo.org/715348
- sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die
- fi
- fi
- rust_targets="${rust_targets#,}"
-
- # cargo and rustdoc are mandatory and should always be included
- local tools='"cargo","rustdoc"'
- use clippy && tools+=',"clippy"'
- use miri && tools+=',"miri"'
- use profiler && tools+=',"rust-demangler"'
- use rustfmt && tools+=',"rustfmt"'
- use rust-analyzer && tools+=',"rust-analyzer"'
- use rust-src && tools+=',"src"'
-
- local rust_stage0_root
- if use system-bootstrap; then
- local printsysroot
- printsysroot="$(rustc --print sysroot || die "Can't determine rust's sysroot")"
- rust_stage0_root="${printsysroot}"
- else
- rust_stage0_root="${WORKDIR}"/rust-stage0
- fi
- # in case of prefix it will be already prefixed, as --print sysroot returns full path
- [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory"
-
- rust_target="$(rust_abi)"
-
- local cm_btype="$(usex debug DEBUG RELEASE)"
- cat <<- _EOF_ > "${S}"/config.toml
- changelog-seen = 2
- [llvm]
- download-ci-llvm = false
- optimize = $(toml_usex !debug)
- release-debuginfo = $(toml_usex debug)
- assertions = $(toml_usex debug)
- ninja = true
- targets = "${LLVM_TARGETS// /;}"
- experimental-targets = ""
- link-shared = $(toml_usex system-llvm)
- $(if is_libcxx_linked; then
- # https://bugs.gentoo.org/732632
- echo "use-libcxx = true"
- echo "static-libstdcpp = false"
- fi)
- $(case "${rust_target}" in
- i586-*-linux-*)
- # https://github.com/rust-lang/rust/issues/93059
- echo 'cflags = "-fcf-protection=none"'
- echo 'cxxflags = "-fcf-protection=none"'
- echo 'ldflags = "-fcf-protection=none"'
- ;;
- *)
- ;;
- esac)
- [llvm.build-config]
- CMAKE_VERBOSE_MAKEFILE = "ON"
- CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}"
- CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}"
- CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}"
- [build]
- build-stage = 2
- test-stage = 2
- build = "${rust_target}"
- host = ["${rust_target}"]
- target = [${rust_targets}]
- cargo = "${rust_stage0_root}/bin/cargo"
- rustc = "${rust_stage0_root}/bin/rustc"
- rustfmt = "${rust_stage0_root}/bin/rustfmt"
- docs = $(toml_usex doc)
- compiler-docs = false
- submodules = false
- python = "${EPYTHON}"
- locked-deps = true
- vendor = true
- extended = true
- tools = [${tools}]
- verbose = 2
- sanitizers = false
- profiler = $(toml_usex profiler)
- cargo-native-static = false
- [install]
- prefix = "${EPREFIX}/usr/lib/${PN}/${PV}"
- sysconfdir = "etc"
- docdir = "share/doc/rust"
- bindir = "bin"
- libdir = "lib"
- mandir = "share/man"
- [rust]
- # https://github.com/rust-lang/rust/issues/54872
- codegen-units-std = 1
- optimize = true
- debug = $(toml_usex debug)
- debug-assertions = $(toml_usex debug)
- debug-assertions-std = $(toml_usex debug)
- debuginfo-level = $(usex debug 2 0)
- debuginfo-level-rustc = $(usex debug 2 0)
- debuginfo-level-std = $(usex debug 2 0)
- debuginfo-level-tools = $(usex debug 2 0)
- debuginfo-level-tests = 0
- backtrace = true
- incremental = false
- default-linker = "$(tc-getCC)"
- parallel-compiler = $(toml_usex parallel-compiler)
- channel = "$(usex nightly nightly stable)"
- description = "gentoo"
- rpath = false
- verbose-tests = true
- optimize-tests = $(toml_usex !debug)
- codegen-tests = true
- dist-src = false
- remap-debuginfo = true
- lld = $(usex system-llvm false $(toml_usex wasm))
- # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it
- # https://github.com/rust-lang/rust/issues/74976
- # https://github.com/rust-lang/rust/issues/76526
- deny-warnings = $(usex wasm $(usex doc false true) true)
- backtrace-on-ice = true
- jemalloc = false
- [dist]
- src-tarball = false
- compression-formats = ["xz"]
- _EOF_
-
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_target=$(rust_abi $(get_abi_CHOST ${v##*.}))
- arch_cflags="$(get_abi_CFLAGS ${v##*.})"
-
- export CFLAGS_${rust_target//-/_}="${arch_cflags}"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${rust_target}]
- ar = "$(tc-getAR)"
- cc = "$(tc-getCC)"
- cxx = "$(tc-getCXX)"
- linker = "$(tc-getCC)"
- ranlib = "$(tc-getRANLIB)"
- llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true;
- # but we patch it and set to false here as well
- if use elibc_musl; then
- cat <<- _EOF_ >> "${S}"/config.toml
- crt-static = false
- _EOF_
- fi
- done
- if use wasm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.wasm32-unknown-unknown]
- linker = "$(usex system-llvm lld rust-lld)"
- # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483
- profiler = false
- _EOF_
- fi
-
- if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below
- # experimental cross support
- # discussion: https://bugs.gentoo.org/679878
- # TODO: c*flags, clang, system-llvm, cargo.eclass target support
- # it would be much better if we could split out stdlib
- # complilation to separate ebuild and abuse CATEGORY to
- # just install to /usr/lib/rustlib/
-
- # extra targets defined as a bash array
- # spec format: ::
- # best place would be /etc/portage/env/dev-lang/rust
- # Example:
- # RUST_CROSS_TARGETS=(
- # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu"
- # )
- # no extra hand holding is done, no target transformations, all
- # values are passed as-is with just basic checks, so it's up to user to supply correct values
- # valid rust targets can be obtained with
- # rustc --print target-list
- # matching cross toolchain has to be installed
- # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one)
- # only gcc toolchains installed with crossdev are checked for now.
-
- # BUG: we can't pass host flags to cross compiler, so just filter for now
- # BUG: this should be more fine-grained.
- filter-flags '-mcpu=*' '-march=*' '-mtune=*'
-
- local cross_target_spec
- for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do
- # extracts first element form ::
- local cross_llvm_target="${cross_target_spec%%:*}"
- # extracts toolchain triples, :
- local cross_triples="${cross_target_spec#*:}"
- # extracts first element after before : separator
- local cross_rust_target="${cross_triples%%:*}"
- # extracts last element after : separator
- local cross_toolchain="${cross_triples##*:}"
- use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled"
- command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${cross_rust_target}]
- ar = "${cross_toolchain}-ar"
- cc = "${cross_toolchain}-gcc"
- cxx = "${cross_toolchain}-g++"
- linker = "${cross_toolchain}-gcc"
- ranlib = "${cross_toolchain}-ranlib"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- if [[ "${cross_toolchain}" == *-musl* ]]; then
- cat <<- _EOF_ >> "${S}"/config.toml
- musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr"
- _EOF_
- fi
-
- # append cross target to "normal" target list
- # example 'target = ["powerpc64le-unknown-linux-gnu"]'
- # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]'
-
- rust_targets="${rust_targets},\"${cross_rust_target}\""
- sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die
-
- ewarn
- ewarn "Enabled ${cross_rust_target} rust target"
- ewarn "Using ${cross_toolchain} cross toolchain"
- ewarn
- if ! has_version -b 'sys-devel/binutils[multitarget]' ; then
- ewarn "'sys-devel/binutils[multitarget]' is not installed"
- ewarn "'strip' will be unable to strip cross libraries"
- ewarn "cross targets will be installed with full debug information"
- ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files"
- ewarn
- ewarn "Alternatively llvm-strip can be used, it supports stripping any target"
- ewarn "define STRIP=\"llvm-strip\" to use it (experimental)"
- ewarn
- fi
- done
- fi # I_KNOW_WHAT_I_AM_DOING_CROSS
-
- einfo "Rust configured with the following flags:"
- echo
- echo RUSTFLAGS="\"${RUSTFLAGS}\""
- echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\""
- echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\""
- echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\""
- env | grep "CARGO_TARGET_.*_RUSTFLAGS="
- env | grep "CFLAGS_.*"
- echo
- einfo "config.toml contents:"
- cat "${S}"/config.toml || die
- echo
-}
-
-src_compile() {
- RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-}
-
-src_test() {
- # https://rustc-dev-guide.rust-lang.org/tests/intro.html
-
- # those are basic and codegen tests.
- local tests=(
- codegen
- codegen-units
- compile-fail
- incremental
- mir-opt
- pretty
- run-make
- )
-
- # fails if llvm is not built with ALL targets.
- # and known to fail with system llvm sometimes.
- use system-llvm || tests+=( assembly )
-
- # fragile/expensive/less important tests
- # or tests that require extra builds
- # TODO: instead of skipping, just make some nonfatal.
- if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then
- tests+=(
- rustdoc
- rustdoc-js
- rustdoc-js-std
- rustdoc-ui
- run-make-fulldeps
- ui
- ui-fulldeps
- )
- fi
-
- local i failed=()
- einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}"
- for i in "${tests[@]}"; do
- local t="src/test/${i}"
- einfo "rust_src_test: running ${t}"
- if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \
- -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}"
- then
- failed+=( "${t}" )
- eerror "rust_src_test: ${t} failed"
- fi
- done
-
- if [[ ${#failed[@]} -ne 0 ]]; then
- eerror "rust_src_test: failure summary: ${failed[@]}"
- die "aborting due to test failures"
- fi
-}
-
-src_install() {
- DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-
- # bug #689562, #689160
- rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die
- rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die
- newbashcomp src/tools/cargo/src/etc/cargo.bashcomp.sh cargo
-
- local symlinks=(
- cargo
- rustc
- rustdoc
- rust-gdb
- rust-gdbgui
- rust-lldb
- )
-
- use clippy && symlinks+=( clippy-driver cargo-clippy )
- use miri && symlinks+=( miri cargo-miri )
- use profiler && symlinks+=( rust-demangler )
- use rustfmt && symlinks+=( rustfmt cargo-fmt )
- use rust-analyzer && symlinks+=( rust-analyzer )
-
- einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}"
- local i
- for i in "${symlinks[@]}"; do
- # we need realpath on /usr/bin/* symlink return version-appended binary path.
- # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc-
- # need to fix eselect-rust to remove this hack.
- local ver_i="${i}-${PV}"
- if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then
- einfo "Installing ${i} symlink"
- ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die
- else
- ewarn "${i} symlink requested, but source file not found"
- ewarn "please report this"
- fi
- dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}"
- done
-
- # symlinks to switch components to active rust in eselect
- dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}"
- dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}"
- dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}"
- dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}"
- dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}"
-
- newenvd - "50${P}" <<-_EOF_
- LDPATH="${EPREFIX}/usr/lib/rust/lib"
- MANPATH="${EPREFIX}/usr/lib/rust/man"
- _EOF_
-
- rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die
-
- # note: eselect-rust adds EROOT to all paths below
- cat <<-_EOF_ > "${T}/provider-${P}"
- /usr/bin/cargo
- /usr/bin/rustdoc
- /usr/bin/rust-gdb
- /usr/bin/rust-gdbgui
- /usr/bin/rust-lldb
- /usr/lib/rustlib
- /usr/lib/rust/lib
- /usr/lib/rust/libexec
- /usr/lib/rust/man
- /usr/share/doc/rust
- _EOF_
-
- if use clippy; then
- echo /usr/bin/clippy-driver >> "${T}/provider-${P}"
- echo /usr/bin/cargo-clippy >> "${T}/provider-${P}"
- fi
- if use miri; then
- echo /usr/bin/miri >> "${T}/provider-${P}"
- echo /usr/bin/cargo-miri >> "${T}/provider-${P}"
- fi
- if use profiler; then
- echo /usr/bin/rust-demangler >> "${T}/provider-${P}"
- fi
- if use rustfmt; then
- echo /usr/bin/rustfmt >> "${T}/provider-${P}"
- echo /usr/bin/cargo-fmt >> "${T}/provider-${P}"
- fi
- if use rust-analyzer; then
- echo /usr/bin/rust-analyzer >> "${T}/provider-${P}"
- fi
-
- insinto /etc/env.d/rust
- doins "${T}/provider-${P}"
-
- if use dist; then
- insinto "/usr/lib/${PN}/${PV}/dist"
- doins -r "${S}/build/dist/."
- fi
-}
-
-pkg_postinst() {
- eselect rust update
-
- if has_version dev-debug/gdb || has_version dev-debug/lldb; then
- elog "Rust installs a helper script for calling GDB and LLDB,"
- elog "for your convenience it is installed under /usr/bin/rust-{gdb,lldb}-${PV}."
- fi
-
- if has_version app-editors/emacs; then
- elog "install app-emacs/rust-mode to get emacs support for rust."
- fi
-
- if has_version app-editors/gvim || has_version app-editors/vim; then
- elog "install app-vim/rust-vim to get vim support for rust."
- fi
-}
-
-pkg_postrm() {
- eselect rust cleanup
-}
diff --git a/dev-lang/rust/rust-1.70.0.ebuild b/dev-lang/rust/rust-1.70.0.ebuild
deleted file mode 100644
index 02c6210203cc..000000000000
--- a/dev-lang/rust/rust-1.70.0.ebuild
+++ /dev/null
@@ -1,746 +0,0 @@
-# Copyright 1999-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..12} )
-
-inherit bash-completion-r1 check-reqs estack flag-o-matic llvm multiprocessing \
- multilib multilib-build python-any-r1 rust-toolchain toolchain-funcs verify-sig
-
-if [[ ${PV} = *beta* ]]; then
- betaver=${PV//*beta}
- BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
- MY_P="rustc-beta"
- SLOT="beta/${PV}"
- SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz"
-else
- ABI_VER="$(ver_cut 1-2)"
- SLOT="stable/${ABI_VER}"
- MY_P="rustc-${PV}"
- SRC="${MY_P}-src.tar.xz"
- KEYWORDS="~amd64 ~arm ~arm64 ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86"
-fi
-
-RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).0"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="https://www.rust-lang.org/"
-
-SRC_URI="
- https://static.rust-lang.org/dist/${SRC}
- verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc )
- !system-bootstrap? ( $(rust_all_arch_uris rust-${RUST_STAGE0_VERSION}) )
-"
-
-# keep in sync with llvm ebuild of the same version as bundled one.
-ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai LoongArch Mips MSP430
- NVPTX PowerPC RISCV Sparc SystemZ VE WebAssembly X86 XCore )
-ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
-LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind +lto miri nightly parallel-compiler profiler rustfmt rust-analyzer rust-src system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"
-
-# Please keep the LLVM dependency block separate. Since LLVM is slotted,
-# we need to *really* make sure we're not pulling more than one slot
-# simultaneously.
-
-# How to use it:
-# List all the working slots in LLVM_VALID_SLOTS, newest first.
-LLVM_VALID_SLOTS=( 16 )
-LLVM_MAX_SLOT="${LLVM_VALID_SLOTS[0]}"
-
-# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation
-# (-) usedep needed because we may build with older llvm without that target
-LLVM_DEPEND="|| ( "
-for _s in ${LLVM_VALID_SLOTS[@]}; do
- LLVM_DEPEND+=" ( "
- for _x in ${ALL_LLVM_TARGETS[@]}; do
- LLVM_DEPEND+="
- ${_x}? ( sys-devel/llvm:${_s}[${_x}(-)] )
- wasm? ( sys-devel/lld:${_s} )"
- done
- LLVM_DEPEND+=" )"
-done
-unset _s _x
-LLVM_DEPEND+=" )
- =sys-devel/gcc-4.7
- >=sys-devel/clang-3.5
- )
- system-bootstrap? ( ${BOOTSTRAP_DEPEND} )
- !system-llvm? (
- >=dev-build/cmake-3.13.4
- app-alternatives/ninja
- )
- test? ( dev-debug/gdb )
- verify-sig? ( sec-keys/openpgp-keys-rust )
-"
-
-DEPEND="
- >=app-arch/xz-utils-5.2
- net-misc/curl:=[http2,ssl]
- sys-libs/zlib:=
- dev-libs/openssl:0=
- system-llvm? (
- ${LLVM_DEPEND}
- llvm-libunwind? ( sys-libs/llvm-libunwind:= )
- )
- !system-llvm? (
- !llvm-libunwind? (
- elibc_musl? ( sys-libs/libunwind:= )
- )
- )
-"
-
-RDEPEND="${DEPEND}
- app-eselect/eselect-rust
- sys-apps/lsb-release
-"
-
-REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )
- miri? ( nightly )
- parallel-compiler? ( nightly )
- rust-analyzer? ( rust-src )
- test? ( ${ALL_LLVM_TARGETS[*]} )
- wasm? ( llvm_targets_WebAssembly )
- x86? ( cpu_flags_x86_sse2 )
-"
-
-# we don't use cmake.eclass, but can get a warning
-CMAKE_WARN_UNUSED_CLI=no
-
-QA_FLAGS_IGNORED="
- usr/lib/${PN}/${PV}/bin/.*
- usr/lib/${PN}/${PV}/libexec/.*
- usr/lib/${PN}/${PV}/lib/lib.*.so
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_SONAME="
- usr/lib/${PN}/${PV}/lib/lib.*.so.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_PRESTRIPPED="
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o
-"
-
-# An rmeta file is custom binary format that contains the metadata for the crate.
-# rmeta files do not support linking, since they do not contain compiled object files.
-# so we can safely silence the warning for this QA check.
-QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta"
-
-# causes double bootstrap
-RESTRICT="test"
-
-VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
-
-PATCHES=(
- "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch
- "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch
- "${FILESDIR}"/1.67.0-doc-wasm.patch
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-toml_usex() {
- usex "${1}" true false
-}
-
-bootstrap_rust_version_check() {
- # never call from pkg_pretend. eselect-rust may be not installed yet.
- [[ ${MERGE_TYPE} == binary ]] && return
- local rustc_wanted="$(ver_cut 1).$(($(ver_cut 2) - 1))"
- local rustc_toonew="$(ver_cut 1).$(($(ver_cut 2) + 1))"
- local rustc_version=( $(eselect --brief rust show 2>/dev/null) )
- rustc_version=${rustc_version[0]#rust-bin-}
- rustc_version=${rustc_version#rust-}
-
- [[ -z "${rustc_version}" ]] && die "Failed to determine rust version, check 'eselect rust' output"
-
- if ver_test "${rustc_version}" -lt "${rustc_wanted}" ; then
- eerror "Rust >=${rustc_wanted} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too old"
- elif ver_test "${rustc_version}" -ge "${rustc_toonew}" ; then
- eerror "Rust <${rustc_toonew} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too new"
- else
- einfo "Using rust ${rustc_version} to build"
- fi
-}
-
-pre_build_checks() {
- local M=8192
- # multiply requirements by 1.3 if we are doing x86-multilib
- if use amd64; then
- M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 ))
- fi
- M=$(( $(usex clippy 128 0) + ${M} ))
- M=$(( $(usex miri 128 0) + ${M} ))
- M=$(( $(usex rustfmt 256 0) + ${M} ))
- # add 2G if we compile llvm and 256M per llvm_target
- if ! use system-llvm; then
- M=$(( 2048 + ${M} ))
- local ltarget
- for ltarget in ${ALL_LLVM_TARGETS[@]}; do
- M=$(( $(usex ${ltarget} 256 0) + ${M} ))
- done
- fi
- M=$(( $(usex wasm 256 0) + ${M} ))
- M=$(( $(usex debug 2 1) * ${M} ))
- eshopts_push -s extglob
- if is-flagq '-g?(gdb)?([1-9])'; then
- M=$(( 15 * ${M} / 10 ))
- fi
- eshopts_pop
- M=$(( $(usex system-bootstrap 0 1024) + ${M} ))
- M=$(( $(usex doc 256 0) + ${M} ))
- CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
-}
-
-llvm_check_deps() {
- has_version -r "sys-devel/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]"
-}
-
-# Is LLVM being linked against libc++?
-is_libcxx_linked() {
- local code='#include
-#if defined(_LIBCPP_VERSION)
- HAVE_LIBCXX
-#endif
-'
- local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
- [[ ${out} == *HAVE_LIBCXX* ]]
-}
-
-pkg_pretend() {
- pre_build_checks
-}
-
-pkg_setup() {
- pre_build_checks
- python-any-r1_pkg_setup
-
- export LIBGIT2_NO_PKG_CONFIG=1 #749381
-
- use system-bootstrap && bootstrap_rust_version_check
-
- if use system-llvm; then
- llvm_pkg_setup
-
- local llvm_config="$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- export LLVM_LINK_SHARED=1
- export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)"
- fi
-}
-
-esetup_unwind_hack() {
- # https://bugs.gentoo.org/870280
- # this is a hack needed to bootstrap with libgcc_s linked tarball on llvm-libunwind system.
- # it should trigger for internal bootstrap or system-bootstrap with rust-bin.
- # the whole idea is for stage0 to bootstrap with fake libgcc_s.
- # final stage will receive -L${T}/lib but not -lgcc_s args, producing clean compiler.
- local fakelib="${T}/fakelib"
- mkdir -p "${fakelib}" || die
- # we need both symlinks, one for cargo runtime, other for linker.
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so.1" || die
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so" || die
- export LD_LIBRARY_PATH="${fakelib}"
- export RUSTFLAGS+=" -L${fakelib}"
- # this is a literally magic variable that gets through cargo cache, without it some
- # crates ignore RUSTFLAGS.
- # this variable can not contain leading space.
- export MAGIC_EXTRA_RUSTFLAGS+="${MAGIC_EXTRA_RUSTFLAGS:+ }-L${fakelib}"
-}
-
-src_prepare() {
- if ! use system-bootstrap; then
- has_version sys-devel/gcc || esetup_unwind_hack
- local rust_stage0_root="${WORKDIR}"/rust-stage0
- local rust_stage0="rust-${RUST_STAGE0_VERSION}-$(rust_abi)"
-
- "${WORKDIR}/${rust_stage0}"/install.sh --disable-ldconfig \
- --without=rust-docs-json-preview,rust-docs --destdir="${rust_stage0_root}" --prefix=/ || die
- fi
-
- default
-}
-
-src_configure() {
- filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231
-
- local rust_target="" rust_targets="" arch_cflags
-
- # Collect rust target names to compile standard libs for all ABIs.
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\""
- done
- if use wasm; then
- rust_targets+=",\"wasm32-unknown-unknown\""
- if use system-llvm; then
- # un-hardcode rust-lld linker for this target
- # https://bugs.gentoo.org/715348
- sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die
- fi
- fi
- rust_targets="${rust_targets#,}"
-
- # cargo and rustdoc are mandatory and should always be included
- local tools='"cargo","rustdoc"'
- use clippy && tools+=',"clippy"'
- use miri && tools+=',"miri"'
- use profiler && tools+=',"rust-demangler"'
- use rustfmt && tools+=',"rustfmt"'
- use rust-analyzer && tools+=',"rust-analyzer"'
- use rust-src && tools+=',"src"'
-
- local rust_stage0_root
- if use system-bootstrap; then
- local printsysroot
- printsysroot="$(rustc --print sysroot || die "Can't determine rust's sysroot")"
- rust_stage0_root="${printsysroot}"
- else
- rust_stage0_root="${WORKDIR}"/rust-stage0
- fi
- # in case of prefix it will be already prefixed, as --print sysroot returns full path
- [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory"
-
- rust_target="$(rust_abi)"
-
- local cm_btype="$(usex debug DEBUG RELEASE)"
- cat <<- _EOF_ > "${S}"/config.toml
- changelog-seen = 2
- [llvm]
- download-ci-llvm = false
- optimize = $(toml_usex !debug)
- release-debuginfo = $(toml_usex debug)
- assertions = $(toml_usex debug)
- ninja = true
- targets = "${LLVM_TARGETS// /;}"
- experimental-targets = ""
- link-shared = $(toml_usex system-llvm)
- $(if is_libcxx_linked; then
- # https://bugs.gentoo.org/732632
- echo "use-libcxx = true"
- echo "static-libstdcpp = false"
- fi)
- $(case "${rust_target}" in
- i586-*-linux-*)
- # https://github.com/rust-lang/rust/issues/93059
- echo 'cflags = "-fcf-protection=none"'
- echo 'cxxflags = "-fcf-protection=none"'
- echo 'ldflags = "-fcf-protection=none"'
- ;;
- *)
- ;;
- esac)
- enable-warnings = false
- [llvm.build-config]
- CMAKE_VERBOSE_MAKEFILE = "ON"
- CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}"
- CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}"
- CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}"
- [build]
- build-stage = 2
- test-stage = 2
- build = "${rust_target}"
- host = ["${rust_target}"]
- target = [${rust_targets}]
- cargo = "${rust_stage0_root}/bin/cargo"
- rustc = "${rust_stage0_root}/bin/rustc"
- rustfmt = "${rust_stage0_root}/bin/rustfmt"
- docs = $(toml_usex doc)
- compiler-docs = false
- submodules = false
- python = "${EPYTHON}"
- locked-deps = true
- vendor = true
- extended = true
- tools = [${tools}]
- verbose = 2
- sanitizers = false
- profiler = $(toml_usex profiler)
- cargo-native-static = false
- [install]
- prefix = "${EPREFIX}/usr/lib/${PN}/${PV}"
- sysconfdir = "etc"
- docdir = "share/doc/rust"
- bindir = "bin"
- libdir = "lib"
- mandir = "share/man"
- [rust]
- # https://github.com/rust-lang/rust/issues/54872
- codegen-units-std = 1
- optimize = true
- debug = $(toml_usex debug)
- debug-assertions = $(toml_usex debug)
- debug-assertions-std = $(toml_usex debug)
- debuginfo-level = $(usex debug 2 0)
- debuginfo-level-rustc = $(usex debug 2 0)
- debuginfo-level-std = $(usex debug 2 0)
- debuginfo-level-tools = $(usex debug 2 0)
- debuginfo-level-tests = 0
- backtrace = true
- incremental = false
- default-linker = "$(tc-getCC)"
- parallel-compiler = $(toml_usex parallel-compiler)
- channel = "$(usex nightly nightly stable)"
- description = "gentoo"
- rpath = false
- verbose-tests = true
- optimize-tests = $(toml_usex !debug)
- codegen-tests = true
- dist-src = false
- remap-debuginfo = true
- lld = $(usex system-llvm false $(toml_usex wasm))
- # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it
- # https://github.com/rust-lang/rust/issues/74976
- # https://github.com/rust-lang/rust/issues/76526
- deny-warnings = $(usex wasm $(usex doc false true) true)
- backtrace-on-ice = true
- jemalloc = false
- lto = "$(usex lto fat off)"
- [dist]
- src-tarball = false
- compression-formats = ["xz"]
- compression-profile = "balanced"
- _EOF_
-
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_target=$(rust_abi $(get_abi_CHOST ${v##*.}))
- arch_cflags="$(get_abi_CFLAGS ${v##*.})"
-
- export CFLAGS_${rust_target//-/_}="${arch_cflags}"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${rust_target}]
- ar = "$(tc-getAR)"
- cc = "$(tc-getCC)"
- cxx = "$(tc-getCXX)"
- linker = "$(tc-getCC)"
- ranlib = "$(tc-getRANLIB)"
- llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true;
- # but we patch it and set to false here as well
- if use elibc_musl; then
- cat <<- _EOF_ >> "${S}"/config.toml
- crt-static = false
- _EOF_
- fi
- done
- if use wasm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.wasm32-unknown-unknown]
- linker = "$(usex system-llvm lld rust-lld)"
- # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483
- profiler = false
- _EOF_
- fi
-
- if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below
- # experimental cross support
- # discussion: https://bugs.gentoo.org/679878
- # TODO: c*flags, clang, system-llvm, cargo.eclass target support
- # it would be much better if we could split out stdlib
- # complilation to separate ebuild and abuse CATEGORY to
- # just install to /usr/lib/rustlib/
-
- # extra targets defined as a bash array
- # spec format: ::
- # best place would be /etc/portage/env/dev-lang/rust
- # Example:
- # RUST_CROSS_TARGETS=(
- # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu"
- # )
- # no extra hand holding is done, no target transformations, all
- # values are passed as-is with just basic checks, so it's up to user to supply correct values
- # valid rust targets can be obtained with
- # rustc --print target-list
- # matching cross toolchain has to be installed
- # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one)
- # only gcc toolchains installed with crossdev are checked for now.
-
- # BUG: we can't pass host flags to cross compiler, so just filter for now
- # BUG: this should be more fine-grained.
- filter-flags '-mcpu=*' '-march=*' '-mtune=*'
-
- local cross_target_spec
- for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do
- # extracts first element form ::
- local cross_llvm_target="${cross_target_spec%%:*}"
- # extracts toolchain triples, :
- local cross_triples="${cross_target_spec#*:}"
- # extracts first element after before : separator
- local cross_rust_target="${cross_triples%%:*}"
- # extracts last element after : separator
- local cross_toolchain="${cross_triples##*:}"
- use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled"
- command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${cross_rust_target}]
- ar = "${cross_toolchain}-ar"
- cc = "${cross_toolchain}-gcc"
- cxx = "${cross_toolchain}-g++"
- linker = "${cross_toolchain}-gcc"
- ranlib = "${cross_toolchain}-ranlib"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- if [[ "${cross_toolchain}" == *-musl* ]]; then
- cat <<- _EOF_ >> "${S}"/config.toml
- musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr"
- _EOF_
- fi
-
- # append cross target to "normal" target list
- # example 'target = ["powerpc64le-unknown-linux-gnu"]'
- # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]'
-
- rust_targets="${rust_targets},\"${cross_rust_target}\""
- sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die
-
- ewarn
- ewarn "Enabled ${cross_rust_target} rust target"
- ewarn "Using ${cross_toolchain} cross toolchain"
- ewarn
- if ! has_version -b 'sys-devel/binutils[multitarget]' ; then
- ewarn "'sys-devel/binutils[multitarget]' is not installed"
- ewarn "'strip' will be unable to strip cross libraries"
- ewarn "cross targets will be installed with full debug information"
- ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files"
- ewarn
- ewarn "Alternatively llvm-strip can be used, it supports stripping any target"
- ewarn "define STRIP=\"llvm-strip\" to use it (experimental)"
- ewarn
- fi
- done
- fi # I_KNOW_WHAT_I_AM_DOING_CROSS
-
- einfo "Rust configured with the following flags:"
- echo
- echo RUSTFLAGS="\"${RUSTFLAGS}\""
- echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\""
- echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\""
- echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\""
- env | grep "CARGO_TARGET_.*_RUSTFLAGS="
- env | grep "CFLAGS_.*"
- echo
- einfo "config.toml contents:"
- cat "${S}"/config.toml || die
- echo
-}
-
-src_compile() {
- RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-}
-
-src_test() {
- # https://rustc-dev-guide.rust-lang.org/tests/intro.html
-
- # those are basic and codegen tests.
- local tests=(
- codegen
- codegen-units
- compile-fail
- incremental
- mir-opt
- pretty
- run-make
- )
-
- # fails if llvm is not built with ALL targets.
- # and known to fail with system llvm sometimes.
- use system-llvm || tests+=( assembly )
-
- # fragile/expensive/less important tests
- # or tests that require extra builds
- # TODO: instead of skipping, just make some nonfatal.
- if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then
- tests+=(
- rustdoc
- rustdoc-js
- rustdoc-js-std
- rustdoc-ui
- run-make-fulldeps
- ui
- ui-fulldeps
- )
- fi
-
- local i failed=()
- einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}"
- for i in "${tests[@]}"; do
- local t="src/test/${i}"
- einfo "rust_src_test: running ${t}"
- if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \
- -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}"
- then
- failed+=( "${t}" )
- eerror "rust_src_test: ${t} failed"
- fi
- done
-
- if [[ ${#failed[@]} -ne 0 ]]; then
- eerror "rust_src_test: failure summary: ${failed[@]}"
- die "aborting due to test failures"
- fi
-}
-
-src_install() {
- DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-
- # bug #689562, #689160
- rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die
- rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die
- newbashcomp src/tools/cargo/src/etc/cargo.bashcomp.sh cargo
-
- local symlinks=(
- cargo
- rustc
- rustdoc
- rust-gdb
- rust-gdbgui
- rust-lldb
- )
-
- use clippy && symlinks+=( clippy-driver cargo-clippy )
- use miri && symlinks+=( miri cargo-miri )
- use profiler && symlinks+=( rust-demangler )
- use rustfmt && symlinks+=( rustfmt cargo-fmt )
- use rust-analyzer && symlinks+=( rust-analyzer )
-
- einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}"
- local i
- for i in "${symlinks[@]}"; do
- # we need realpath on /usr/bin/* symlink return version-appended binary path.
- # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc-
- # need to fix eselect-rust to remove this hack.
- local ver_i="${i}-${PV}"
- if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then
- einfo "Installing ${i} symlink"
- ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die
- else
- ewarn "${i} symlink requested, but source file not found"
- ewarn "please report this"
- fi
- dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}"
- done
-
- # symlinks to switch components to active rust in eselect
- dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}"
- dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}"
- dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}"
- dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}"
- dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}"
-
- newenvd - "50${P}" <<-_EOF_
- LDPATH="${EPREFIX}/usr/lib/rust/lib"
- MANPATH="${EPREFIX}/usr/lib/rust/man"
- _EOF_
-
- rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die
-
- # note: eselect-rust adds EROOT to all paths below
- cat <<-_EOF_ > "${T}/provider-${P}"
- /usr/bin/cargo
- /usr/bin/rustdoc
- /usr/bin/rust-gdb
- /usr/bin/rust-gdbgui
- /usr/bin/rust-lldb
- /usr/lib/rustlib
- /usr/lib/rust/lib
- /usr/lib/rust/libexec
- /usr/lib/rust/man
- /usr/share/doc/rust
- _EOF_
-
- if use clippy; then
- echo /usr/bin/clippy-driver >> "${T}/provider-${P}"
- echo /usr/bin/cargo-clippy >> "${T}/provider-${P}"
- fi
- if use miri; then
- echo /usr/bin/miri >> "${T}/provider-${P}"
- echo /usr/bin/cargo-miri >> "${T}/provider-${P}"
- fi
- if use profiler; then
- echo /usr/bin/rust-demangler >> "${T}/provider-${P}"
- fi
- if use rustfmt; then
- echo /usr/bin/rustfmt >> "${T}/provider-${P}"
- echo /usr/bin/cargo-fmt >> "${T}/provider-${P}"
- fi
- if use rust-analyzer; then
- echo /usr/bin/rust-analyzer >> "${T}/provider-${P}"
- fi
-
- insinto /etc/env.d/rust
- doins "${T}/provider-${P}"
-
- if use dist; then
- insinto "/usr/lib/${PN}/${PV}/dist"
- doins -r "${S}/build/dist/."
- fi
-}
-
-pkg_postinst() {
- eselect rust update
-
- if has_version dev-debug/gdb || has_version dev-debug/lldb; then
- elog "Rust installs a helper script for calling GDB and LLDB,"
- elog "for your convenience it is installed under /usr/bin/rust-{gdb,lldb}-${PV}."
- fi
-
- if has_version app-editors/emacs; then
- elog "install app-emacs/rust-mode to get emacs support for rust."
- fi
-
- if has_version app-editors/gvim || has_version app-editors/vim; then
- elog "install app-vim/rust-vim to get vim support for rust."
- fi
-}
-
-pkg_postrm() {
- eselect rust cleanup
-}
diff --git a/dev-lang/rust/rust-1.72.0-r1.ebuild b/dev-lang/rust/rust-1.72.0-r1.ebuild
deleted file mode 100644
index eae036887f67..000000000000
--- a/dev-lang/rust/rust-1.72.0-r1.ebuild
+++ /dev/null
@@ -1,760 +0,0 @@
-# Copyright 1999-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..12} )
-
-inherit bash-completion-r1 check-reqs estack flag-o-matic llvm multiprocessing \
- multilib multilib-build python-any-r1 rust-toolchain toolchain-funcs verify-sig
-
-if [[ ${PV} = *beta* ]]; then
- betaver=${PV//*beta}
- BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
- MY_P="rustc-beta"
- SLOT="beta/${PV}"
- SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz"
-else
- ABI_VER="$(ver_cut 1-2)"
- SLOT="stable/${ABI_VER}"
- MY_P="rustc-${PV}"
- SRC="${MY_P}-src.tar.xz"
- KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86"
-fi
-
-# Temporarily set to 1.72.0 since it fixed issues in the stdlib that prevented bootstrapping on musl 1.2.4. Set back to
-# normal in 1.73.0.
-RUST_STAGE0_VERSION="${PV}"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="https://www.rust-lang.org/"
-
-SRC_URI="
- https://static.rust-lang.org/dist/${SRC}
- verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc )
- !system-bootstrap? ( $(rust_all_arch_uris rust-${RUST_STAGE0_VERSION}) )
-"
-
-# keep in sync with llvm ebuild of the same version as bundled one.
-ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai LoongArch Mips MSP430
- NVPTX PowerPC RISCV Sparc SystemZ VE WebAssembly X86 XCore )
-ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
-LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind +lto miri nightly parallel-compiler profiler rustfmt rust-analyzer rust-src system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"
-
-# Please keep the LLVM dependency block separate. Since LLVM is slotted,
-# we need to *really* make sure we're not pulling more than one slot
-# simultaneously.
-
-# How to use it:
-# List all the working slots in LLVM_VALID_SLOTS, newest first.
-LLVM_VALID_SLOTS=( 16 )
-LLVM_MAX_SLOT="${LLVM_VALID_SLOTS[0]}"
-
-# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation
-# (-) usedep needed because we may build with older llvm without that target
-LLVM_DEPEND="|| ( "
-for _s in ${LLVM_VALID_SLOTS[@]}; do
- LLVM_DEPEND+=" ( "
- for _x in ${ALL_LLVM_TARGETS[@]}; do
- LLVM_DEPEND+="
- ${_x}? ( sys-devel/llvm:${_s}[${_x}(-)] )
- wasm? ( sys-devel/lld:${_s} )"
- done
- LLVM_DEPEND+=" )"
-done
-unset _s _x
-LLVM_DEPEND+=" )
- =sys-devel/gcc-4.7
- >=sys-devel/clang-3.5
- )
- system-bootstrap? ( ${BOOTSTRAP_DEPEND} )
- !system-llvm? (
- >=dev-build/cmake-3.13.4
- app-alternatives/ninja
- )
- test? ( dev-debug/gdb )
- verify-sig? ( sec-keys/openpgp-keys-rust )
-"
-
-DEPEND="
- >=app-arch/xz-utils-5.2
- net-misc/curl:=[http2,ssl]
- sys-libs/zlib:=
- dev-libs/openssl:0=
- system-llvm? (
- ${LLVM_DEPEND}
- llvm-libunwind? ( sys-libs/llvm-libunwind:= )
- )
- !system-llvm? (
- !llvm-libunwind? (
- elibc_musl? ( sys-libs/libunwind:= )
- )
- )
-"
-
-RDEPEND="${DEPEND}
- app-eselect/eselect-rust
- sys-apps/lsb-release
-"
-
-REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )
- miri? ( nightly )
- parallel-compiler? ( nightly )
- rust-analyzer? ( rust-src )
- test? ( ${ALL_LLVM_TARGETS[*]} )
- wasm? ( llvm_targets_WebAssembly )
- x86? ( cpu_flags_x86_sse2 )
-"
-
-# we don't use cmake.eclass, but can get a warning
-CMAKE_WARN_UNUSED_CLI=no
-
-QA_FLAGS_IGNORED="
- usr/lib/${PN}/${PV}/bin/.*
- usr/lib/${PN}/${PV}/libexec/.*
- usr/lib/${PN}/${PV}/lib/lib.*.so
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_SONAME="
- usr/lib/${PN}/${PV}/lib/lib.*.so.*
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so
-"
-
-QA_PRESTRIPPED="
- usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp
- usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o
-"
-
-# An rmeta file is custom binary format that contains the metadata for the crate.
-# rmeta files do not support linking, since they do not contain compiled object files.
-# so we can safely silence the warning for this QA check.
-QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta"
-
-# causes double bootstrap
-RESTRICT="test"
-
-VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
-
-PATCHES=(
- "${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch
- "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch
- "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch
- "${FILESDIR}"/1.67.0-doc-wasm.patch
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-clear_vendor_checksums() {
- sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die
-}
-
-toml_usex() {
- usex "${1}" true false
-}
-
-bootstrap_rust_version_check() {
- # never call from pkg_pretend. eselect-rust may be not installed yet.
- [[ ${MERGE_TYPE} == binary ]] && return
- local rustc_wanted="$(ver_cut 1).$(($(ver_cut 2) - 1))"
- local rustc_toonew="$(ver_cut 1).$(($(ver_cut 2) + 1))"
- local rustc_version=( $(eselect --brief rust show 2>/dev/null) )
- rustc_version=${rustc_version[0]#rust-bin-}
- rustc_version=${rustc_version#rust-}
-
- [[ -z "${rustc_version}" ]] && die "Failed to determine rust version, check 'eselect rust' output"
-
- if ver_test "${rustc_version}" -lt "${rustc_wanted}" ; then
- eerror "Rust >=${rustc_wanted} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too old"
- elif ver_test "${rustc_version}" -ge "${rustc_toonew}" ; then
- eerror "Rust <${rustc_toonew} is required"
- eerror "please run 'eselect rust' and set correct rust version"
- die "selected rust version is too new"
- else
- einfo "Using rust ${rustc_version} to build"
- fi
-}
-
-pre_build_checks() {
- local M=8192
- # multiply requirements by 1.3 if we are doing x86-multilib
- if use amd64; then
- M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 ))
- fi
- M=$(( $(usex clippy 128 0) + ${M} ))
- M=$(( $(usex miri 128 0) + ${M} ))
- M=$(( $(usex rustfmt 256 0) + ${M} ))
- # add 2G if we compile llvm and 256M per llvm_target
- if ! use system-llvm; then
- M=$(( 2048 + ${M} ))
- local ltarget
- for ltarget in ${ALL_LLVM_TARGETS[@]}; do
- M=$(( $(usex ${ltarget} 256 0) + ${M} ))
- done
- fi
- M=$(( $(usex wasm 256 0) + ${M} ))
- M=$(( $(usex debug 2 1) * ${M} ))
- eshopts_push -s extglob
- if is-flagq '-g?(gdb)?([1-9])'; then
- M=$(( 15 * ${M} / 10 ))
- fi
- eshopts_pop
- M=$(( $(usex system-bootstrap 0 1024) + ${M} ))
- M=$(( $(usex doc 256 0) + ${M} ))
- CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
-}
-
-llvm_check_deps() {
- has_version -r "sys-devel/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]"
-}
-
-# Is LLVM being linked against libc++?
-is_libcxx_linked() {
- local code='#include
-#if defined(_LIBCPP_VERSION)
- HAVE_LIBCXX
-#endif
-'
- local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
- [[ ${out} == *HAVE_LIBCXX* ]]
-}
-
-pkg_pretend() {
- pre_build_checks
-}
-
-pkg_setup() {
- pre_build_checks
- python-any-r1_pkg_setup
-
- export LIBGIT2_NO_PKG_CONFIG=1 #749381
-
- use system-bootstrap && bootstrap_rust_version_check
-
- if use system-llvm; then
- llvm_pkg_setup
-
- local llvm_config="$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- export LLVM_LINK_SHARED=1
- export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)"
- fi
-}
-
-esetup_unwind_hack() {
- # https://bugs.gentoo.org/870280
- # this is a hack needed to bootstrap with libgcc_s linked tarball on llvm-libunwind system.
- # it should trigger for internal bootstrap or system-bootstrap with rust-bin.
- # the whole idea is for stage0 to bootstrap with fake libgcc_s.
- # final stage will receive -L${T}/lib but not -lgcc_s args, producing clean compiler.
- local fakelib="${T}/fakelib"
- mkdir -p "${fakelib}" || die
- # we need both symlinks, one for cargo runtime, other for linker.
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so.1" || die
- ln -s "${ESYSROOT}/usr/lib/libunwind.so" "${fakelib}/libgcc_s.so" || die
- export LD_LIBRARY_PATH="${fakelib}"
- export RUSTFLAGS+=" -L${fakelib}"
- # this is a literally magic variable that gets through cargo cache, without it some
- # crates ignore RUSTFLAGS.
- # this variable can not contain leading space.
- export MAGIC_EXTRA_RUSTFLAGS+="${MAGIC_EXTRA_RUSTFLAGS:+ }-L${fakelib}"
-}
-
-src_prepare() {
- # Clear vendor checksums for crates that we patched to bump libc.
- for i in addr2line-0.20.0 bstr cranelift-jit crossbeam-channel elasticlunr-rs handlebars icu_locid libffi \
- terminal_size tracing-tree; do
- clear_vendor_checksums "${i}"
- done
-
- if ! use system-bootstrap; then
- has_version sys-devel/gcc || esetup_unwind_hack
- local rust_stage0_root="${WORKDIR}"/rust-stage0
- local rust_stage0="rust-${RUST_STAGE0_VERSION}-$(rust_abi)"
-
- "${WORKDIR}/${rust_stage0}"/install.sh --disable-ldconfig \
- --without=rust-docs-json-preview,rust-docs --destdir="${rust_stage0_root}" --prefix=/ || die
- fi
-
- default
-}
-
-src_configure() {
- filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231
-
- local rust_target="" rust_targets="" arch_cflags
-
- # Collect rust target names to compile standard libs for all ABIs.
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\""
- done
- if use wasm; then
- rust_targets+=",\"wasm32-unknown-unknown\""
- if use system-llvm; then
- # un-hardcode rust-lld linker for this target
- # https://bugs.gentoo.org/715348
- sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die
- fi
- fi
- rust_targets="${rust_targets#,}"
-
- # cargo and rustdoc are mandatory and should always be included
- local tools='"cargo","rustdoc"'
- use clippy && tools+=',"clippy"'
- use miri && tools+=',"miri"'
- use profiler && tools+=',"rust-demangler"'
- use rustfmt && tools+=',"rustfmt"'
- use rust-analyzer && tools+=',"rust-analyzer"'
- use rust-src && tools+=',"src"'
-
- local rust_stage0_root
- if use system-bootstrap; then
- local printsysroot
- printsysroot="$(rustc --print sysroot || die "Can't determine rust's sysroot")"
- rust_stage0_root="${printsysroot}"
- else
- rust_stage0_root="${WORKDIR}"/rust-stage0
- fi
- # in case of prefix it will be already prefixed, as --print sysroot returns full path
- [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory"
-
- rust_target="$(rust_abi)"
-
- local cm_btype="$(usex debug DEBUG RELEASE)"
- cat <<- _EOF_ > "${S}"/config.toml
- changelog-seen = 2
- [llvm]
- download-ci-llvm = false
- optimize = $(toml_usex !debug)
- release-debuginfo = $(toml_usex debug)
- assertions = $(toml_usex debug)
- ninja = true
- targets = "${LLVM_TARGETS// /;}"
- experimental-targets = ""
- link-shared = $(toml_usex system-llvm)
- $(if is_libcxx_linked; then
- # https://bugs.gentoo.org/732632
- echo "use-libcxx = true"
- echo "static-libstdcpp = false"
- fi)
- $(case "${rust_target}" in
- i586-*-linux-*)
- # https://github.com/rust-lang/rust/issues/93059
- echo 'cflags = "-fcf-protection=none"'
- echo 'cxxflags = "-fcf-protection=none"'
- echo 'ldflags = "-fcf-protection=none"'
- ;;
- *)
- ;;
- esac)
- enable-warnings = false
- [llvm.build-config]
- CMAKE_VERBOSE_MAKEFILE = "ON"
- CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}"
- CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}"
- CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}"
- CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}"
- [build]
- build-stage = 2
- test-stage = 2
- build = "${rust_target}"
- host = ["${rust_target}"]
- target = [${rust_targets}]
- cargo = "${rust_stage0_root}/bin/cargo"
- rustc = "${rust_stage0_root}/bin/rustc"
- rustfmt = "${rust_stage0_root}/bin/rustfmt"
- docs = $(toml_usex doc)
- compiler-docs = false
- submodules = false
- python = "${EPYTHON}"
- locked-deps = true
- vendor = true
- extended = true
- tools = [${tools}]
- verbose = 2
- sanitizers = false
- profiler = $(toml_usex profiler)
- cargo-native-static = false
- [install]
- prefix = "${EPREFIX}/usr/lib/${PN}/${PV}"
- sysconfdir = "etc"
- docdir = "share/doc/rust"
- bindir = "bin"
- libdir = "lib"
- mandir = "share/man"
- [rust]
- # https://github.com/rust-lang/rust/issues/54872
- codegen-units-std = 1
- optimize = true
- debug = $(toml_usex debug)
- debug-assertions = $(toml_usex debug)
- debug-assertions-std = $(toml_usex debug)
- debuginfo-level = $(usex debug 2 0)
- debuginfo-level-rustc = $(usex debug 2 0)
- debuginfo-level-std = $(usex debug 2 0)
- debuginfo-level-tools = $(usex debug 2 0)
- debuginfo-level-tests = 0
- backtrace = true
- incremental = false
- default-linker = "$(tc-getCC)"
- parallel-compiler = $(toml_usex parallel-compiler)
- channel = "$(usex nightly nightly stable)"
- description = "gentoo"
- rpath = false
- verbose-tests = true
- optimize-tests = $(toml_usex !debug)
- codegen-tests = true
- dist-src = false
- remap-debuginfo = true
- lld = $(usex system-llvm false $(toml_usex wasm))
- # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it
- # https://github.com/rust-lang/rust/issues/74976
- # https://github.com/rust-lang/rust/issues/76526
- deny-warnings = $(usex wasm $(usex doc false true) true)
- backtrace-on-ice = true
- jemalloc = false
- lto = "$(usex lto fat off)"
- [dist]
- src-tarball = false
- compression-formats = ["xz"]
- compression-profile = "balanced"
- _EOF_
-
- for v in $(multilib_get_enabled_abi_pairs); do
- rust_target=$(rust_abi $(get_abi_CHOST ${v##*.}))
- arch_cflags="$(get_abi_CFLAGS ${v##*.})"
-
- export CFLAGS_${rust_target//-/_}="${arch_cflags}"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${rust_target}]
- ar = "$(tc-getAR)"
- cc = "$(tc-getCC)"
- cxx = "$(tc-getCXX)"
- linker = "$(tc-getCC)"
- ranlib = "$(tc-getRANLIB)"
- llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true;
- # but we patch it and set to false here as well
- if use elibc_musl; then
- cat <<- _EOF_ >> "${S}"/config.toml
- crt-static = false
- _EOF_
- fi
- done
- if use wasm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.wasm32-unknown-unknown]
- linker = "$(usex system-llvm lld rust-lld)"
- # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483
- profiler = false
- _EOF_
- fi
-
- if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below
- # experimental cross support
- # discussion: https://bugs.gentoo.org/679878
- # TODO: c*flags, clang, system-llvm, cargo.eclass target support
- # it would be much better if we could split out stdlib
- # complilation to separate ebuild and abuse CATEGORY to
- # just install to /usr/lib/rustlib/
-
- # extra targets defined as a bash array
- # spec format: ::
- # best place would be /etc/portage/env/dev-lang/rust
- # Example:
- # RUST_CROSS_TARGETS=(
- # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu"
- # )
- # no extra hand holding is done, no target transformations, all
- # values are passed as-is with just basic checks, so it's up to user to supply correct values
- # valid rust targets can be obtained with
- # rustc --print target-list
- # matching cross toolchain has to be installed
- # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one)
- # only gcc toolchains installed with crossdev are checked for now.
-
- # BUG: we can't pass host flags to cross compiler, so just filter for now
- # BUG: this should be more fine-grained.
- filter-flags '-mcpu=*' '-march=*' '-mtune=*'
-
- local cross_target_spec
- for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do
- # extracts first element form ::
- local cross_llvm_target="${cross_target_spec%%:*}"
- # extracts toolchain triples, :
- local cross_triples="${cross_target_spec#*:}"
- # extracts first element after before : separator
- local cross_rust_target="${cross_triples%%:*}"
- # extracts last element after : separator
- local cross_toolchain="${cross_triples##*:}"
- use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled"
- command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain"
-
- cat <<- _EOF_ >> "${S}"/config.toml
- [target.${cross_rust_target}]
- ar = "${cross_toolchain}-ar"
- cc = "${cross_toolchain}-gcc"
- cxx = "${cross_toolchain}-g++"
- linker = "${cross_toolchain}-gcc"
- ranlib = "${cross_toolchain}-ranlib"
- _EOF_
- if use system-llvm; then
- cat <<- _EOF_ >> "${S}"/config.toml
- llvm-config = "$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin/llvm-config"
- _EOF_
- fi
- if [[ "${cross_toolchain}" == *-musl* ]]; then
- cat <<- _EOF_ >> "${S}"/config.toml
- musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr"
- _EOF_
- fi
-
- # append cross target to "normal" target list
- # example 'target = ["powerpc64le-unknown-linux-gnu"]'
- # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]'
-
- rust_targets="${rust_targets},\"${cross_rust_target}\""
- sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die
-
- ewarn
- ewarn "Enabled ${cross_rust_target} rust target"
- ewarn "Using ${cross_toolchain} cross toolchain"
- ewarn
- if ! has_version -b 'sys-devel/binutils[multitarget]' ; then
- ewarn "'sys-devel/binutils[multitarget]' is not installed"
- ewarn "'strip' will be unable to strip cross libraries"
- ewarn "cross targets will be installed with full debug information"
- ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files"
- ewarn
- ewarn "Alternatively llvm-strip can be used, it supports stripping any target"
- ewarn "define STRIP=\"llvm-strip\" to use it (experimental)"
- ewarn
- fi
- done
- fi # I_KNOW_WHAT_I_AM_DOING_CROSS
-
- einfo "Rust configured with the following flags:"
- echo
- echo RUSTFLAGS="\"${RUSTFLAGS}\""
- echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\""
- echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\""
- echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\""
- env | grep "CARGO_TARGET_.*_RUSTFLAGS="
- env | grep "CFLAGS_.*"
- echo
- einfo "config.toml contents:"
- cat "${S}"/config.toml || die
- echo
-}
-
-src_compile() {
- RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-}
-
-src_test() {
- # https://rustc-dev-guide.rust-lang.org/tests/intro.html
-
- # those are basic and codegen tests.
- local tests=(
- codegen
- codegen-units
- compile-fail
- incremental
- mir-opt
- pretty
- run-make
- )
-
- # fails if llvm is not built with ALL targets.
- # and known to fail with system llvm sometimes.
- use system-llvm || tests+=( assembly )
-
- # fragile/expensive/less important tests
- # or tests that require extra builds
- # TODO: instead of skipping, just make some nonfatal.
- if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then
- tests+=(
- rustdoc
- rustdoc-js
- rustdoc-js-std
- rustdoc-ui
- run-make-fulldeps
- ui
- ui-fulldeps
- )
- fi
-
- local i failed=()
- einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}"
- for i in "${tests[@]}"; do
- local t="src/test/${i}"
- einfo "rust_src_test: running ${t}"
- if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \
- -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}"
- then
- failed+=( "${t}" )
- eerror "rust_src_test: ${t} failed"
- fi
- done
-
- if [[ ${#failed[@]} -ne 0 ]]; then
- eerror "rust_src_test: failure summary: ${failed[@]}"
- die "aborting due to test failures"
- fi
-}
-
-src_install() {
- DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die
-
- # bug #689562, #689160
- rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die
- rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die
- newbashcomp src/tools/cargo/src/etc/cargo.bashcomp.sh cargo
-
- local symlinks=(
- cargo
- rustc
- rustdoc
- rust-gdb
- rust-gdbgui
- rust-lldb
- )
-
- use clippy && symlinks+=( clippy-driver cargo-clippy )
- use miri && symlinks+=( miri cargo-miri )
- use profiler && symlinks+=( rust-demangler )
- use rustfmt && symlinks+=( rustfmt cargo-fmt )
- use rust-analyzer && symlinks+=( rust-analyzer )
-
- einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}"
- local i
- for i in "${symlinks[@]}"; do
- # we need realpath on /usr/bin/* symlink return version-appended binary path.
- # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc-
- # need to fix eselect-rust to remove this hack.
- local ver_i="${i}-${PV}"
- if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then
- einfo "Installing ${i} symlink"
- ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die
- else
- ewarn "${i} symlink requested, but source file not found"
- ewarn "please report this"
- fi
- dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}"
- done
-
- # symlinks to switch components to active rust in eselect
- dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}"
- dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}"
- dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}"
- dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}"
- dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}"
-
- newenvd - "50${P}" <<-_EOF_
- LDPATH="${EPREFIX}/usr/lib/rust/lib"
- MANPATH="${EPREFIX}/usr/lib/rust/man"
- _EOF_
-
- rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die
- rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die
-
- # note: eselect-rust adds EROOT to all paths below
- cat <<-_EOF_ > "${T}/provider-${P}"
- /usr/bin/cargo
- /usr/bin/rustdoc
- /usr/bin/rust-gdb
- /usr/bin/rust-gdbgui
- /usr/bin/rust-lldb
- /usr/lib/rustlib
- /usr/lib/rust/lib
- /usr/lib/rust/libexec
- /usr/lib/rust/man
- /usr/share/doc/rust
- _EOF_
-
- if use clippy; then
- echo /usr/bin/clippy-driver >> "${T}/provider-${P}"
- echo /usr/bin/cargo-clippy >> "${T}/provider-${P}"
- fi
- if use miri; then
- echo /usr/bin/miri >> "${T}/provider-${P}"
- echo /usr/bin/cargo-miri >> "${T}/provider-${P}"
- fi
- if use profiler; then
- echo /usr/bin/rust-demangler >> "${T}/provider-${P}"
- fi
- if use rustfmt; then
- echo /usr/bin/rustfmt >> "${T}/provider-${P}"
- echo /usr/bin/cargo-fmt >> "${T}/provider-${P}"
- fi
- if use rust-analyzer; then
- echo /usr/bin/rust-analyzer >> "${T}/provider-${P}"
- fi
-
- insinto /etc/env.d/rust
- doins "${T}/provider-${P}"
-
- if use dist; then
- insinto "/usr/lib/${PN}/${PV}/dist"
- doins -r "${S}/build/dist/."
- fi
-}
-
-pkg_postinst() {
- eselect rust update
-
- if has_version dev-debug/gdb || has_version dev-debug/lldb; then
- elog "Rust installs a helper script for calling GDB and LLDB,"
- elog "for your convenience it is installed under /usr/bin/rust-{gdb,lldb}-${PV}."
- fi
-
- if has_version app-editors/emacs; then
- elog "install app-emacs/rust-mode to get emacs support for rust."
- fi
-
- if has_version app-editors/gvim || has_version app-editors/vim; then
- elog "install app-vim/rust-vim to get vim support for rust."
- fi
-}
-
-pkg_postrm() {
- eselect rust cleanup
-}
diff --git a/dev-lang/spidermonkey/Manifest b/dev-lang/spidermonkey/Manifest
index 230420112300..c4dc49bea2e3 100644
--- a/dev-lang/spidermonkey/Manifest
+++ b/dev-lang/spidermonkey/Manifest
@@ -4,8 +4,5 @@ DIST firefox-115.3.1esr.source.tar.xz 515785920 BLAKE2B ad5ec24361e94d9185eed210
DIST firefox-115.7.0esr.source.tar.xz 515513828 BLAKE2B 9cacd9cd7e9b9040f37843645bc6823d72b3b736a3c4dcef7706304ebeda718e36e98962d9d9c000b7507fdfda40bd19ca4c8267573dc623a9507a7f77b17b52 SHA512 d468d8ef117d76e0660c5359c3becf0502354c61bdaaeb4137d86f52b50143abec2ac4578af69afa5670700b57efff1c7323ca23e3339a9eaaa888dee7e8e922
DIST firefox-115esr-patches-06.tar.xz 14944 BLAKE2B e60a8a32f8c5e6d897e8c3e13d291ffab651937505ce258f031e7e75560c9eb89fce4a22c61872d639e6e1d40244e94761baa1660c2d3d02584ad4cc4778946f SHA512 d9ea1a063df287fa651042c90529b1a1b5ebd5a28735c44b5527cc7dd29678c2f8a9204f007db328371ed6af9613ca7215464c00df5e685c3af4296a22139257
DIST firefox-115esr-patches-08.tar.xz 15912 BLAKE2B 3f94deb17920672ad2184e813bd38e390ecaa50bfc6e00973db717bc56a5adb4f096224cc366da525db25aaa3d198d57716bcb765ddc906783532864e23dd8d4 SHA512 4474fbed14b2c4fac03d82f4b37849a69dbdd61fc15f01cefa373eb8a64a692f5a584247acdf7c349ab6965225c3cd47be3fc4523f93db5299680e2a22e94d94
-DIST firefox-91.13.0esr.source.tar.xz 380053584 BLAKE2B 75d0daa512b3a2d41974a0169778be9ef19a100de2bd382add9831860ca93976585a41e760b6a7ec753268fb78f9f61049780fa7961834248bc8157cfdcc2827 SHA512 38b4cc52de21e76d6061e6ba175e1cbfd888a16070aa951f5a44283f2db9d7e94f2504621f0da78feac6e71491a6d0e7038f63dd0ae112dcad700eb02e9aa516
-DIST firefox-91esr-patches-10j.tar.xz 18320 BLAKE2B ec882411eed19bafab8676e3d79f4ae43947bb97c44571c1497bb93a44fcfec99de06ebacbdf8c4944dcecdf949e4f684908d7ce4226cdcec60241e62e75810e SHA512 670a14d852bb74b9074c3fef9310650f71ce1c56314109c49aea02a7a69acc836af60a8beab11da53e21b10a8e6da341fcfa18b68a1dfd33b26978dd63758e9c
DIST spidermonkey-102-patches-05j.tar.xz 4596 BLAKE2B 215b770bbdf17973d7b3fd1df6cee9647459d2b02b0be5bdb289d457e5dbdb06ceac7a3082fc2f5836e991a4ac4486d73330b0276a466b5c528dab226a27829c SHA512 d2b8e32dac87d60a00fd93479dc34d8adab4feec24a38591cebeb4cf271aa2fd964f4dc26e67ebfb127a47bc8f684d50b32b2cff18ed5286701a04a289058185
DIST spidermonkey-115-patches-01.tar.xz 3992 BLAKE2B e97d0cb3edfb885119226f54f22485ed4e8220cd904d3356b87ccc013403f976a042171cf9ca7250bcf3fe3d90996dd80b4104e7d614f95d7bcfcb0e710a8a78 SHA512 cece96f172a09dd0e29f7c2fdbf650cde405b276bc4083956365289f1da4b1d078ccbde760da6553888ddb3c53cf9aded52051db556a2c4ec492fed01dcb03a1
-DIST spidermonkey-91-patches-05j.tar.xz 5964 BLAKE2B 13f09f77bf16bc61b03c9488b7ab521552e179bfb123e390d0883ea4a3f55e87e0a5d5a246f31a9ddc35f212ea84655fe9d4fc364bbdddc1aac421eb28dbe41f SHA512 4d9cf21b712234ff6a18554a010badd756028e6147597040c423f7e27d260e3984938f956d9bc3572557163a144345ed28d9f88e459fc959aaa6fd448f6deab7
diff --git a/dev-lang/spidermonkey/files/spidermonkey-91-known-test-failures.txt b/dev-lang/spidermonkey/files/spidermonkey-91-known-test-failures.txt
deleted file mode 100644
index 448ee25e96bb..000000000000
--- a/dev-lang/spidermonkey/files/spidermonkey-91-known-test-failures.txt
+++ /dev/null
@@ -1,152 +0,0 @@
-non262/Date/15.9.5.7.js
-non262/Date/reset-time-zone-cache-same-offset.js
-non262/Date/time-zone-path.js
-non262/Date/time-zones-historic.js
-non262/Date/time-zones-imported.js
-non262/Date/toString-localized-posix.js
-non262/Date/toString-localized.js
-non262/Intl/Array/toLocaleString-date.js
-non262/Intl/Date/toLocaleDateString_timeZone.js
-non262/Intl/Date/toLocaleString_timeZone.js
-non262/Intl/Date/toLocaleTimeString_timeZone.js
-non262/Intl/DateTimeFormat/day-period-hour-cycle.js
-non262/Intl/DateTimeFormat/extended-time-zone-names.js
-non262/Intl/DateTimeFormat/field-widths.js
-non262/Intl/DateTimeFormat/format.js
-non262/Intl/DateTimeFormat/formatRange-hour-cycle.js
-non262/Intl/DateTimeFormat/formatToParts.js
-non262/Intl/DateTimeFormat/format_timeZone.js
-non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js
-non262/Intl/DateTimeFormat/hourCycle.js
-non262/Intl/DateTimeFormat/implied-script-has-consistent-output.js
-non262/Intl/DateTimeFormat/japanese-gannen-year.js
-non262/Intl/DateTimeFormat/related-year.js
-non262/Intl/DateTimeFormat/timeZone_backward_links.js
-non262/Intl/DateTimeFormat/timeZone_version.js
-non262/Intl/DateTimeFormat/tz-environment-variable.js
-non262/Intl/DisplayNames/calendar.js
-non262/Intl/DisplayNames/dateTimeField.js
-non262/Intl/DisplayNames/language.js
-non262/Intl/DisplayNames/region.js
-non262/Intl/ListFormat/conjunction-type.js
-non262/Intl/Locale/likely-subtags-generated.js
-non262/Intl/Locale/likely-subtags.js
-non262/Intl/NumberFormat/currency-narrow-symbol.js
-non262/Intl/NumberFormat/format.js
-non262/Intl/NumberFormat/notation-compact-long.js
-non262/Intl/available-locales-resolved.js
-non262/Intl/available-locales-supported.js
-test262/built-ins/Date/UTC/fp-evaluation-order.js
-test262/built-ins/RegExp/property-escapes/generated/Alphabetic.js
-test262/built-ins/RegExp/property-escapes/generated/Assigned.js
-test262/built-ins/RegExp/property-escapes/generated/Bidi_Mirrored.js
-test262/built-ins/RegExp/property-escapes/generated/Case_Ignorable.js
-test262/built-ins/RegExp/property-escapes/generated/Cased.js
-test262/built-ins/RegExp/property-escapes/generated/Changes_When_Casefolded.js
-test262/built-ins/RegExp/property-escapes/generated/Changes_When_Casemapped.js
-test262/built-ins/RegExp/property-escapes/generated/Changes_When_Lowercased.js
-test262/built-ins/RegExp/property-escapes/generated/Changes_When_NFKC_Casefolded.js
-test262/built-ins/RegExp/property-escapes/generated/Changes_When_Titlecased.js
-test262/built-ins/RegExp/property-escapes/generated/Changes_When_Uppercased.js
-test262/built-ins/RegExp/property-escapes/generated/Dash.js
-test262/built-ins/RegExp/property-escapes/generated/Default_Ignorable_Code_Point.js
-test262/built-ins/RegExp/property-escapes/generated/Diacritic.js
-test262/built-ins/RegExp/property-escapes/generated/Emoji.js
-test262/built-ins/RegExp/property-escapes/generated/Emoji_Modifier_Base.js
-test262/built-ins/RegExp/property-escapes/generated/Emoji_Presentation.js
-test262/built-ins/RegExp/property-escapes/generated/Extender.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Close_Punctuation.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Currency_Symbol.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Dash_Punctuation.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Format.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Mark.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Symbol.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Number.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Open_Punctuation.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Other.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Unassigned.js
-test262/built-ins/RegExp/property-escapes/generated/General_Category_-_Uppercase_Letter.js
-test262/built-ins/RegExp/property-escapes/generated/Grapheme_Base.js
-test262/built-ins/RegExp/property-escapes/generated/Grapheme_Extend.js
-test262/built-ins/RegExp/property-escapes/generated/ID_Continue.js
-test262/built-ins/RegExp/property-escapes/generated/ID_Start.js
-test262/built-ins/RegExp/property-escapes/generated/Ideographic.js
-test262/built-ins/RegExp/property-escapes/generated/Lowercase.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Ahom.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Balinese.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Brahmi.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Canadian_Aboriginal.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Common.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Cyrillic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Devanagari.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Egyptian_Hieroglyphs.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Ethiopic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Han.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Hiragana.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Inherited.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Kaithi.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Kannada.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Katakana.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Khojki.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Lao.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Latin.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Mongolian.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Tagalog.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Takri.js
-test262/built-ins/RegExp/property-escapes/generated/Script_-_Telugu.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Adlam.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ahom.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Arabic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Balinese.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Brahmi.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Canadian_Aboriginal.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Common.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cyrillic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Devanagari.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Egyptian_Hieroglyphs.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ethiopic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Glagolitic.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inherited.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kaithi.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kannada.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Katakana.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khojki.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lao.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Latin.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mongolian.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nko.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syriac.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagalog.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Takri.js
-test262/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Telugu.js
-test262/built-ins/RegExp/property-escapes/generated/Sentence_Terminal.js
-test262/built-ins/RegExp/property-escapes/generated/Soft_Dotted.js
-test262/built-ins/RegExp/property-escapes/generated/Terminal_Punctuation.js
-test262/built-ins/RegExp/property-escapes/generated/Unified_Ideograph.js
-test262/built-ins/RegExp/property-escapes/generated/Uppercase.js
-test262/built-ins/RegExp/property-escapes/generated/Variation_Selector.js
-test262/built-ins/RegExp/property-escapes/generated/XID_Continue.js
-test262/built-ins/RegExp/property-escapes/generated/XID_Start.js
-test262/intl402/DateTimeFormat/prototype/format/timedatestyle-en.js
-test262/intl402/DateTimeFormat/prototype/formatRange/en-US.js
-test262/intl402/DateTimeFormat/prototype/formatRange/fractionalSecondDigits.js
-test262/intl402/DateTimeFormat/prototype/formatRangeToParts/en-US.js
-test262/intl402/DateTimeFormat/prototype/formatRangeToParts/fractionalSecondDigits.js
-test262/intl402/Locale/prototype/minimize/removing-likely-subtags-first-adds-likely-subtags.js
diff --git a/dev-lang/spidermonkey/spidermonkey-102.15.0.ebuild b/dev-lang/spidermonkey/spidermonkey-102.15.0.ebuild
index f9c13c9b7793..b1ab05478ed6 100644
--- a/dev-lang/spidermonkey/spidermonkey-102.15.0.ebuild
+++ b/dev-lang/spidermonkey/spidermonkey-102.15.0.ebuild
@@ -61,7 +61,7 @@ SRC_URI="${MOZ_SRC_BASE_URI}/source/${MOZ_P}.source.tar.xz -> ${MOZ_P_DISTFILES}
DESCRIPTION="SpiderMonkey is Mozilla's JavaScript engine written in C and C++"
HOMEPAGE="https://spidermonkey.dev https://firefox-source-docs.mozilla.org/js/index.html "
-KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86"
+KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv x86"
SLOT="$(ver_cut 1)"
LICENSE="MPL-2.0"
diff --git a/dev-lang/spidermonkey/spidermonkey-91.13.0-r1.ebuild b/dev-lang/spidermonkey/spidermonkey-91.13.0-r1.ebuild
deleted file mode 100644
index 6fe09813c00e..000000000000
--- a/dev-lang/spidermonkey/spidermonkey-91.13.0-r1.ebuild
+++ /dev/null
@@ -1,455 +0,0 @@
-# Copyright 1999-2023 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="8"
-
-# Patch version
-FIREFOX_PATCHSET="firefox-91esr-patches-10j.tar.xz"
-SPIDERMONKEY_PATCHSET="spidermonkey-91-patches-05j.tar.xz"
-
-LLVM_MAX_SLOT=15
-
-PYTHON_COMPAT=( python3_{9..11} )
-PYTHON_REQ_USE="ssl,xml(+)"
-
-WANT_AUTOCONF="2.1"
-
-inherit autotools check-reqs flag-o-matic llvm multiprocessing prefix python-any-r1 toolchain-funcs
-
-MY_PN="mozjs"
-MY_PV="${PV/_pre*}" # Handle Gentoo pre-releases
-
-MY_MAJOR=$(ver_cut 1)
-
-MOZ_ESR=yes
-
-MOZ_PV=${PV}
-MOZ_PV_SUFFIX=
-if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
- MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
-
- # Convert the ebuild version to the upstream Mozilla version
- MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
- MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
- MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
-fi
-
-if [[ -n ${MOZ_ESR} ]] ; then
- # ESR releases have slightly different version numbers
- MOZ_PV="${MOZ_PV}esr"
-fi
-
-MOZ_PN="firefox"
-MOZ_P="${MOZ_PN}-${MOZ_PV}"
-MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
-MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
-
-MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
-
-if [[ ${PV} == *_rc* ]] ; then
- MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/candidates/${MOZ_PV}-candidates/build${PV##*_rc}"
-fi
-
-PATCH_URIS=(
- https://dev.gentoo.org/~{juippis,polynomial-c,whissi}/mozilla/patchsets/${FIREFOX_PATCHSET}
- https://dev.gentoo.org/~{juippis,polynomial-c,whissi}/mozilla/patchsets/${SPIDERMONKEY_PATCHSET}
-)
-
-SRC_URI="${MOZ_SRC_BASE_URI}/source/${MOZ_P}.source.tar.xz -> ${MOZ_P_DISTFILES}.source.tar.xz
- ${PATCH_URIS[@]}"
-
-DESCRIPTION="SpiderMonkey is Mozilla's JavaScript engine written in C and C++"
-HOMEPAGE="https://spidermonkey.dev https://firefox-source-docs.mozilla.org/js/index.html "
-
-KEYWORDS="amd64 arm arm64 ~mips ppc ppc64 ~riscv sparc x86"
-
-SLOT="91"
-LICENSE="MPL-2.0"
-IUSE="clang cpu_flags_arm_neon debug +jit lto test"
-
-RESTRICT="!test? ( test )"
-
-BDEPEND="${PYTHON_DEPS}
- || (
- (
- sys-devel/llvm:15
- clang? (
- sys-devel/clang:15
- virtual/rust:0/llvm-15
- lto? ( sys-devel/lld:15 )
- )
- )
- (
- sys-devel/llvm:14
- clang? (
- sys-devel/clang:14
- virtual/rust:0/llvm-14
- lto? ( sys-devel/lld:14 )
- )
- )
- )
- !clang? ( virtual/rust )
- virtual/pkgconfig
- test? (
- $(python_gen_any_dep 'dev-python/six[${PYTHON_USEDEP}]')
- )"
-DEPEND=">=dev-libs/icu-69.1:=
- dev-libs/nspr
- sys-libs/readline:0=
- sys-libs/zlib"
-RDEPEND="${DEPEND}"
-
-S="${WORKDIR}/firefox-${MY_PV}/js/src"
-
-llvm_check_deps() {
- if ! has_version -b "sys-devel/llvm:${LLVM_SLOT}" ; then
- einfo "sys-devel/llvm:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
- return 1
- fi
-
- if use clang ; then
- if ! has_version -b "sys-devel/clang:${LLVM_SLOT}" ; then
- einfo "sys-devel/clang:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
- return 1
- fi
-
- if ! has_version -b "virtual/rust:0/llvm-${LLVM_SLOT}" ; then
- einfo "virtual/rust:0/llvm-${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
- return 1
- fi
-
- if use lto ; then
- if ! has_version -b "sys-devel/lld:${LLVM_SLOT}" ; then
- einfo "sys-devel/lld:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
- return 1
- fi
- fi
- fi
-
- einfo "Using LLVM slot ${LLVM_SLOT} to build" >&2
-}
-
-python_check_deps() {
- if use test ; then
- python_has_version "dev-python/six[${PYTHON_USEDEP}]"
- fi
-}
-
-pkg_pretend() {
- if use test ; then
- CHECKREQS_DISK_BUILD="7600M"
- else
- CHECKREQS_DISK_BUILD="6400M"
- fi
-
- check-reqs_pkg_pretend
-}
-
-pkg_setup() {
- if [[ ${MERGE_TYPE} != binary ]] ; then
- if use test ; then
- CHECKREQS_DISK_BUILD="7600M"
- else
- CHECKREQS_DISK_BUILD="6400M"
- fi
-
- check-reqs_pkg_setup
-
- llvm_pkg_setup
-
- if use clang && use lto ; then
- local version_lld=$(ld.lld --version 2>/dev/null | awk '{ print $2 }')
- [[ -n ${version_lld} ]] && version_lld=$(ver_cut 1 "${version_lld}")
- [[ -z ${version_lld} ]] && die "Failed to read ld.lld version!"
-
- local version_llvm_rust=$(rustc -Vv 2>/dev/null | grep -F -- 'LLVM version:' | awk '{ print $3 }')
- [[ -n ${version_llvm_rust} ]] && version_llvm_rust=$(ver_cut 1 "${version_llvm_rust}")
- [[ -z ${version_llvm_rust} ]] && die "Failed to read used LLVM version from rustc!"
-
- if ver_test "${version_lld}" -ne "${version_llvm_rust}" ; then
- eerror "Rust is using LLVM version ${version_llvm_rust} but ld.lld version belongs to LLVM version ${version_lld}."
- eerror "You will be unable to link ${CATEGORY}/${PN}. To proceed you have the following options:"
- eerror " - Manually switch rust version using 'eselect rust' to match used LLVM version"
- eerror " - Switch to dev-lang/rust[system-llvm] which will guarantee matching version"
- eerror " - Build ${CATEGORY}/${PN} without USE=lto"
- eerror " - Rebuild lld with llvm that was used to build rust (may need to rebuild the whole "
- eerror " llvm/clang/lld/rust chain depending on your @world updates)"
- die "LLVM version used by Rust (${version_llvm_rust}) does not match with ld.lld version (${version_lld})!"
- fi
- fi
-
- python-any-r1_pkg_setup
-
- # Build system is using /proc/self/oom_score_adj, bug #604394
- addpredict /proc/self/oom_score_adj
-
- if ! mountpoint -q /dev/shm ; then
- # If /dev/shm is not available, configure is known to fail with
- # a traceback report referencing /usr/lib/pythonN.N/multiprocessing/synchronize.py
- ewarn "/dev/shm is not mounted -- expect build failures!"
- fi
-
- # Ensure we use C locale when building, bug #746215
- export LC_ALL=C
- fi
-}
-
-src_prepare() {
- pushd ../.. &>/dev/null || die
-
- use lto && rm -v "${WORKDIR}"/firefox-patches/*-LTO-Only-enable-LTO-*.patch
-
- eapply "${WORKDIR}"/firefox-patches
- eapply "${WORKDIR}"/spidermonkey-patches
-
- default
-
- # Make cargo respect MAKEOPTS
- export CARGO_BUILD_JOBS="$(makeopts_jobs)"
-
- # sed-in toolchain prefix
- sed -i \
- -e "s/objdump/${CHOST}-objdump/" \
- python/mozbuild/mozbuild/configure/check_debug_ranges.py \
- || die "sed failed to set toolchain prefix"
-
- # use prefix shell in wrapper linker scripts, bug #789660
- hprefixify "${S}"/../../build/cargo-{,host-}linker
-
- einfo "Removing pre-built binaries ..."
- find third_party -type f \( -name '*.so' -o -name '*.o' \) -print -delete || die
-
- MOZJS_BUILDDIR="${WORKDIR}/build"
- mkdir "${MOZJS_BUILDDIR}" || die
-
- popd &>/dev/null || die
- eautoconf
-}
-
-src_configure() {
- # Show flags set at the beginning
- einfo "Current CFLAGS: ${CFLAGS}"
- einfo "Current CXXFLAGS: ${CXXFLAGS}"
- einfo "Current LDFLAGS: ${LDFLAGS}"
- einfo "Current RUSTFLAGS: ${RUSTFLAGS}"
-
- local have_switched_compiler=
- if use clang; then
- # Force clang
- einfo "Enforcing the use of clang due to USE=clang ..."
- if tc-is-gcc; then
- have_switched_compiler=yes
- fi
- AR=llvm-ar
- CC=${CHOST}-clang
- CXX=${CHOST}-clang++
- NM=llvm-nm
- RANLIB=llvm-ranlib
- elif ! use clang && ! tc-is-gcc ; then
- # Force gcc
- have_switched_compiler=yes
- einfo "Enforcing the use of gcc due to USE=-clang ..."
- AR=gcc-ar
- CC=${CHOST}-gcc
- CXX=${CHOST}-g++
- NM=gcc-nm
- RANLIB=gcc-ranlib
- fi
-
- if [[ -n "${have_switched_compiler}" ]] ; then
- # Because we switched active compiler we have to ensure
- # that no unsupported flags are set
- strip-unsupported-flags
- fi
-
- # Ensure we use correct toolchain
- export HOST_CC="$(tc-getBUILD_CC)"
- export HOST_CXX="$(tc-getBUILD_CXX)"
- tc-export CC CXX LD AR NM OBJDUMP RANLIB PKG_CONFIG
-
- cd "${MOZJS_BUILDDIR}" || die
-
- # ../python/mach/mach/mixin/process.py fails to detect SHELL
- export SHELL="${EPREFIX}/bin/bash"
-
- local -a myeconfargs=(
- --host="${CBUILD:-${CHOST}}"
- --target="${CHOST}"
- --disable-ctype
- --disable-jemalloc
- --disable-optimize
- --disable-smoosh
- --disable-strip
- --enable-readline
- --enable-release
- --enable-shared-js
- --with-intl-api
- --with-system-icu
- --with-system-nspr
- --with-system-zlib
- --with-toolchain-prefix="${CHOST}-"
- $(use_enable debug)
- $(use_enable jit)
- $(use_enable test tests)
- )
-
- # Temporary fix with rust-1.63, bgo#870193
- # if ! use x86 && [[ ${CHOST} != armv*h* ]] ; then
- # myeconfargs+=( --enable-rust-simd )
- # fi
- myeconfargs+=( --disable-rust-simd )
-
- # Modifications to better support ARM, bug 717344
- if use cpu_flags_arm_neon ; then
- myeconfargs+=( --with-fpu=neon )
-
- if ! tc-is-clang ; then
- # thumb options aren't supported when using clang, bug 666966
- myeconfargs+=( --with-thumb=yes )
- myeconfargs+=( --with-thumb-interwork=no )
- fi
- fi
-
- # Tell build system that we want to use LTO
- if use lto ; then
- if use clang ; then
- myeconfargs+=( --enable-linker=lld )
- myeconfargs+=( --enable-lto=cross )
- else
- myeconfargs+=( --enable-linker=bfd )
- myeconfargs+=( --enable-lto )
- fi
- fi
-
- # LTO flag was handled via configure
- filter-lto
-
- if tc-is-gcc ; then
- if ver_test $(gcc-fullversion) -ge 10 ; then
- einfo "Forcing -fno-tree-loop-vectorize to workaround GCC bug, see bug 758446 ..."
- append-cxxflags -fno-tree-loop-vectorize
- fi
- fi
-
- export MACH_USE_SYSTEM_PYTHON=1
- export PIP_NO_CACHE_DIR=off
-
- # Show flags we will use
- einfo "Build CFLAGS: ${CFLAGS}"
- einfo "Build CXXFLAGS: ${CXXFLAGS}"
- einfo "Build LDFLAGS: ${LDFLAGS}"
- einfo "Build RUSTFLAGS: ${RUSTFLAGS}"
-
- # Forcing system-icu allows us to skip patching bundled ICU for PPC
- # and other minor arches
- ECONF_SOURCE="${S}" \
- econf \
- ${myeconfargs[@]} \
- XARGS="${EPREFIX}/usr/bin/xargs"
-}
-
-src_compile() {
- cd "${MOZJS_BUILDDIR}" || die
- default
-}
-
-src_test() {
- if "${MOZJS_BUILDDIR}/js/src/js" -e 'print("Hello world!")'; then
- einfo "Smoke-test successful, continuing with full test suite"
- else
- die "Smoke-test failed: did interpreter initialization fail?"
- fi
-
- cp "${FILESDIR}"/spidermonkey-91-known-test-failures.txt "${T}"/known_failures.list || die
-
- # bgo #827960
- if use ppc; then
- echo "non262/TypedArray/map-and-filter.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/load/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/load/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/add/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/add/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/exchange/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/exchange/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/store/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/store/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/xor/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/xor/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/sub/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/sub/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-exchange.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/and/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-or.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/false-for-timeout-agent.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-add.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/or/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-sub.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-compareExchange.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/negative-timeout-agent.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-xor.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/value-not-equal.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-no-operation.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/waiterlist-block-indexedposition-wake.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/nan-for-timeout.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-and.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/was-woken-before-timeout.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-store.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/wait/bigint/waiterlist-order-of-operations-is-fifo.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/compareExchange/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/compareExchange/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/and/bigint/non-shared-bufferdata.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/or/bigint/good-views.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Atomics/notify/bigint/notify-all-on-loc.js" >> "${T}"/known_failures.list
- fi
-
- if use x86 ; then
- echo "non262/Date/timeclip.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Number/prototype/toPrecision/return-values.js" >> "${T}"/known_failures.list
- echo "test262/language/types/number/S8.5_A2.1.js" >> "${T}"/known_failures.list
- echo "test262/language/types/number/S8.5_A2.2.js" >> "${T}"/known_failures.list
- fi
-
- if [[ $(tc-endian) == "big" ]] ; then
- echo "non262/extensions/clone-errors.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/Date/UTC/fp-evaluation-order.js" >> "${T}"/known_failures.list
- echo "test262/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-other-type.js" >> "${T}"/known_failures.list
- fi
-
- ${EPYTHON} \
- "${S}"/tests/jstests.py -d -s -t 1800 --wpt=disabled --no-progress \
- --exclude-file="${T}"/known_failures.list \
- "${MOZJS_BUILDDIR}"/js/src/js \
- || die
-
- if use jit ; then
- ${EPYTHON} \
- "${S}"/tests/jstests.py -d -s -t 1800 --wpt=disabled --no-progress \
- --exclude-file="${T}"/known_failures.list \
- "${MOZJS_BUILDDIR}"/js/src/js basic \
- || die
- fi
-}
-
-src_install() {
- cd "${MOZJS_BUILDDIR}" || die
- default
-
- # fix soname links
- pushd "${ED}"/usr/$(get_libdir) &>/dev/null || die
- mv lib${MY_PN}-${MY_MAJOR}.so lib${MY_PN}-${MY_MAJOR}.so.0.0.0 || die
- ln -s lib${MY_PN}-${MY_MAJOR}.so.0.0.0 lib${MY_PN}-${MY_MAJOR}.so.0 || die
- ln -s lib${MY_PN}-${MY_MAJOR}.so.0 lib${MY_PN}-${MY_MAJOR}.so || die
- popd &>/dev/null || die
-
- # remove unneeded files
- rm \
- "${ED}"/usr/bin/js${MY_MAJOR}-config \
- "${ED}"/usr/$(get_libdir)/libjs_static.ajs \
- || die
-
- # fix permissions
- chmod -x \
- "${ED}"/usr/$(get_libdir)/pkgconfig/*.pc \
- "${ED}"/usr/include/mozjs-${MY_MAJOR}/js-config.h \
- || die
-}
diff --git a/dev-libs/Manifest.gz b/dev-libs/Manifest.gz
index a710f6ba6502..83c11e2a8da4 100644
Binary files a/dev-libs/Manifest.gz and b/dev-libs/Manifest.gz differ
diff --git a/dev-libs/apache-arrow/Manifest b/dev-libs/apache-arrow/Manifest
index 9c697a4871fc..db13cba08b97 100644
--- a/dev-libs/apache-arrow/Manifest
+++ b/dev-libs/apache-arrow/Manifest
@@ -1,3 +1,6 @@
DIST apache-arrow-14.0.2.tar.gz 20969982 BLAKE2B 9df119fca564a4140d1143a1ac0614831e4f80846d43439d011b8ca7f5e77461005c96b9430b6dd7ce0ba7496b879a8abc9ffa372e6b455c317abeebb16ae8e4 SHA512 dd6cf6cbb817a48ef5275bb409367e5904526a3c16a17a37ea75101085ea19a71ba6bf936a6f099012e7c528811db1728ef2f14dcb16a1056a22088839280ce0
+DIST apache-arrow-15.0.0.tar.gz 21491996 BLAKE2B 55709d1d181ed5c1482e1eadc9031c692bbd39434ccad17be8c0f3f5af47e3b3d5f262903d1ce09c39442497e14c22c80d7b30215e4de830a4ac82a1b3db34fb SHA512 d5dccaa0907b0e6f2a460e32ae75091942dcb70b51db4aefe2767ee8d99882694607b723a9c06898dda3938d8eb498258d7f9aad11054665b6ea9c2fbaeafa74
+DIST apache-arrow-arrow-data-ad82a736c170e97b7c8c035ebd8a801c17eec170.tar.gz 3571641 BLAKE2B e3daae62938b54dbeb8ca9227eddfd2d59864cfafb54a7a7fd7aaa2b2cabd0f2dde58b77b2def086a1759b43c3b5834cb55462cc0b2886b2892329a957afdacb SHA512 ad6fd3343d8a3a6beb5b6269815bc207171905c102698fdb8ed7091e6d829dc51f354293c7686f845e3d49c4a828d9c77958447d965c9da4272260984fea4262
DIST apache-arrow-arrow-data-d2c73bf78246331d8e58b6f11aa8aa199cbb5929.tar.gz 3570422 BLAKE2B df1f8d1c4e321ca0abdce598b09945aa9e63114199e7f2eb0fc549323dadf703b917efd90c04a2d540d763a44128d76c6ee12788a983d4b9536d04297316b656 SHA512 0be19960b0d22fc2e07bf84f11148e69d6fa82f10627eb2a5e4b762b1d4cf4e151a57c5a1dc761d6d8ed29881ea589e4cfe0cd47d5c7cbf7b6107143b4a45e82
DIST apache-arrow-parquet-data-b2e7cc755159196e3a068c8594f7acbaecfdaaac.tar.gz 1013835 BLAKE2B cb4e544b6588ddad503f9692ee2eee5d4f1e931f10654b7253e11ffd2feb4c957dec047a1b1644c1f1538a3bf7ea726e5a9ae9b7d0c3bb0d55d27f088b5c5be3 SHA512 d4c2af20d6a88c1beb44770982f4aa324ea4ee375e8f556339074875af15c48f4398d972c1eec35eba5d209e9e62df4bdbf73ebc8148a7bb05ffa2d69c97df61
+DIST apache-arrow-parquet-data-d69d979223e883faef9dc6fe3cf573087243c28a.tar.gz 1022547 BLAKE2B a36f950160a6e033c0ab4fb9ac391be6e71cdadf2bbb7d0210640cc41782921b0e0777425b811a1d688e03842684eb1bfe008ffe359b182bea0f80d3adf658fe SHA512 dfebeca5b99a72a4c069c1030102a6fdd35d4c58cb12fb640bcd0a623cc54e49363f1112fa45da14b16867630dc30bc94bdb2e4cc95f9379dcaa5d7f8f38a3ea
diff --git a/dev-libs/apache-arrow/apache-arrow-15.0.0.ebuild b/dev-libs/apache-arrow/apache-arrow-15.0.0.ebuild
new file mode 100644
index 000000000000..f7e504cdc7fa
--- /dev/null
+++ b/dev-libs/apache-arrow/apache-arrow-15.0.0.ebuild
@@ -0,0 +1,129 @@
+# Copyright 2023-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit cmake
+
+# arrow.git: testing
+ARROW_DATA_GIT_HASH=ad82a736c170e97b7c8c035ebd8a801c17eec170
+# arrow.git: cpp/submodules/parquet-testing
+PARQUET_DATA_GIT_HASH=d69d979223e883faef9dc6fe3cf573087243c28a
+
+DESCRIPTION="A cross-language development platform for in-memory data."
+HOMEPAGE="
+ https://arrow.apache.org/
+ https://github.com/apache/arrow/
+"
+SRC_URI="
+ mirror://apache/arrow/arrow-${PV}/${P}.tar.gz
+ test? (
+ https://github.com/apache/parquet-testing/archive/${PARQUET_DATA_GIT_HASH}.tar.gz
+ -> ${PN}-parquet-data-${PARQUET_DATA_GIT_HASH}.tar.gz
+ https://github.com/apache/arrow-testing/archive/${ARROW_DATA_GIT_HASH}.tar.gz
+ -> ${PN}-arrow-data-${ARROW_DATA_GIT_HASH}.tar.gz
+ )
+"
+S="${WORKDIR}/${P}/cpp"
+
+LICENSE="Apache-2.0"
+SLOT="0/$(ver_cut 1)"
+KEYWORDS="~amd64 ~hppa ~riscv"
+IUSE="brotli bzip2 compute dataset +json lz4 parquet re2 snappy ssl test zlib zstd"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+ brotli? ( app-arch/brotli:= )
+ bzip2? ( app-arch/bzip2:= )
+ compute? ( dev-libs/libutf8proc:= )
+ dataset? (
+ dev-libs/libutf8proc:=
+ )
+ lz4? ( app-arch/lz4:= )
+ parquet? (
+ dev-libs/libutf8proc:=
+ dev-libs/thrift:=
+ ssl? ( dev-libs/openssl:= )
+ )
+ re2? ( dev-libs/re2:= )
+ snappy? ( app-arch/snappy:= )
+ zlib? ( sys-libs/zlib:= )
+ zstd? ( app-arch/zstd:= )
+"
+DEPEND="${RDEPEND}
+ dev-cpp/xsimd
+ >=dev-libs/boost-1.81.0
+ json? ( dev-libs/rapidjson )
+ test? (
+ dev-cpp/gflags
+ dev-cpp/gtest
+ )
+"
+
+REQUIRED_USE="
+ test? (
+ json
+ parquet? ( zstd )
+ )
+ ssl? ( json )
+"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-11.0.0-shared-lz4.patch"
+ "${FILESDIR}"/${PN}-14.0.1-gcc14.patch
+)
+
+src_prepare() {
+ # use Gentoo CXXFLAGS, specify docdir at src_configure.
+ sed -i \
+ -e '/SetupCxxFlags/d' \
+ -e '/set(ARROW_DOC_DIR.*)/d' \
+ CMakeLists.txt \
+ || die
+ cmake_src_prepare
+}
+
+src_configure() {
+ local mycmakeargs=(
+ -DARROW_BUILD_STATIC=OFF
+ -DARROW_BUILD_TESTS=$(usex test)
+ -DARROW_COMPUTE=$(usex compute)
+ -DARROW_CSV=ON
+ -DARROW_DATASET=$(usex dataset)
+ -DARROW_DEPENDENCY_SOURCE=SYSTEM
+ -DARROW_DOC_DIR=share/doc/${PF}
+ -DARROW_FILESYSTEM=ON
+ -DARROW_HDFS=ON
+ -DARROW_JEMALLOC=OFF
+ -DARROW_JSON=$(usex json)
+ -DARROW_PARQUET=$(usex parquet)
+ -DPARQUET_REQUIRE_ENCRYPTION=$(usex ssl)
+ -DARROW_USE_CCACHE=OFF
+ -DARROW_USE_SCCACHE=OFF
+ -DARROW_WITH_BROTLI=$(usex brotli)
+ -DARROW_WITH_BZ2=$(usex bzip2)
+ -DARROW_WITH_LZ4=$(usex lz4)
+ -DARROW_WITH_RE2=$(usex re2)
+ -DARROW_WITH_SNAPPY=$(usex snappy)
+ -DARROW_WITH_ZLIB=$(usex zlib)
+ -DARROW_WITH_ZSTD=$(usex zstd)
+ -DCMAKE_CXX_STANDARD=17
+ )
+ cmake_src_configure
+}
+
+src_test() {
+ export PARQUET_TEST_DATA="${WORKDIR}/parquet-testing-${PARQUET_DATA_GIT_HASH}/data"
+ export ARROW_TEST_DATA="${WORKDIR}/arrow-testing-${ARROW_DATA_GIT_HASH}/data"
+ cmake_src_test
+}
+
+src_install() {
+ cmake_src_install
+ if use test; then
+ cd "${D}"/usr/$(get_libdir) || die
+ rm -r cmake/ArrowTesting || die
+ rm libarrow_testing* || die
+ rm pkgconfig/arrow-testing.pc || die
+ fi
+}
diff --git a/dev-libs/apache-arrow/metadata.xml b/dev-libs/apache-arrow/metadata.xml
index f3a30cdad7ac..31fb6e8b9092 100644
--- a/dev-libs/apache-arrow/metadata.xml
+++ b/dev-libs/apache-arrow/metadata.xml
@@ -5,6 +5,10 @@
tupone@gentoo.org
Tupone Alfredo