blob: 8614a102d146c55af367ca4db50de506812e4e4a [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en" class="light sidebar-visible" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>Getting Started - Rust Compiler Development Guide</title>
<!-- Custom HTML head -->
<meta name="description" content="A guide to developing the Rust compiler (rustc)">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="favicon.svg">
<link rel="shortcut icon" href="favicon.png">
<link rel="stylesheet" href="css/variables.css">
<link rel="stylesheet" href="css/general.css">
<link rel="stylesheet" href="css/chrome.css">
<link rel="stylesheet" href="css/print.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" id="highlight-css" href="highlight.css">
<link rel="stylesheet" id="tomorrow-night-css" href="tomorrow-night.css">
<link rel="stylesheet" id="ayu-highlight-css" href="ayu-highlight.css">
<!-- Custom theme stylesheets -->
<!-- Provide site root and default themes to javascript -->
<script>
const path_to_root = "";
const default_light_theme = "light";
const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="toc.js"></script>
</head>
<body>
<div id="body-container">
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
let theme = localStorage.getItem('mdbook-theme');
let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
html.classList.remove('light')
html.classList.add(theme);
html.classList.add("js");
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
<script>
let sidebar = null;
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
sidebar_toggle.checked = sidebar === 'visible';
html.classList.remove('sidebar-visible');
html.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<!-- populated by js -->
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
<noscript>
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
</noscript>
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
</div>
</nav>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</label>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
</ul>
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
<i class="fa fa-search"></i>
</button>
</div>
<h1 class="menu-title">Rust Compiler Development Guide</h1>
<div class="right-buttons">
<a href="print.html" title="Print this book" aria-label="Print this book">
<i id="print-button" class="fa fa-print"></i>
</a>
<a href="https://github.com/rust-lang/rustc-dev-guide" title="Git repository" aria-label="Git repository">
<i id="git-repository-button" class="fa fa-github"></i>
</a>
<a href="https://github.com/rust-lang/rustc-dev-guide/edit/master/src/getting-started.md" title="Suggest an edit" aria-label="Suggest an edit">
<i id="git-edit-button" class="fa fa-edit"></i>
</a>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults">
</ul>
</div>
</div>
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
<script>
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
</script>
<div id="content" class="content">
<main>
<h1 id="getting-started"><a class="header" href="#getting-started">Getting Started</a></h1>
<p>Thank you for your interest in contributing to Rust! There are many ways to
contribute, and we appreciate all of them.</p>
<ul>
<li><a href="#asking-questions">Asking Questions</a>
<ul>
<li><a href="#experts">Experts</a></li>
<li><a href="#etiquette">Etiquette</a></li>
</ul>
</li>
<li><a href="#what-should-i-work-on">What should I work on?</a>
<ul>
<li><a href="#easy-or-mentored-issues">Easy or mentored issues</a></li>
<li><a href="#recurring-work">Recurring work</a></li>
<li><a href="#clippy-issues">Clippy issues</a></li>
<li><a href="#diagnostic-issues">Diagnostic issues</a></li>
<li><a href="#picking-up-abandoned-pull-requests">Picking up abandoned pull requests</a></li>
<li><a href="#writing-tests">Writing tests</a></li>
<li><a href="#contributing-to-std-standard-library">Contributing to std (standard library)</a></li>
<li><a href="#contributing-code-to-other-rust-projects">Contributing code to other Rust projects</a></li>
<li><a href="#other-ways-to-contribute">Other ways to contribute</a></li>
</ul>
</li>
<li><a href="#cloning-and-building">Cloning and Building</a></li>
<li><a href="#contributor-procedures">Contributor Procedures</a></li>
<li><a href="#other-resources">Other Resources</a></li>
</ul>
<p>If this is your first time contributing, the <a href="./walkthrough.html">walkthrough</a> chapter can give you a good example of
how a typical contribution would go.</p>
<p>This documentation is <em>not</em> intended to be comprehensive; it is meant to be a
quick guide for the most useful things. For more information, <a href="./building/how-to-build-and-run.html">see this
chapter on how to build and run the compiler</a>.</p>
<h2 id="asking-questions"><a class="header" href="#asking-questions">Asking Questions</a></h2>
<p>If you have questions, please make a post on the <a href="https://rust-lang.zulipchat.com">Rust Zulip server</a> or
<a href="https://internals.rust-lang.org">internals.rust-lang.org</a>. If you are contributing to Rustup, be aware they are not on
Zulip - you can ask questions in <code>#wg-rustup</code> <a href="http://discord.gg/rust-lang">on Discord</a>.
See the <a href="https://www.rust-lang.org/governance">list of teams and working groups</a> and <a href="https://www.rust-lang.org/community">the Community page</a> on the
official website for more resources.</p>
<p>As a reminder, all contributors are expected to follow our <a href="https://www.rust-lang.org/policies/code-of-conduct">Code of Conduct</a>.</p>
<p>The compiler team (or <code>t-compiler</code>) usually hangs out in Zulip <a href="https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler">in this
"stream"</a>; it will be easiest to get questions answered there.</p>
<p><strong>Please ask questions!</strong> A lot of people report feeling that they are "wasting
expert time", but nobody on <code>t-compiler</code> feels this way. Contributors are
important to us.</p>
<p>Also, if you feel comfortable, prefer public topics, as this means others can
see the questions and answers, and perhaps even integrate them back into this
guide :)</p>
<h3 id="experts"><a class="header" href="#experts">Experts</a></h3>
<p>Not all <code>t-compiler</code> members are experts on all parts of <code>rustc</code>; it's a
pretty large project. To find out who could have some expertise on
different parts of the compiler, <a href="https://github.com/rust-lang/rust/blob/master/triagebot.toml">consult triagebot assign groups</a>.
The sections that start with <code>[assign*</code> in <code>triagebot.toml</code> file.
But also, feel free to ask questions even if you can't figure out who to ping.</p>
<p>Another way to find experts for a given part of the compiler is to see who has made recent commits.
For example, to find people who have recently worked on name resolution since the 1.68.2 release,
you could run <code>git shortlog -n 1.68.2.. compiler/rustc_resolve/</code>. Ignore any commits starting with
"Rollup merge" or commits by <code>@bors</code> (see <a href="./contributing.html#ci">CI contribution procedures</a> for
more information about these commits).</p>
<h3 id="etiquette"><a class="header" href="#etiquette">Etiquette</a></h3>
<p>We do ask that you be mindful to include as much useful information as you can
in your question, but we recognize this can be hard if you are unfamiliar with
contributing to Rust.</p>
<p>Just pinging someone without providing any context can be a bit annoying and
just create noise, so we ask that you be mindful of the fact that the
<code>t-compiler</code> folks get a lot of pings in a day.</p>
<h2 id="what-should-i-work-on"><a class="header" href="#what-should-i-work-on">What should I work on?</a></h2>
<p>The Rust project is quite large and it can be difficult to know which parts of the project need
help, or are a good starting place for beginners. Here are some suggested starting places.</p>
<h3 id="easy-or-mentored-issues"><a class="header" href="#easy-or-mentored-issues">Easy or mentored issues</a></h3>
<p>If you're looking for somewhere to start, check out the following <a href="https://github.com/issues?q=is%3Aopen+is%3Aissue+org%3Arust-lang+no%3Aassignee+label%3AE-easy%2C%22good+first+issue%22%2Cgood-first-issue%2CE-medium%2CEasy%2CE-help-wanted%2CE-mentor+-label%3AS-blocked+-linked%3Apr+">issue
search</a>. See the <a href="./contributing.html#issue-triage">Triage</a> for an explanation of these labels. You can also try
filtering the search to areas you're interested in. For example:</p>
<ul>
<li><code>repo:rust-lang/rust-clippy</code> will only show clippy issues</li>
<li><code>label:T-compiler</code> will only show issues related to the compiler</li>
<li><code>label:A-diagnostics</code> will only show diagnostic issues</li>
</ul>
<p>Not all important or beginner work has issue labels.
See below for how to find work that isn't labelled.</p>
<h3 id="recurring-work"><a class="header" href="#recurring-work">Recurring work</a></h3>
<p>Some work is too large to be done by a single person. In this case, it's common to have "Tracking
issues" to co-ordinate the work between contributors. Here are some example tracking issues where
it's easy to pick up work without a large time commitment:</p>
<ul>
<li><a href="https://github.com/rust-lang/rust/issues/73494">Move UI tests to subdirectories</a></li>
</ul>
<p>If you find more recurring work, please feel free to add it here!</p>
<h3 id="clippy-issues"><a class="header" href="#clippy-issues">Clippy issues</a></h3>
<p>The <a href="https://doc.rust-lang.org/clippy/">Clippy</a> project has spent a long time making its contribution process as friendly to newcomers
as possible. Consider working on it first to get familiar with the process and the compiler
internals.</p>
<p>See <a href="https://github.com/rust-lang/rust-clippy/blob/master/CONTRIBUTING.md">the Clippy contribution guide</a> for instructions on getting started.</p>
<h3 id="diagnostic-issues"><a class="header" href="#diagnostic-issues">Diagnostic issues</a></h3>
<p>Many diagnostic issues are self-contained and don't need detailed background knowledge of the
compiler. You can see a list of diagnostic issues <a href="https://github.com/rust-lang/rust/issues?q=is%3Aissue+is%3Aopen+label%3AA-diagnostics+no%3Aassignee">here</a>.</p>
<h3 id="picking-up-abandoned-pull-requests"><a class="header" href="#picking-up-abandoned-pull-requests">Picking up abandoned pull requests</a></h3>
<p>Sometimes, contributors send a pull request, but later find out that they don't have enough
time to work on it, or they simply are not interested in it anymore. Such PRs are often
eventually closed and they receive the <code>S-inactive</code> label. You could try to examine some of
these PRs and pick up the work. You can find the list of such PRs <a href="https://github.com/rust-lang/rust/pulls?q=is%3Apr+label%3AS-inactive+is%3Aclosed">here</a>.</p>
<p>If the PR has been implemented in some other way in the meantime, the <code>S-inactive</code> label
should be removed from it. If not, and it seems that there is still interest in the change,
you can try to rebase the pull request on top of the latest <code>master</code> branch and send a new
pull request, continuing the work on the feature.</p>
<h3 id="writing-tests"><a class="header" href="#writing-tests">Writing tests</a></h3>
<p>Issues that have been resolved but do not have a regression test are marked with the <code>E-needs-test</code> label. Writing unit tests is a low-risk, lower-priority task that offers new contributors a great opportunity to familiarize themselves with the testing infrastructure and contribution workflow.</p>
<h3 id="contributing-to-std-standard-library"><a class="header" href="#contributing-to-std-standard-library">Contributing to std (standard library)</a></h3>
<p>See <a href="https://std-dev-guide.rust-lang.org/">std-dev-guide</a>.</p>
<h3 id="contributing-code-to-other-rust-projects"><a class="header" href="#contributing-code-to-other-rust-projects">Contributing code to other Rust projects</a></h3>
<p>There are a bunch of other projects that you can contribute to outside of the
<code>rust-lang/rust</code> repo, including <code>cargo</code>, <code>miri</code>, <code>rustup</code>, and many others.</p>
<p>These repos might have their own contributing guidelines and procedures. Many
of them are owned by working groups. For more info, see the documentation in those repos' READMEs.</p>
<h3 id="other-ways-to-contribute"><a class="header" href="#other-ways-to-contribute">Other ways to contribute</a></h3>
<p>There are a bunch of other ways you can contribute, especially if you don't
feel comfortable jumping straight into the large <code>rust-lang/rust</code> codebase.</p>
<p>The following tasks are doable without much background knowledge but are
incredibly helpful:</p>
<ul>
<li><a href="./contributing.html#writing-documentation">Writing documentation</a>: if you are feeling a bit more intrepid, you could try
to read a part of the code and write doc comments for it. This will help you
to learn some part of the compiler while also producing a useful artifact!</li>
<li><a href="./contributing.html#issue-triage">Triaging issues</a>: categorizing, replicating, and minimizing issues is very helpful to the Rust maintainers.</li>
<li><a href="https://rust-lang.github.io/compiler-team/working-groups/">Working groups</a>: there are a bunch of working groups on a wide variety
of rust-related things.</li>
<li>Answer questions in the <em>Get Help!</em> channels on the <a href="http://discord.gg/rust-lang">Rust Discord
server</a>, on <a href="https://users.rust-lang.org/">users.rust-lang.org</a>, or on
<a href="http://stackoverflow.com/questions/tagged/rust">StackOverflow</a>.</li>
<li>Participate in the <a href="https://github.com/rust-lang/rfcs">RFC process</a>.</li>
<li>Find a <a href="https://github.com/rust-lang/rfcs/labels/A-community-library">requested community library</a>, build it, and publish
it to <a href="http://crates.io">Crates.io</a>. Easier said than done, but very, very
valuable!</li>
</ul>
<h2 id="cloning-and-building"><a class="header" href="#cloning-and-building">Cloning and Building</a></h2>
<p>See <a href="./building/how-to-build-and-run.html">"How to build and run the compiler"</a>.</p>
<h2 id="contributor-procedures"><a class="header" href="#contributor-procedures">Contributor Procedures</a></h2>
<p>This section has moved to the <a href="./contributing.html">"Contribution Procedures"</a> chapter.</p>
<h2 id="other-resources"><a class="header" href="#other-resources">Other Resources</a></h2>
<p>This section has moved to the <a href="./about-this-guide.html#other-places-to-find-information">"About this guide"</a> chapter.</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="next prefetch" href="about-this-guide.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a rel="next prefetch" href="about-this-guide.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
</div>
<script>
window.playground_copyable = true;
</script>
<script src="elasticlunr.min.js"></script>
<script src="mark.min.js"></script>
<script src="searcher.js"></script>
<script src="clipboard.min.js"></script>
<script src="highlight.js"></script>
<script src="book.js"></script>
<!-- Custom JS scripts -->
<script src="mermaid.min.js"></script>
<script src="mermaid-init.js"></script>
</div>
</body>
</html>