PageSourceSearch

https://0xc0ffee.netlify.app/assets/02-environment-setup.html-BS0R6F3x.js

js 0xc0ffee.netlify.app collected 2026-10-03 10:23:06 UTC 10,753 bytes, 37 lines download raw bytes

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&#39;ll set up our development environment. We&#39;ll be using <strong>Nim</strong> as our programming language, so obviously we&#39;ll need to install the <strong>Nim compiler</strong>. We also need a way to cross-compile to a freestanding environment. We&#39;ll use LLVM&#39;s <strong>clang</strong> and <strong>lld</strong> for that. Finally, we&#39;ll need a way to test our OS. We&#39;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&#39;s package manager), so let&#39;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&#39;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&#39;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&#39;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">&amp;&amp;</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&#39;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 &#39;Tab&#39;, &#39;Enter&#39; 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&#39;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">&gt;&gt;</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&#39;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.