From patchwork Wed Jul 22 06:17:54 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Deepesh Varatharajan X-Patchwork-Id: 93115 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 20C96C4451C for ; Wed, 22 Jul 2026 06:18:22 +0000 (UTC) Received: from mx0b-0064b401.pphosted.com (mx0b-0064b401.pphosted.com [205.220.178.238]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.42042.1784701098705593277 for ; Tue, 21 Jul 2026 23:18:19 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@windriver.com header.s=PPS06212021 header.b=mkpg9/b3; spf=permerror, err=parse error for token &{10 18 %{ir}.%{v}.%{d}.spf.has.pphosted.com}: invalid domain name (domain: windriver.com, ip: 205.220.178.238, mailfrom: prvs=1663723a73=deepesh.varatharajan@windriver.com) Received: from pps.filterd (m0250811.ppops.net [127.0.0.1]) by mx0a-0064b401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66M52TAN327486 for ; Wed, 22 Jul 2026 06:18:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=windriver.com; h=cc:content-transfer-encoding:content-type:date:from :in-reply-to:message-id:mime-version:references:subject:to; s= PPS06212021; bh=5C4BnogZGKXMgNDLIZ443hsWVg1aBw0N7Wn4wunD02c=; b= mkpg9/b3S/0G1oSwWs7oWmfhdJbjBoQ9GMrP2/X8zoNwFnAIAwSKEYLwRoDyTuNF 1vSP30szSknEIS6rDm0XGGStGZc2VlnMY9Qnw9WMEhbZcfYee7sxNtMjSiFeeznR QtyI6WCQyVY6IemSr04qc87j/fSP75D5CAiIJ8sPBWc0Xrm8Hac1ZC6f8pwWl4ya O3eyySPIGjFXMlW9+unHs2tc1LNjmFXhJUkJen0DPIlhGij+zjLlyM3tbnwHq4Uf +Vz6PEJPwF8TuYsQFv15YQvnwgZxAwYeqRkX4xq8fxuDd9uvzpEB2ze4iVosanmv CbYeTZkKwG7Jfasf/IBVtg== Received: from ph8pr06cu001.outbound.protection.outlook.com (mail-westus3azon11012053.outbound.protection.outlook.com [40.107.209.53]) by mx0a-0064b401.pphosted.com (PPS) with ESMTPS id 4fga8x74ff-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT) for ; Wed, 22 Jul 2026 06:18:17 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HMInjUY+UOE/FZq/Bcb3HeWYBkMHxOVLhjN8Rpx57FMaItp9KkizqCSblX7Zn+t1InlJKDtZvCY9JGXkV+sPJ+Va7qFudf5pKUmM3ffdiXlzaQwmwC6ea4qseVEI0wm3acAM4CTACL5DJkBcTz0sly+cf2SisGvqP670AmhdR0RWtjG8vsPaayKdypFZdkMhoCH1vroy9nf7+9veiFQbr2ATow3sNz5xcDPyYHGXohPYJb7wzE5I0In336sLdzmQV3symj8aj2rX2w7mjtR80C2FcVFpNGtXE6Bp9jcAvFxVj09QXCSFlsvecOfZ8For3garjfKqzYdJFKll/vFcsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5C4BnogZGKXMgNDLIZ443hsWVg1aBw0N7Wn4wunD02c=; b=gt1kWGQQpv3AQiTpHd8k0x7qi9yPJKI5I0Nqox5HPNDDtBbOFrWT+GLPTJEVZnDzmsomp+dzR58m++bIxNEOz+GgkCGK4UWYXW4y57/TVu/LMxEpEI6wwlxp3JVgAiEwXE4kxn+R+qOnX769IqSlm++x4SlSQX/pV01MIcVojG1HFJ64Ih4l4ZAzzk2Y0gKAEyYqFs1WQwIGrKp1tw1K7vpzfysoW/hPfmeid0LVB0YacpWnkbsT4tvI6eF5LrGhGWh5lqdj0+s5UUjDzXCReoe8DSHdbqXszuIBOZo3jUJO/FqCc4d9a8FJMMO33a+Ab+bcv14hBf5Ua+w9x9b2UA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=windriver.com; dmarc=pass action=none header.from=windriver.com; dkim=pass header.d=windriver.com; arc=none Received: from SN7PR11MB6677.namprd11.prod.outlook.com (2603:10b6:806:26b::6) by DM3PPF453C3BEC4.namprd11.prod.outlook.com (2603:10b6:f:fc00::f1b) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.245.10; Wed, 22 Jul 2026 06:18:14 +0000 Received: from SN7PR11MB6677.namprd11.prod.outlook.com ([fe80::490a:519b:d657:99ab]) by SN7PR11MB6677.namprd11.prod.outlook.com ([fe80::490a:519b:d657:99ab%4]) with mapi id 15.21.0245.009; Wed, 22 Jul 2026 06:18:14 +0000 From: Deepesh.Varatharajan@windriver.com To: openembedded-core@lists.openembedded.org Cc: Deepesh.Varatharajan@windriver.com Subject: [PATCH v2 2/3] rust: refactor source handling into a shared work-shared recipe Date: Tue, 21 Jul 2026 23:17:54 -0700 Message-ID: <20260722061757.109411-2-Deepesh.Varatharajan@windriver.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20260722061757.109411-1-Deepesh.Varatharajan@windriver.com> References: <20260722061757.109411-1-Deepesh.Varatharajan@windriver.com> X-ClientProxiedBy: BY5PR03CA0023.namprd03.prod.outlook.com (2603:10b6:a03:1e0::33) To SN7PR11MB6677.namprd11.prod.outlook.com (2603:10b6:806:26b::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR11MB6677:EE_|DM3PPF453C3BEC4:EE_ X-MS-Office365-Filtering-Correlation-Id: bb93d462-1eab-4f99-bdce-08dee7b9037a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|52116014|23010399003|25016099003|12006099003|18002099003|22082099003|3023799007|13003099007|29003799003|56012099006|10067099003|11063799006|5023799004|38350700014|6133799003; X-Microsoft-Antispam-Message-Info: 2/8RE/SFfBCNicYaTMBzboqdmoSY4P0yY1o5saTiSRu/mRerAGGUELjpeWE4fQo+F2YcfiaFzNFs8Ba1d9m9wOFMsJ8hCIIKDBg0Qin2u9HaUAD+YqM6kRf670ZhTG4ZIYphpIrEXJ/zSjTuMOC3Nv6Vue0gn+GVDuyuXDQXRC7hksxVB+MyIaklMuGg1bMpjwpsMqGeGF05z+IRnhsrIcLzvhXeA+iJ5a+3mXg8I5Ct9t8CPUwBCnsg9EX1bUztirU4tupyCbGEZE59+MwrLdRyNlDKQXCHDl0nFRdhzfWxvi9x+W0QyXwwzzqhXVaRAOoZ05kDI7ATsjzH0E+0J76tt7QINtBNsHGUbtgIWTJnGmIn2I+VgGR40+AUxIGnQG7a3gIA02Q0I+4sbm8jF0NVc63gizHUAr+rDcdSY7vlasaHbDIk9cKJifsICZlIK+IZqoddEBXR15hne6ssUnCQ4YBb0L6GhLwvT6cXftYoJym3mHPXsdQ7JO17STCJEvl2/kXyF46FVV11YdUwGuFjPwAarmOe4CdPttUPTzTVx7z/Q1MYz+C1sI6w8G1jZWEGMNpwPbLpR2weqcEKD78ed0eVtMxsED+zz1u0U5TUAE31+OKlm9klcXqTl5MVo5qf0BUV5fT21GC+B9MGH8VZaMoJIFDODboKgIjvjNs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR11MB6677.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(52116014)(23010399003)(25016099003)(12006099003)(18002099003)(22082099003)(3023799007)(13003099007)(29003799003)(56012099006)(10067099003)(11063799006)(5023799004)(38350700014)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?2SNRF+XVzmfLjTq3yReGtyws3iyh?= =?utf-8?q?r+U5GgosScng4s9kxUOk/hs04R0lnwg4EyaJnA0MC5JyXCgFe+yuXyK5icHjgZzit?= =?utf-8?q?JF1SjwpOKkOMthKssXHBwCM3kd7+SJOG2pFXk+NftbTeQmpjgBTcaOlEJqtQuvV7p?= =?utf-8?q?b3rO3cKNehsT8d/KKX5PgDhk3pzl3bMMyuv9FmArcQAbqU64kzAsmpVq3asfw26bY?= =?utf-8?q?oBB+sRTZ7p0sh3ceLncgJvgCniunuL26InfpWrLw/EReCHMUNvV32WiD+0kikMPoc?= =?utf-8?q?dloKW6kyzp2kqG1eFdUBi8WrQiWnsFhb3BZjlDElewzeXYA5FVGyFdT7UA8YaVl/I?= =?utf-8?q?4Otn/V4O7yhzjPJgrnJGIFEiGWmT6TW2nUbAy/Mx6cUbwdyLnio9FnZ0gYudUI9F2?= =?utf-8?q?siTsoCAeuTRehU1edEDao6opMejLrbrWJUDmtR3wqW30mzhtSQyAzB3sImze/EncI?= =?utf-8?q?3Mm6pNiU4ZO1aF3OtOLruByZSOD/5hnqSxteqFo1vcYMpo1vUaAfg+QnglArOyq0y?= =?utf-8?q?zKNWldaEFeYxRlUr3EctKq2QdgR15EpZ8n7twgUYdS9k2qFXAaEDJTWvHOHX7dtes?= =?utf-8?q?WZ0Zap3RqypJeZHqyKcZ9Vxki3Ll0Iv9tqB9VfayGdTNR/c0JIPvuNOyXZQ32X6En?= =?utf-8?q?8aSuXRCOIbnWxCzLcjfRhUrqzL8o+2oK8M4vQi7894K8K3JLwXXt6jUN7nsbDUKoY?= =?utf-8?q?S+TCoyk/rCK07NYwIDjmAm6hswPMJuhkeOK5LaDO4zOr5gMsQoz2MYtS3tFus5BjE?= =?utf-8?q?uVbGRNgCyp+m78YOfCqFxp+OH269ZP3nvyCoEWfopzI8L0KxmN0ieum3nCE2kogy5?= =?utf-8?q?nlgwLf4PAIMxrodFUlGuQI8NAFXC8TC49MXv9hepUgGaFopGmHfNEBkXOIjDQ0fjk?= =?utf-8?q?05ZBpmxkeYgn6gB1nxxxu48eclhfVqFIJMpzPSTscm/L3JtfEwaOFGpvkZ2gfQAEz?= =?utf-8?q?CRdXtyYBpFAtsmuoL4lcVnfHIavBm61pis4gimDNsztoRelO+3oLbrvIkSeN5KhzB?= =?utf-8?q?IU15A6OrKp3xgyvmuB5hoPiGBQPmr4Qov3hS/bCdkH8CqTEvMiSxayBdsO6KdHOoY?= =?utf-8?q?sKPnhP3VZ00PR9S24YUMmG5pPZJvY6IASRELiRAHvbSJ64rDyQuw/imqlq14VsOEk?= =?utf-8?q?kr8OD9unTVBb0E7VFry0N21KMv2kMMZ8FVG8DiC8gSJqUKpykX3c+69JKsgWxHpCV?= =?utf-8?q?v9WbpDcf6XeScBWNnFU0QNFVVn4XDwK1bTEMxx2HvDIr6wFA+glmC2KX/f4WkSawN?= =?utf-8?q?+hF6rVyqC63HFInzqaeMHZiGX1pK3I53JavAYNpnkG2YH2xzqngA8YkhX5Qg75Rmc?= =?utf-8?q?bnyMP+DdcQiCS7kI4xoj6MxOj6J/2jjY6WUeZo2XQZ8HU05RRbp1sITGDiJBfG0dX?= =?utf-8?q?VUTncOGDat5agsOeYmxPSk5cn4mE/t05wfVipR+gdVyuV+XO1uafzE3+pxOXL0ixt?= =?utf-8?q?lRB3vfSMx4X3ytobtH32cwKzgOk3Sa8XCgFTHF1feGfB8cOJ5CKWApLWwCHCCP0To?= =?utf-8?q?swaUkaO/ZK5AwjdwPHVlggqDS6R8pGq5SvZecR38pcaqu6cA+a8z4yw87UPys5XZ7?= =?utf-8?q?/01qmviaDgNjv6vHU20bAkwbyhQ9Ob2gBD7HuNc3u1fRr+glm5fkTAzc8aUyoNQGU?= =?utf-8?q?jQbi2jT/oFrc9BSHl8a50VM5W6N7aFRnQVHz0HBi66QPGF+S7q1wu38nkt6l4qSUM?= =?utf-8?q?K2Plepavz?= X-Exchange-RoutingPolicyChecked: dpHvQ+8LBkNpF26Z7AnKKugjHpl02eFyjbo7dgVSlt29IWsjSChlIlCn4uF/BJ8RRCsaXrdufK5YDXiapprrMpopVAFsCjRwG4UvQ9F4OIzPwWr5AE7agQMJCmh8GeMj+9r9NjLR2w2o7S2jU7psrm65qtatEIu04x49I0h/jt5r6lGVh4Q0GeOHETpD1Nh2uvUzbr1Psrqnp4bSIcLuOTgsS7Nw43tMhbSLo+MIeRs8OnCE+0SeVCCqUznej8ZBHlcf47HYh0s1i/cKTKJBwN0PifsECQZnU9Lv+qskL5uKqCpJsBG6ZPnsaYQEoGfmgSUkxAJLHTTBEtzZy/SfzQ== X-OriginatorOrg: windriver.com X-MS-Exchange-CrossTenant-Network-Message-Id: bb93d462-1eab-4f99-bdce-08dee7b9037a X-MS-Exchange-CrossTenant-AuthSource: SN7PR11MB6677.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2026 06:18:14.7767 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ddb2873-a1ad-4a18-ae4e-4644631433be X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6/DX+tfVsiYW0EMdjR4tjS0ZBIcVz5EGUCJg8QV+1xBgsCrdx0R/PDC7xWTliF96TRsK7I9fWyzCYi1X+2eRqxxqV/3bvr9Gw6va5eE1H4Od+JRF4UHQk4GweXxDuOOD X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PPF453C3BEC4 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDA1NiBTYWx0ZWRfX52d324sIq9RP ihM3N9fjxytRTFw/hyQ9O73jdnsrQGrNG2vnzKOtBcyxVbbpXEF1jNSVf/JBVyMdJ5sHF5BFlUl gMTUsFEiGWSjbjNcPLtCVQDAsTdbscADubeofI7rHUI+Kh7P1ogu X-Proofpoint-GUID: tuaTcfjbVaOC3WmfO7S6amLdkKLCK5W9 X-Proofpoint-ORIG-GUID: tuaTcfjbVaOC3WmfO7S6amLdkKLCK5W9 X-Authority-Analysis: v=2.4 cv=XdO5Co55 c=1 sm=1 tr=0 ts=6a6060a9 cx=c_pps a=5XdDR3/zV2dQAmk0xmzXVw==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=bi6dqmuHe4P4UrxVR6um:22 a=klDOsUkWDRETUCZYPvoE:22 a=ei4SEBeUAAAA:8 a=t7CeM3EgAAAA:8 a=7CQSdrXTAAAA:8 a=iGHA9ds3AAAA:8 a=8wEic9LhAAAA:8 a=ag1SF4gXAAAA:8 a=Tr0CIQbrg0mKLZOxC6IA:9 a=5O9rwaaqg39D_ep3:21 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=8zIOOLb7Ym0NljyPXbuS:22 a=FdTzh2GWekK77mhwV6Dw:22 a=a-qgeE7W1pNrGK8U0ZQC:22 a=nM-MV4yxpKKO9kiQg6Ot:22 a=M9VCcFR7d36vLOFuqMn8:22 a=Yupwre4RP9_Eg_Bd0iYG:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDA1NiBTYWx0ZWRfXw7+BWtCYz4p6 MeN1asmKQTnA4sRnmG2KtdLUZK55cxGveAhUo2i8UsVStqCd8Go5KJ0t0g8LBGQDmfV/86yLsyc POIzECHZlXh6vf/fZupBtnkY8FAcostci2Z6PPat+jmHFI4sX4w7vbEIcTXgW9IY1IeJhABp7Iq tzKlSNHzdcZMxmHpmdUibgSn6+w2fUUSjMuzpFAf1XUm+BNpAFBa69gt1YhcPKKrZG4PMEC2jok CgL6dK/19WL1+BYN662YGJToV+y6kkaPgyFpLVn1PbVG7ImROi456RsFjpJ31Bt+5JhfCUE3KTW rvtkoz6DWWgTmw0vcXiR45yTwTJTYry9TatthYXQHbmVcvO326+Iz8GFxxcqb79yzst9FxMFeTp KjTLicLghEcBL91efgzhnOTuB7kqbV6S7uoDxNGv9QkA04S73imyuX4HsNU2qm55zWMrhKek9yo f6JBJSLcvl0729G6fTw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_02,2026-07-21_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 phishscore=0 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220056 X-MIME-Autoconverted: from 8bit to quoted-printable by mx0a-0064b401.pphosted.com id 66M52TAN327486 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 22 Jul 2026 06:18:22 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/241599 From: Deepesh Varatharajan [YOCTO #15808] Consolidate Rust source management across all Rust recipes (rust, cargo, libstd-rs and their native/nativesdk variants) into a single shared source tree using the work-shared pattern. Disk savings: a world build with multilibs enabled, together with nativesdk-rust and nativesdk-cargo, now shares a single ~4.2 GB rustc-src tree instead of maintaining up to 11 independent copies (~46.2 GB total). Performance (clean core-image-sato build, qemux86-64): Before: 68m53.507s After: 65m46.159s Improvement: 3m07.348s (~4.5%) New files: - rust-source.bb: A shared recipe that fetches, unpacks, and patches the rustc source tree into ${TMPDIR}/work-shared/rust-source-${PV}-${PR}. All build/install/packaging tasks are disabled; this recipe exists solely to provide a single copy of the source. Inherits allarch/nopackages, excludes itself from rm_work, and is hidden from world builds. Also defines RUST_BUILD_ARCH locally since this recipe does not inherit rust-common.bbclass but still needs the mapping for snapshot fetching via rust-snapshot.inc. - common-source.inc: Included by consumer recipes (rust, cargo, libstd-rs) to disable their local do_fetch/do_unpack/do_patch tasks, clear SRC_URI, and add task dependencies on rust-source-${PV} for configure, licensing, and SPDX generation. Also provides is_work_shared_spdx() override for correct SPDX shared-workdir detection. Modified files: - rust-source.inc: - Replace RUST_VERSION with explicit MAJOR_VER/MINOR_VER/PATCH_VER and PV. - Set UNPACKDIR to the work-shared location so all consumers share one source tree via RUSTSRC and S. - rust_git.bb (renamed from rust_1.96.1.bb): - Add 'require common-source.inc' to use the shared source tree. - Set B = ${WORKDIR}/build to separate build artifacts from shared source. - Set CARGO_HOME = ${WORKDIR}/cargo_home to isolate cargo caching. - Set build-dir = "rust-build" in config.toml to distinguish Yocto's build directory (B), which holds config.toml, from the bootstrap's own build output directory. Without this, bootstrap defaults to "build/" inside B, creating an ambiguous build/build/ nesting. - Use absolute ${S}/src/bootstrap/bootstrap.py path since cwd is now B. - Update install functions to reference rust-build/ instead of build/. - Update do_test_compile to use absolute ${S}/src/tools/ path. - Change do_rust_setup_snapshot from 'after do_unpack' to depend on rust-source-${PV}:do_unpack (since local do_unpack is removed). - cargo_git.bb (renamed from cargo_1.96.1.bb): - Add 'require common-source.inc' to use the shared source tree. - Change do_cargo_setup_snapshot from 'after do_unpack' to depend on rust-source-${PV}:do_unpack. - libstd-rs_git.bb (renamed from libstd-rs_1.96.1.bb): - Add 'require common-source.inc' to use the shared source tree. - rust-cross-canadian_git.bb (renamed from rust-cross-canadian_1.96.1.bb): - Rename only (version now comes from rust-source.inc via PV). - rust-common.bbclass: - Add a second --remap-path-prefix for ${TMPDIR}/work-shared so debug info from the shared source tree is correctly remapped. - Retain RUST_BUILD_ARCH definition so that consumer recipes (rust, cargo, libstd-rs) which inherit this class can resolve snapshot directory names used by do_rust_setup_snapshot and do_cargo_setup_snapshot. - lib/oeqa/selftest/cases/rust.py: - Adapt the selftest to the build-dir/source-dir split: use B for build artifacts and RUSTSRC for source paths. - Update remote-test-server copy path from build/ to rust-build/. - Pass --build-dir and --config explicitly to bootstrap.py. - conf/distro/include/maintainers.inc: - Add maintainer entry for the new rust-source recipe. License-Update: recipe file renames only, no license change Signed-off-by: Deepesh Varatharajan --- meta/classes-recipe/rust-common.bbclass | 4 +- meta/conf/distro/include/maintainers.inc | 1 + meta/lib/oeqa/selftest/cases/rust.py | 9 ++- .../rust/{cargo_1.96.1.bb => cargo_git.bb} | 8 ++- meta/recipes-devtools/rust/common-source.inc | 28 ++++++++++ .../{libstd-rs_1.96.1.bb => libstd-rs_git.bb} | 4 ++ ...n_1.96.1.bb => rust-cross-canadian_git.bb} | 0 meta/recipes-devtools/rust/rust-source.bb | 56 +++++++++++++++++++ meta/recipes-devtools/rust/rust-source.inc | 16 +++++- .../rust/{rust_1.96.1.bb => rust_git.bb} | 31 +++++++--- 10 files changed, 140 insertions(+), 17 deletions(-) rename meta/recipes-devtools/rust/{cargo_1.96.1.bb => cargo_git.bb} (91%) create mode 100644 meta/recipes-devtools/rust/common-source.inc rename meta/recipes-devtools/rust/{libstd-rs_1.96.1.bb => libstd-rs_git.bb} (92%) rename meta/recipes-devtools/rust/{rust-cross-canadian_1.96.1.bb => rust-cross-canadian_git.bb} (100%) create mode 100644 meta/recipes-devtools/rust/rust-source.bb rename meta/recipes-devtools/rust/{rust_1.96.1.bb => rust_git.bb} (93%) diff --git a/meta/classes-recipe/rust-common.bbclass b/meta/classes-recipe/rust-common.bbclass index 057aeda67a..6bc42016d1 100644 --- a/meta/classes-recipe/rust-common.bbclass +++ b/meta/classes-recipe/rust-common.bbclass @@ -14,7 +14,9 @@ FILES:${PN}-dev += "${rustlibdir}/*.rlib ${rustlibdir}/*.rmeta" FILES:${PN}-dbg += "${rustlibdir}/.debug" RUSTLIB ?= "-L ${STAGING_DIR_HOST}${rustlibdir}" -RUST_DEBUG_REMAP = "--remap-path-prefix=${WORKDIR}=${TARGET_DBGSRC_DIR}" +RUST_DEBUG_REMAP = "--remap-path-prefix=${WORKDIR}=${TARGET_DBGSRC_DIR} \ + --remap-path-prefix=${TMPDIR}/work-shared=${TARGET_DBGSRC_DIR} \ +" RUSTFLAGS += "${RUSTLIB} ${RUST_DEBUG_REMAP}" RUSTLIB_DEP ??= "libstd-rs" RUST_PANIC_STRATEGY ??= "unwind" diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc index 4c6307086c..bfff5082c2 100644 --- a/meta/conf/distro/include/maintainers.inc +++ b/meta/conf/distro/include/maintainers.inc @@ -784,6 +784,7 @@ RECIPE_MAINTAINER:pn-ruby = "Ross Burton " RECIPE_MAINTAINER:pn-run-postinsts = "Ross Burton " RECIPE_MAINTAINER:pn-rust = "Randy MacLeod " RECIPE_MAINTAINER:pn-rust-cross-canadian-${TRANSLATED_TARGET_ARCH} = "Randy MacLeod " +RECIPE_MAINTAINER:pn-rust-source-1.96.1 = "Deepesh Varatharajan " RECIPE_MAINTAINER:pn-rxvt-unicode = "Unassigned " RECIPE_MAINTAINER:pn-sassc = "Simone Weiß " RECIPE_MAINTAINER:pn-sato-icon-theme = "Richard Purdie " diff --git a/meta/lib/oeqa/selftest/cases/rust.py b/meta/lib/oeqa/selftest/cases/rust.py index c961a8f652..4111d72044 100644 --- a/meta/lib/oeqa/selftest/cases/rust.py +++ b/meta/lib/oeqa/selftest/cases/rust.py @@ -46,7 +46,8 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase): recipe = "rust" start_time = time.time() bitbake("{} -c test_compile".format(recipe)) - builddir = get_bb_var("RUSTSRC", "rust") + builddir = get_bb_var("B", "rust") + sourcedir = get_bb_var("RUSTSRC", "rust") # build core-image-minimal with required packages default_installed_packages = ["libgcc", "libstdc++", "libatomic", "libgomp", "libzstd", "llvm", "openssl"] features = [] @@ -111,7 +112,7 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase): # Copy remote-test-server to image through scp host_sys = get_bb_var("RUST_BUILD_SYS", "rust") ssh = SSHControl(ip=qemu.ip, logfile=qemu.sshlog, user="root") - ssh.copy_to(builddir + "/build/" + host_sys + "/stage2-tools-bin/remote-test-server","~/") + ssh.copy_to(builddir + "/rust-build/" + host_sys + "/stage2-tools-bin/remote-test-server","~/") # Execute remote-test-server on image through background ssh command = '~/remote-test-server --bind 0.0.0.0:12345 -v' sshrun=subprocess.Popen(("ssh", '-o', 'UserKnownHostsFile=/dev/null', '-o', 'StrictHostKeyChecking=no', '-f', "root@%s" % qemu.ip, command), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -131,8 +132,10 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase): # PowerPC mac99 QEMU has 768MB RAM limit, so we need to minimize test binary sizes cmd = cmd + " export RUSTFLAGS='-C strip=debuginfo -Clink-arg=-lz -Clink-arg=-lzstd';" # Trigger testing. + # Run bootstrap from sourcedir with explicit --build-dir and --config + # pointing to the separate build directory. cmd = cmd + " export TEST_DEVICE_ADDR=\"%s:12345\";" % qemu.ip - cmd = cmd + " cd %s; python3 src/bootstrap/bootstrap.py test %s --target %s" % (builddir, testargs, targetsys) + cmd = cmd + " cd %s; python3 src/bootstrap/bootstrap.py --build-dir %s/rust-build --config %s/config.toml test %s --target %s" % (sourcedir, builddir, builddir, testargs, targetsys) retval = runCmd(cmd) end_time = time.time() diff --git a/meta/recipes-devtools/rust/cargo_1.96.1.bb b/meta/recipes-devtools/rust/cargo_git.bb similarity index 91% rename from meta/recipes-devtools/rust/cargo_1.96.1.bb rename to meta/recipes-devtools/rust/cargo_git.bb index f16688fc76..8047a2b255 100644 --- a/meta/recipes-devtools/rust/cargo_1.96.1.bb +++ b/meta/recipes-devtools/rust/cargo_git.bb @@ -13,6 +13,8 @@ LIC_FILES_CHKSUM = " \ require rust-source.inc require rust-snapshot.inc +# Use shared source tree from rust-source.bb; disables local fetch/unpack/patch +require common-source.inc S = "${RUSTSRC}/src/tools/cargo" CARGO_VENDORING_DIRECTORY = "${RUSTSRC}/vendor" @@ -21,6 +23,9 @@ CVE_PRODUCT = "rust-lang:cargo" inherit cargo pkgconfig +# Explicit CARGO_HOME avoids cargo caching in the shared source tree +CARGO_HOME = "${WORKDIR}/cargo_home" + DEBUG_PREFIX_MAP += "-ffile-prefix-map=${RUSTSRC}/vendor=${TARGET_DBGSRC_DIR}" do_cargo_setup_snapshot () { @@ -32,9 +37,10 @@ do_cargo_setup_snapshot () { fi } -addtask cargo_setup_snapshot after do_unpack before do_configure +addtask cargo_setup_snapshot before do_configure do_cargo_setup_snapshot[dirs] += "${WORKDIR}/${CARGO_SNAPSHOT}" do_cargo_setup_snapshot[vardepsexclude] += "UNINATIVE_LOADER" +do_cargo_setup_snapshot[depends] += "rust-source-${PV}:do_unpack" do_compile:prepend () { export RUSTC_BOOTSTRAP="1" diff --git a/meta/recipes-devtools/rust/common-source.inc b/meta/recipes-devtools/rust/common-source.inc new file mode 100644 index 0000000000..a0d4dc542c --- /dev/null +++ b/meta/recipes-devtools/rust/common-source.inc @@ -0,0 +1,28 @@ +# common-source.inc - Disable source tasks for recipes using shared rust-source +# +# Recipes that include this file rely on rust-source-${PV} for fetching, +# unpacking, and patching the Rust source tree. This avoids duplicating the +# ~4.2 GB rustc-src tree per recipe variant (rust, cargo, libstd-rs and their +# native/nativesdk counterparts). + +# Disable local fetch/unpack/patch since rust-source-${PV} handles them +do_fetch() { + : +} +do_fetch[noexec] = "1" +deltask do_unpack +deltask do_patch + +# Clear SRC_URI to prevent fetcher warnings from stale URIs inherited via .inc +SRC_URI = "" + +# Ensure the shared source is fully ready before dependent tasks run +do_configure[depends] += "rust-source-${PV}:do_patch" +do_populate_lic[depends] += "rust-source-${PV}:do_unpack" +do_create_spdx[depends] += "rust-source-${PV}:do_patch" + +# The SPDX class uses is_work_shared_spdx() to detect shared workdirs. +# Since we redirect S rather than WORKDIR, the default detection fails. +# Override to always return True so SPDX processing works correctly. +def is_work_shared_spdx(d): + return True diff --git a/meta/recipes-devtools/rust/libstd-rs_1.96.1.bb b/meta/recipes-devtools/rust/libstd-rs_git.bb similarity index 92% rename from meta/recipes-devtools/rust/libstd-rs_1.96.1.bb rename to meta/recipes-devtools/rust/libstd-rs_git.bb index 2a5e977a5e..31d42a8525 100644 --- a/meta/recipes-devtools/rust/libstd-rs_1.96.1.bb +++ b/meta/recipes-devtools/rust/libstd-rs_git.bb @@ -5,6 +5,7 @@ LICENSE = "(MIT | Apache-2.0) & Unicode-3.0" LIC_FILES_CHKSUM = "file://../../COPYRIGHT;md5=11a3899825f4376896e438c8c753f8dc" require rust-source.inc +require common-source.inc # The dummy crate named `sysroot` represents the standard library target. # @@ -30,6 +31,9 @@ CARGO_FEATURES ?= "panic-unwind backtrace" CARGO_BUILD_FLAGS += "--features '${CARGO_FEATURES}'" CARGO_VENDORING_DIRECTORY = "${RUSTSRC}/vendor" +# Explicit CARGO_HOME avoids cargo caching in the shared source tree +CARGO_HOME = "${WORKDIR}/cargo_home" + do_compile:prepend () { # For Rust 1.13.0 and newer export RUSTC_BOOTSTRAP="1" diff --git a/meta/recipes-devtools/rust/rust-cross-canadian_1.96.1.bb b/meta/recipes-devtools/rust/rust-cross-canadian_git.bb similarity index 100% rename from meta/recipes-devtools/rust/rust-cross-canadian_1.96.1.bb rename to meta/recipes-devtools/rust/rust-cross-canadian_git.bb diff --git a/meta/recipes-devtools/rust/rust-source.bb b/meta/recipes-devtools/rust/rust-source.bb new file mode 100644 index 0000000000..ba696984b3 --- /dev/null +++ b/meta/recipes-devtools/rust/rust-source.bb @@ -0,0 +1,56 @@ +# rust-source.bb - Shared source recipe for the Rust toolchain +# +# This recipe fetches, unpacks, and patches the rustc source tree into a +# work-shared location so that rust, cargo, libstd-rs, and their native/nativesdk +# variants all share a single copy of the source. This eliminates duplication +# (up to 11 copies of the ~4.2 GB source tree in multilib + nativesdk builds) +# and significantly reduces disk usage (~46.2 GB -> ~4.2 GB for rustc-src). +# +# Only do_fetch, do_unpack, and do_patch are meaningful here. All other +# tasks are disabled since this recipe exists solely to provide sources. + +SUMMARY = "Rust compiler and runtime libaries" +HOMEPAGE = "http://www.rust-lang.org" +SECTION = "devel" +LICENSE = "(MIT | Apache-2.0) & Unicode-3.0" +LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=11a3899825f4376896e438c8c753f8dc" + +# This recipe only provides source; disable build/install/packaging tasks +deltask do_configure +deltask do_compile +deltask do_install +deltask do_populate_sysroot +deltask do_populate_lic + +# Prevent rm_work from removing the shared source tree +RM_WORK_EXCLUDE += "${PN}" + +require rust-source.inc +require rust-snapshot.inc + +inherit allarch nopackages + +PN = "rust-source-${PV}" +BPN = "rust-source" + +# Place WORKDIR under work-shared so all consumers reference the same location +WORKDIR = "${TMPDIR}/work-shared/rust-source-${PV}-${PR}" +SSTATE_SWSPEC = "sstate:rust-source::${PV}:${PR}::${SSTATE_VERSION}:" + +# Use work-shared stamp directory so sstate is shared across all architectures +STAMP = "${STAMPS_DIR}/work-shared/rust-source-${PV}-${PR}" +STAMPCLEAN = "${STAMPS_DIR}/work-shared/rust-source-${PV}-*" + +DEPENDS = "" +PACKAGES = "" +baselib = "lib" +PACKAGE_ARCH = "all" + +B = "${WORKDIR}/build" + +# rust-source.bb does not inherit rust-common.bbclass (it is allarch/nopackages +# and has no toolchain dependencies), so we define RUST_BUILD_ARCH locally for +# snapshot URL resolution in rust-snapshot.inc. +RUST_BUILD_ARCH = "${@{'ppc': 'powerpc', 'ppc64': 'powerpc64', 'ppc64le': 'powerpc64le', 'riscv64': 'riscv64gc'}.get(d.getVar('BUILD_ARCH'), d.getVar('BUILD_ARCH'))}" + +EXCLUDE_FROM_WORLD = "1" diff --git a/meta/recipes-devtools/rust/rust-source.inc b/meta/recipes-devtools/rust/rust-source.inc index 5678e00671..49207a3947 100644 --- a/meta/recipes-devtools/rust/rust-source.inc +++ b/meta/recipes-devtools/rust/rust-source.inc @@ -1,6 +1,12 @@ -RUST_VERSION ?= "${@d.getVar('PV').split('-')[0]}" +# Version is split into MAJOR_VER and MINOR_VER for easy bumping and +# to allow consistent use of PV across all consuming recipes. +MAJOR_VER = "1" +MINOR_VER = "96" +PATCH_VER = "1" -SRC_URI += "https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;name=rust \ +PV = "${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}" + +SRC_URI += "https://static.rust-lang.org/dist/rustc-${PV}-src.tar.xz;name=rust \ file://0001-Define-more-ioctl-codes-on-riscv32gc-unknown-linux-g.patch;patchdir=${RUSTSRC} \ file://rust-oe-selftest.patch;patchdir=${RUSTSRC} \ file://repro-issue-fix-with-cc-crate-hashmap.patch;patchdir=${RUSTSRC} \ @@ -13,7 +19,11 @@ SRC_URI += "https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;n " SRC_URI[rust.sha256sum] = "77a6ff3003a4ad0cb00697b043c879e3e1a15d945b1a1f63818903bfc3fa8b98" -RUSTSRC = "${UNPACKDIR}/rustc-${RUST_VERSION}-src" +# Point UNPACKDIR into the work-shared location so rust-source.bb and all +# consumers (via S/RUSTSRC) reference a single shared source tree. +UNPACKDIR = "${TMPDIR}/work-shared/rust-source-${PV}-${PR}/sources" +RUSTSRC = "${UNPACKDIR}/rustc-${PV}-src" +S = "${RUSTSRC}" UPSTREAM_CHECK_URI = "https://forge.rust-lang.org/infra/other-installation-methods.html" UPSTREAM_CHECK_REGEX = "rustc-(?P\d+(\.\d+)+)-src" diff --git a/meta/recipes-devtools/rust/rust_1.96.1.bb b/meta/recipes-devtools/rust/rust_git.bb similarity index 93% rename from meta/recipes-devtools/rust/rust_1.96.1.bb rename to meta/recipes-devtools/rust/rust_git.bb index 8b0f1d1459..da042ffaae 100644 --- a/meta/recipes-devtools/rust/rust_1.96.1.bb +++ b/meta/recipes-devtools/rust/rust_git.bb @@ -4,6 +4,10 @@ SECTION = "devel" LICENSE = "(MIT | Apache-2.0) & Unicode-3.0" LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=11a3899825f4376896e438c8c753f8dc" +require rust-source.inc +require rust-snapshot.inc +require common-source.inc + inherit rust inherit cargo_common @@ -24,6 +28,9 @@ INHIBIT_DEFAULT_RUST_DEPS:class-native = "1" PROVIDES:class-native = "virtual/${TARGET_PREFIX}rust" S = "${RUSTSRC}" +# Separate build directory from the shared source tree so that multiple +# variants (target, native, nativesdk) don't conflict in the source dir. +B = "${WORKDIR}/build" # Use at your own risk, accepted values are stable, beta and nightly RUST_CHANNEL ?= "stable" @@ -38,6 +45,9 @@ RUST_ALTERNATE_EXE_PATH_NATIVE = "${STAGING_BINDIR_NATIVE}/llvm-config" # own vendoring. CARGO_DISABLE_BITBAKE_VENDORING = "1" +# Explicit CARGO_HOME avoids cargo caching in the shared source tree +CARGO_HOME = "${WORKDIR}/cargo_home" + setup_cargo_environment () { # The first step is to build bootstrap and some early stage tools, # these are build for the same target as the snapshot, e.g. @@ -66,11 +76,11 @@ do_rust_setup_snapshot () { done fi } -addtask rust_setup_snapshot after do_unpack before do_configure +addtask rust_setup_snapshot before do_configure addtask do_test_compile after do_configure do_rust_gen_targets do_rust_setup_snapshot[dirs] += "${WORKDIR}/rust-snapshot" do_rust_setup_snapshot[vardepsexclude] += "UNINATIVE_LOADER" -do_rust_setup_snapshot[depends] += "patchelf-native:do_populate_sysroot" +do_rust_setup_snapshot[depends] += "patchelf-native:do_populate_sysroot rust-source-${PV}:do_unpack" RUSTC_BOOTSTRAP = "${STAGING_BINDIR_NATIVE}/rustc" CARGO_BOOTSTRAP = "${STAGING_BINDIR_NATIVE}/cargo" @@ -173,6 +183,12 @@ python do_configure() { # nothing about when trying to build some stage0 tools (like fabricate) config.set("build", "build", e(d.getVar("RUST_BUILD_SYS"))) + # Yocto's B (${WORKDIR}/build) is where config.toml lives. Rust's + # bootstrap creates its own build output directory inside B; name it + # "rust-build" to avoid ambiguity with Yocto's build directory and + # prevent a confusing build/build/ nesting. + config.set("build", "build-dir", e("rust-build")) + # [install] config.add_section("install") # ./x.py install doesn't have any notion of "destdir" @@ -223,13 +239,10 @@ rust_runx () { oe_cargo_fix_env - python3 src/bootstrap/bootstrap.py ${@oe.utils.parallel_make_argument(d, '-j %d')} "$@" --verbose + python3 ${S}/src/bootstrap/bootstrap.py ${@oe.utils.parallel_make_argument(d, '-j %d')} "$@" --verbose } rust_runx[vardepsexclude] += "PARALLEL_MAKE" -require rust-source.inc -require rust-snapshot.inc - INSANE_SKIP:${PN}:class-native = "already-stripped" FILES:${PN} += "${libdir}/rustlib" FILES:${PN} += "${libdir}/*.so" @@ -241,7 +254,7 @@ do_compile () { do_test_compile[dirs] = "${B}" do_test_compile () { replace_llvm_config_path - rust_runx build src/tools/remote-test-server --target "${RUST_TARGET_SYS}" + rust_runx build ${S}/src/tools/remote-test-server --target "${RUST_TARGET_SYS}" } ALLOW_EMPTY:${PN} = "1" @@ -282,7 +295,7 @@ rust_do_install:class-nativesdk() { install -d ${D}${bindir} for i in cargo-clippy clippy-driver rustfmt; do - cp build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/$i ${D}${bindir} + cp rust-build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/$i ${D}${bindir} patchelf --set-rpath "\$ORIGIN/../lib" ${D}${bindir}/$i done @@ -322,7 +335,7 @@ rust_do_install:class-target() { install -d ${D}${bindir} for i in ${EXTRA_TOOLS}; do - cp build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/$i ${D}${bindir} + cp rust-build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/$i ${D}${bindir} patchelf --set-rpath "\$ORIGIN/../lib" ${D}${bindir}/$i done