XGQT's blog: Posts tagged 'ebuild'
urn:https-xgqt-gitlab-io:-blog-tags-ebuild-html
2023-02-24T00:00:00Z
Ebuild lit tests
urn:https-xgqt-gitlab-io:-blog-posts-2023-02-24-ebuild-lit-tests
2023-02-24T00:00:00Z
2023-02-24T00:00:00Z
Maciej Barć
<h1 id="patching">Patching</h1>
<p>The file <code>lit.site.cfg</code> has to be inspected for any incorrect calls to executables. For example see <code>src_prepare</code> function form <a href="https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-lang/boogie">dev-lang/boogie</a>.</p>
<h1 id="eclasses">Eclasses</h1>
<p>Because we will need to specify how many threads should <code>lit</code> run we need to inherit <code>multiprocessing</code> to detect how many parallel jobs the portage config sets.</p>
<div class="brush: shell">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span></pre></div></td>
<td class="code">
<div>
<pre><span></span>inherit<span class="w"> </span>multiprocessing
</pre></div></td></tr></tbody></table></div>
</div>
<h1 id="dependencies">Dependencies</h1>
<p>Ensure that <code>dev-python/lit</code> is in <code>BDEPEND</code>, but also additional packages may be needed, for example <code>dev-python/OutputCheck</code>.</p>
<div class="brush: shell">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span></pre></div></td>
<td class="code">
<div>
<pre><span></span><span class="nv">BDEPEND</span><span class="o">=</span><span class="s2">"</span>
<span class="s2"> </span><span class="si">${</span><span class="nv">RDEPEND</span><span class="si">}</span>
<span class="s2"> test? (</span>
<span class="s2"> dev-python/lit</span>
<span class="s2"> dev-python/OutputCheck</span>
<span class="s2"> )</span>
<span class="s2">"</span>
</pre></div></td></tr></tbody></table></div>
</div>
<h1 id="bad-tests">Bad tests</h1>
<p>To deal with bad test you can simply remove the files causing the failures.</p>
<div class="brush: shell">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span>
<span class="normal">9</span></pre></div></td>
<td class="code">
<div>
<pre><span></span><span class="nb">local</span><span class="w"> </span>-a<span class="w"> </span><span class="nv">bad_tests</span><span class="o">=(</span>
<span class="w"> </span>civl/inductive-sequentialization/BroadcastConsensus.bpl
<span class="w"> </span>civl/inductive-sequentialization/PingPong.bpl
<span class="w"> </span>livevars/bla1.bpl
<span class="o">)</span>
<span class="nb">local</span><span class="w"> </span>bad_test
<span class="k">for</span><span class="w"> </span>bad_test<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="si">${</span><span class="nv">bad_tests</span><span class="p">[@]</span><span class="si">}</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span>rm<span class="w"> </span><span class="s2">"</span><span class="si">${</span><span class="nv">S</span><span class="si">}</span><span class="s2">"</span>/Test/<span class="si">${</span><span class="nv">bad_test</span><span class="si">}</span><span class="w"> </span><span class="o">||</span><span class="w"> </span>die
<span class="k">done</span>
</pre></div></td></tr></tbody></table></div>
</div>
<h1 id="test-phase">Test phase</h1>
<p><code>--threads $(makeopts_jobs)</code> specifies how many parallel tests to run.</p>
<p><code>--verbose</code> option will show output of failed tests.</p>
<p>Last <code>lit</code> argument specifies where <code>lit</code> should look for <code>lit.site.cfg</code> and tests.</p>
<div class="brush: shell">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td>
<td class="code">
<div>
<pre><span></span>src_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span>lit<span class="w"> </span>--threads<span class="w"> </span><span class="k">$(</span>makeopts_jobs<span class="k">)</span><span class="w"> </span>--verbose<span class="w"> </span><span class="s2">"</span><span class="si">${</span><span class="nv">S</span><span class="si">}</span><span class="s2">"</span>/Test<span class="w"> </span><span class="o">||</span><span class="w"> </span>die
<span class="o">}</span>
</pre></div></td></tr></tbody></table></div>
</div>
Ebuild-mode
urn:https-xgqt-gitlab-io:-blog-posts-2022-12-30-ebuild-mode
2022-12-30T00:00:00Z
2022-12-30T00:00:00Z
Maciej Barć
<h1 id="portage">Portage</h1>
<p>Configure the following for Portage.</p>
<div class="brush: conf">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span></pre></div></td>
<td class="code">
<div>
<pre><span></span>dev-util/pkgcheck emacs
</pre></div></td></tr></tbody></table></div>
</div>
<h2 id="emerge">Emerge</h2>
<p>Emerge the following packages:</p>
<ul>
<li><code>app-emacs/company-ebuild</code></li>
<li><code>dev-util/pkgcheck</code></li></ul>
<p>Company-Ebuild should pull in <code>app-emacs/ebuild-mode</code>, if that does not happen, then report a bug ;-D</p>
<h1 id="standard">Standard</h1>
<p>Add the following to your user's Emacs initialization file. The initialization file is either <code>~/.emacs.d/init.el</code> or <code>~/.config/emacs/init.el</code> for newer versions of GNU Emacs.</p>
<div class="brush: elisp">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span></pre></div></td>
<td class="code">
<div>
<pre><span></span><span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'ebuild-mode</span><span class="p">)</span>
<span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'company-ebuild</span><span class="p">)</span>
<span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'flycheck</span><span class="p">)</span>
<span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'flycheck-pkgcheck</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-hook</span><span class="w"> </span><span class="ss">'ebuild-mode-hook</span><span class="w"> </span><span class="ss">'company-ebuild-setup</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-hook</span><span class="w"> </span><span class="ss">'ebuild-mode-hook</span><span class="w"> </span><span class="ss">'flycheck-mode</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-hook</span><span class="w"> </span><span class="ss">'ebuild-mode-hook</span><span class="w"> </span><span class="ss">'flycheck-pkgcheck-setup</span><span class="p">)</span>
</pre></div></td></tr></tbody></table></div>
</div>
<h1 id="use-package">Use-Package</h1>
<p>We can also configure our environment using a <code>use-package</code> macro that simplifies the setup a little bit.</p>
<p>To use the below configuration the <code>app-emacs/use-package</code> package will have to be installed.</p>
<div class="brush: elisp">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span>
<span class="normal">9</span></pre></div></td>
<td class="code">
<div>
<pre><span></span><span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'use-package</span><span class="p">)</span>
<span class="p">(</span><span class="nb">use-package</span><span class="w"> </span><span class="nv">ebuild-mode</span>
<span class="w"> </span><span class="nb">:defer</span><span class="w"> </span><span class="no">t</span>
<span class="w"> </span><span class="nb">:mode</span><span class="w"> </span><span class="s">"\\.\\(ebuild\\|eclass\\)\\'"</span>
<span class="w"> </span><span class="nb">:hook</span>
<span class="w"> </span><span class="p">((</span><span class="nv">ebuild-mode</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="nv">company-ebuild-setup</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="nv">ebuild-mode</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="nv">flycheck-mode</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="nv">ebuild-mode</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="nv">flycheck-pkgcheck-setup</span><span class="p">)))</span>
</pre></div></td></tr></tbody></table></div>
</div>
<p>The <code>:defer t</code> and <code>:mode "..."</code> enable deferred loading which theoretically speeds up GNU Emacs initialization time at the cost of running the whole <code>use-package</code> block of <code>ebuild-mode</code> configuration when the <code>:mode</code> condition is met.</p>
src_snapshot
urn:https-xgqt-gitlab-io:-blog-posts-2022-12-30-src-snapshot
2022-12-30T00:00:00Z
2022-12-30T00:00:00Z
Maciej Barć
<h1 id="prototype">Prototype</h1>
<p>Recently while browsing the Alpine git repo I noticed they have a function called <code>snapshot</code>, see: <a href="https://git.alpinelinux.org/aports/tree/testing/dart/APKBUILD#n45">https://git.alpinelinux.org/aports/tree/testing/dart/APKBUILD#n45</a> I am not 100% sure about how that works but a wild guess is that the developers can run that function to fetch the sources and maybe later upload them to the Alpine repo or some sort of (cloud?) storage.</p>
<p>In Portage there exists a <code>pkg_config</code> function used to run miscellaneous configuration for packages. The only major difference between <code>src_snapshot</code> and that would of course be that users would never run <code>snapshot</code>.</p>
<h2 id="sandbox">Sandbox</h2>
<p>Probably only the <code>network sandbox</code> would have to be lifted out… to fetch the sources of course.</p>
<p>But also a few (at least one?) special directories and variables would be useful.</p>
Pkgcheck-Flycheck
urn:https-xgqt-gitlab-io:-blog-posts-2022-08-06-pkgcheck-flycheck
2022-08-06T00:00:00Z
2022-08-06T00:00:00Z
Maciej Barć
<h1 id="news">News</h1>
<h2 id="repository">Repository</h2>
<p>With <a href="https://github.com/pkgcore/pkgcheck/commit/9089bd15a89db904e62a2b1a5db6c24b281676a0/">this commit</a> first <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a> integration was merged into the <a href="https://pkgcore.github.io/pkgcheck/">pkgcheck</a> repository.</p>
<h2 id="history">History</h2>
<ul>
<li><a href="https://github.com/pkgcore/pkgcheck/issues/417">https://github.com/pkgcore/pkgcheck/issues/417</a></li>
<li><a href="https://github.com/pkgcore/pkgcheck/pull/420">https://github.com/pkgcore/pkgcheck/pull/420</a></li>
<li><a href="https://github.com/gentoo/gentoo/pull/26700">https://github.com/gentoo/gentoo/pull/26700</a></li></ul>
<h2 id="thanks">Thanks</h2>
<p>Huge thanks to <a href="https://github.com/thesamesam/">Sam James</a> and <a href="https://github.com/arthurzam/">Arthur Zamarin</a> for support and interest in getting this feature done.</p>
<h1 id="installation">Installation</h1>
<h2 id="unmasking">Unmasking</h2>
<p>The Flycheck integration is unreleased as of now, this will (hopefully) change in the future, but for now You need live versions of <code>snakeoil</code>, <code>pkgcore</code> and <code>pkgcheck</code>.</p>
<p>File: <code>/etc/portage/package.accept_keywords/pkgcore.conf</code></p>
<div class="brush: conf">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td>
<td class="code">
<div>
<pre><span></span>dev-python/snakeoil **
sys-apps/pkgcore **
dev-util/pkgcheck **
</pre></div></td></tr></tbody></table></div>
</div>
<p>Also You will need to unmask <code>app-emacs/flycheck</code> and its dependencies.</p>
<p>File: <code>/etc/portage/package.accept_keywords/emacs.conf</code></p>
<div class="brush: conf">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td>
<td class="code">
<div>
<pre><span></span>app-emacs/epl
app-emacs/pkg-info
app-emacs/flycheck
</pre></div></td></tr></tbody></table></div>
</div>
<h2 id="emerging">Emerging</h2>
<p>Install pkgcheck with the <code>emacs</code> USE flag enabled.</p>
<p>File: <code>/etc/portage/package.use/pkgcore.conf</code></p>
<div class="brush: conf">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span></pre></div></td>
<td class="code">
<div>
<pre><span></span>dev-util/pkgcheck emacs
</pre></div></td></tr></tbody></table></div>
</div>
<p>Afterwards run:</p>
<div class="brush: shell">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span></pre></div></td>
<td class="code">
<div>
<pre><span></span>emerge<span class="w"> </span>-1av<span class="w"> </span>dev-python/snakeoil<span class="w"> </span>sys-apps/pkgcore<span class="w"> </span>dev-util/pkgcheck
emerge<span class="w"> </span>-av<span class="w"> </span>--noreplace<span class="w"> </span>dev-util/pkgcheck
</pre></div></td></tr></tbody></table></div>
</div>
<h1 id="configuration">Configuration</h1>
<p>Following is what I would suggest to put into your Emacs config file:</p>
<div class="brush: elisp">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span></pre></div></td>
<td class="code">
<div>
<pre><span></span><span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'ebuild-mode</span><span class="p">)</span>
<span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'flycheck</span><span class="p">)</span>
<span class="p">(</span><span class="nb">require</span><span class="w"> </span><span class="ss">'flycheck-pkgcheck</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span><span class="w"> </span><span class="nv">flycheck-pkgcheck-enable</span><span class="w"> </span><span class="no">t</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-hook</span><span class="w"> </span><span class="ss">'ebuild-mode-hook</span><span class="w"> </span><span class="ss">'flycheck-mode</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-hook</span><span class="w"> </span><span class="ss">'ebuild-mode-hook</span><span class="w"> </span><span class="ss">'flycheck-pkgcheck-setup</span><span class="p">)</span>
</pre></div></td></tr></tbody></table></div>
</div>
<p>If You are using <code>use-package</code>:</p>
<div class="brush: elisp">
<div class="source">
<table class="sourcetable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span></pre></div></td>
<td class="code">
<div>
<pre><span></span><span class="p">(</span><span class="nb">use-package</span><span class="w"> </span><span class="nv">flycheck</span>
<span class="w"> </span><span class="nb">:ensure</span><span class="w"> </span><span class="no">nil</span><span class="p">)</span>
<span class="p">(</span><span class="nb">use-package</span><span class="w"> </span><span class="nv">ebuild-mode</span>
<span class="w"> </span><span class="nb">:ensure</span><span class="w"> </span><span class="no">nil</span>
<span class="w"> </span><span class="nb">:hook</span><span class="w"> </span><span class="p">((</span><span class="nv">ebuild-mode</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="nv">flycheck-mode</span><span class="p">)))</span>
<span class="p">(</span><span class="nb">use-package</span><span class="w"> </span><span class="nv">flycheck-pkgcheck</span>
<span class="w"> </span><span class="nb">:ensure</span><span class="w"> </span><span class="no">nil</span>
<span class="w"> </span><span class="nb">:custom</span><span class="w"> </span><span class="p">((</span><span class="nv">flycheck-pkgcheck-enable</span><span class="w"> </span><span class="no">t</span><span class="p">))</span>
<span class="w"> </span><span class="nb">:hook</span><span class="w"> </span><span class="p">((</span><span class="nv">ebuild-mode</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="nv">flycheck-pkgcheck-setup</span><span class="p">)))</span>
</pre></div></td></tr></tbody></table></div>
</div>
<p>The lines with <code>:ensure nil</code> are there to prevent <code>use-package</code> from trying to download the particular package from Elpa (because we use system packages for this configuration).</p>