1import{_ as n,c as a,e,o as l}from"./app-CjUkjRdW.js";const i={};function t(o,s){return l(),a("div",null,s[0]||(s[0]=[e(`<h1 id="environment-setup" tabindex="-1"><a class="header-anchor" href="#environment-setup"><span>Environment Setup</span></a></h1><p>In this section, we'll set up our development environment. We'll be using <strong>Nim</strong> as our programming language, so obviously we'll need to install the <strong>Nim compiler</strong>. We also need a way to cross-compile to a freestanding environment. We'll use LLVM's <strong>clang</strong> and <strong>lld</strong> for that. Finally, we'll need a way to test our OS. We'll use <strong>QEMU</strong> for that.</p><h2 id="nim-compiler" tabindex="-1"><a class="header-anchor" href="#nim-compiler"><span>Nim compiler</span></a></h2><p>First, we need to install the <strong>Nim compiler</strong>. An easy way to install Nim is through the <strong>choosenim</strong> installer (or you can install it using your system's package manager), so let's install that first:</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash"><span class="token function">curl</span> https://nim-lang.org/choosenim/init.sh <span class="token parameter variable">-sSf</span> <span class="token operator">|</span> <span class="token function">sh</span></span></span></span> 2<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Then, we can install the latest stable version of Nim:</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">choosenim stable</span></span></span> 3<span class="line"><span class="token output">Downloading Nim 2.0.4 from nim-lang.org</span> 4<span class="line">...</span> 5<span class="line"></span> 6<span class="line"></span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">nim <span class="token parameter variable">-v</span></span></span></span> 7<span class="line"><span class="token output">Nim Compiler Version 2.0.4 [Linux: amd64]</span> 8<span class="line">...</span> 9<span class="line"></span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="llvm-toolchain" tabindex="-1"><a class="header-anchor" href="#llvm-toolchain"><span>LLVM toolchain</span></a></h2><p>Now that we have Nim installed, we need to install the <strong>LLVM</strong> toolchain. We'll use * <em>clang</em>* and <strong>lld</strong> to cross-compile to a UEFI environment.</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash"><span class="token function">sudo</span> pacman <span class="token parameter variable">-S</span> clang lld</span></span></span> 10<span class="line"><span class="token output">...</span> 11<span class="line"></span> 12<span class="line"></span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">clang <span class="token parameter variable">--version</span></span></span></span> 13<span class="line"><span class="token output">clang version 18.0.0</span> 14<span class="line">...</span> 15<span class="line"></span> 16<span class="line"></span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">ld.lld <span class="token parameter variable">--version</span></span></span></span> 17<span class="line"><span class="token output">LLD 18.0.0 (compatible with GNU linkers)</span> 18<span class="line"></span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="qemu" tabindex="-1"><a class="header-anchor" href="#qemu"><span>QEMU</span></a></h2><p>Next, let's install <strong>QEMU</strong> so that we can test our OS:</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash"><span class="token function">sudo</span> pacman <span class="token parameter variable">-S</span> qemu-desktop</span></span></span> 19<span class="line"><span class="token output">...</span> 20<span class="line"></span> 21<span class="line"></span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">qemu-system-x86_64 <span class="token parameter variable">--version</span></span></span></span> 22<span class="line"><span class="token output">QEMU emulator version 8.1.3</span> 23<span class="line">...</span> 24<span class="line"></span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="creating-the-project" tabindex="-1"><a class="header-anchor" href="#creating-the-project"><span>Creating the project</span></a></h2><p>Now that we have our environment set up, we can create our project. We'll start by creating a new directory for our project:</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash"><span class="token function">mkdir</span> fusion <span class="token operator">&&</span> <span class="token builtin class-name">cd</span> fusion</span></span></span> 25<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Next, we'll create a new <strong>nimble</strong> project with binary package type:</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">nimble init</span></span></span> 26<span class="line"><span class="token output">...</span> 27<span class="line"> Prompt: Package type?</span> 28<span class="line"> ... Library - provides functionality for other packages.</span> 29<span class="line"> ... Binary - produces an executable for the end-user.</span> 30<span class="line"> ... Hybrid - combination of library and binary</span> 31<span class="line"> ... For more information see https://goo.gl/cm2RX5</span> 32<span class="line"> Select Cycle with 'Tab', 'Enter' when done</span> 33<span class="line"> Answer: binary</span> 34<span class="line">...</span> 35<span class="line"></span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Let's also create a <code>build</code> directory for our build artifacts and add it to <code>.gitignore</code>:</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash"><span class="token function">mkdir</span> build</span></span></span> 36<span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash"><span class="token builtin class-name">echo</span> build <span class="token operator">>></span> .gitignore</span></span></span> 37<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>Now that we have our project set up, let's move on to setting up our build to target the UEFI environment.</p>`,21)]))}const r=n(i,[["render",t],["__file","02-environment-setup.html.vue"]]),c=JSON.parse(`{"path":"/osdev/02-environment-setup.html","title":"Environment Setup","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Nim compiler","slug":"nim-compiler","link":"#nim-compiler","children":[]},{"level":2,"title":"LLVM toolchain","slug":"llvm-toolchain","link":"#llvm-toolchain","children":[]},{"level":2,"title":"QEMU","slug":"qemu","link":"#qemu","children":[]},{"level":2,"title":"Creating the project","slug":"creating-the-project","link":"#creating-the-project","children":[]}
37],"git":{"updatedTime":1744638230000},"filePathRelative":"osdev/02-environment-setup.md","excerpt":"\\n<p>In this section, we'll set up our development environment. We'll be using <strong>Nim</strong> as our\\nprogramming language, so obviously we'll need to install the <strong>Nim compiler</strong>. We also\\nneed a way to cross-compile to a freestanding environment. We'll use LLVM's <strong>clang</strong> and\\n<strong>lld</strong> for that. Finally, we'll need a way to test our OS. We'll use <strong>QEMU</strong> for that.</p>"}`);export{r as comp,c as data};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.