<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ruslan&#39;s Tech Blog</title>
    <link>https://blog.bekenev.net/tags/make.html</link>
    <description>Software development related stuff</description>
    <language>en-us</language>
    <lastBuildDate>Sat, 16 Apr 2022 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.bekenev.net/tags/make/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Makefile -&gt; Taskfile</title>
      <link>https://blog.bekenev.net/2022/04/16/makefile-taskfile.html</link>
      <pubDate>Sat, 16 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.bekenev.net/2022/04/16/makefile-taskfile.html</guid>
      <description>&lt;h2 id=&#34;makefile&#34;&gt;Makefile&lt;/h2&gt;&#xA;&lt;p&gt;I add a Makefile to every project I work with. I don&amp;rsquo;t usually work on C/C++ projects or any other compiled languages but Makefile is good to make aliases for long commands.&lt;/p&gt;&#xA;&lt;p&gt;Here is an example of short version of Makefile I use:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;.PHONY&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; up&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;up&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;docker-compose up -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;.PHONY&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; logs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tail -f ./storage/logs/*.log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are set of aliases / mnemonics that I used to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;make up&lt;/code&gt; - start the project. May be docker-compose or set of commands to turn the project into &amp;ldquo;running&amp;rdquo; state&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;make down&lt;/code&gt; - stop everything &lt;code&gt;make up&lt;/code&gt; did&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;make tags&lt;/code&gt; - generate tags&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;make logs&lt;/code&gt; - watch logs where ever they are&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Since I work with multiple languages and frameworks, thanks to this approach, I don&amp;rsquo;t need to remember how to start a project, how to compile JS files, how to read logs, etc&amp;hellip; All those commands are hidden under &lt;code&gt;make&lt;/code&gt; targets.&lt;/p&gt;&#xA;&lt;p&gt;On the other hand Makefiles aren&amp;rsquo;t designed for such use. &lt;code&gt;make&lt;/code&gt; is super powerful tool and using it as an alias system just feels wrong.&lt;/p&gt;&#xA;&lt;h2 id=&#34;taskfile&#34;&gt;Taskfile&lt;/h2&gt;&#xA;&lt;p&gt;Taskfile - is just a shell script where you can define functions to call.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; up &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    podman-compose up -d --build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; down &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    podman-compose down&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; npm &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    podman run -it -v &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;pwd&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:/app -w /app node:latest npm $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; composer &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    podman-compose exec app composer $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIMEFORMAT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Task completed in %3lR&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;@&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;default&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Place this file in your project root, make it executable and you can call those aliases with &lt;code&gt;./Taskfile up&lt;/code&gt; or &lt;code&gt;./Taskfile composer install&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;To simplify this a bit add this line to you bashrc/zshrc:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias run&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;./Taskfile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can call all those commands as &lt;code&gt;run up&lt;/code&gt; or &lt;code&gt;run composer install&lt;/code&gt;.&#xA;Pretty handy.&lt;/p&gt;&#xA;&lt;p&gt;This idea was borrowed from &lt;a href=&#34;https://github.com/adriancooney&#34;&gt;Adrian Cooney&lt;/a&gt; and his &lt;a href=&#34;https://github.com/adriancooney/Taskfile&#34;&gt;Taskfile repo&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Make list targets [memo]</title>
      <link>https://blog.bekenev.net/2018/01/08/make-list-targets.html</link>
      <pubDate>Mon, 08 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://blog.bekenev.net/2018/01/08/make-list-targets.html</guid>
      <description>&lt;p&gt;Here is small note about the target I put in every Makefile I have.&lt;/p&gt;&#xA;&lt;p&gt;The target is called &lt;code&gt;list&lt;/code&gt; and looks like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;.PHONY&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;MAKE&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -pRrq -f &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;lastword &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;MAKEFILE_LIST&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt; : 2&amp;gt;/dev/null | awk -v RS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; -F: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/^# File/,/^# Finished Make data base/ {if ($$1 !~ &amp;#34;^[#.]&amp;#34;) {print $$1}}&amp;#39;&lt;/span&gt; | sort | egrep -v -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^[^[:alnum:]]&amp;#39;&lt;/span&gt; -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^$@$$&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It prints list of all targets defined in your Makefile.&lt;/p&gt;&#xA;&lt;p&gt;Took it from &lt;a href=&#34;https://stackoverflow.com/a/26339924/1867518&#34; title=&#34;makefile list targets&#34;&gt;this brilliant stackoverflow answer&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
