summaryrefslogtreecommitdiffstats
path: root/_site/archive/suckless-software/index.html
blob: 418f8ce4229adefdf9f891e4a7f3085988dce3a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>How I manage Suckless software packages</title>

    <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>How I manage Suckless software packages</title>
  <link rel="stylesheet" href="/assets/css/main.css">
  <link rel="stylesheet" href="/assets/css/skeleton.css">
</head>



  </head>
  <body>

    <div id="nav-container" class="container">
  <ul id="navlist" class="left">
    
    <li >
      <a href="/" class="link-decor-none">hme</a>
    </li>
    <li class="active">
      <a href="/archive/" class="link-decor-none">blg</a>
    </li>
    <li >
      <a href="/projects/" class="link-decor-none">poc</a>
    </li>
    <li >
      <a href="/about/" class="link-decor-none">abt</a>
    </li>
    <li><a href="/feed.xml" class="link-decor-none">rss</a></li>
  </ul>
</div>



    <main>
      <div class="container">
        <div class="container-2">
          <h2 class="center" id="title">HOW I MANAGE SUCKLESS SOFTWARE PACKAGES</h2>
          <h6 class="center">30 NOVEMBER 2025</h5>
          <br>
          <div class="twocol justify"><p>Since <a href="https://suckless.org/" class="external" target="_blank" rel="noopener noreferrer">suckless</a> software requires users to modify the
source code and recompile to customize, I need a way to maintain patches over
the long term while retaining the ability to upgrade the software as new
versions are released.</p>

<h2 id="initial-setup">Initial setup</h2>

<p>When using a suckless program, I usually begin by cloning the project and
setting the remote URL to push a copy of the source code with my patches to my
own git repository:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone git://git.suckless.org/dwm
git reset --hard &lt;tag&gt;
git remote set-url --push origin git@git.asciimx.com:/repos/dwm
</code></pre></div></div>

<p>This way, I can pull updates from the upstream project whenever I want, while
committing my changes to my own git repository. The git reset command aligns my
branch head with a stable release before applying patches or installing the
software.</p>

<p>If all I want to do is reconfigure the software (e.g., change key bindings),
which is what I need most of the time, the recommended approach is to modify
the config.h file. If the config.h isn’t yet in the project, the following
command generates it from the defaults and compiles the software using <code class="language-plaintext highlighter-rouge">make
clean &lt;target&gt;</code> here <code class="language-plaintext highlighter-rouge">&lt;target&gt;</code> is the name of the application (e.g., dwm)
found in the Makefile. I modify the resulting config.h file and run <code class="language-plaintext highlighter-rouge">make clean
install</code> to install the software before committing and pushing my changes to my
git repo.</p>

<h2 id="dwm-and-slstatus">dwm and slstatus</h2>

<p>Since dwm and slstatus are always running, <code class="language-plaintext highlighter-rouge">make install</code> will likely fail for
them. The operating system will prevent the installer from replacing running
executables with new ones. Hence, we must first stop the running instances of
these programs (Mod + Shift + q). Then, switch to a tty (Ctrl + Alt + F1),
log in, and change the directory to where dwm/slstatus is. We can run <code class="language-plaintext highlighter-rouge">make
install</code> to install the software and switch back to the graphical session
(Ctrl + Alt + F5).</p>

<p>The key combinations for switching to the tty and back may differ across
systems. The ones listed above are for OpenBSD.</p>

<h2 id="subsequent-upgrades">Subsequent upgrades</h2>

<p>When suckless releases a new version, I run <code class="language-plaintext highlighter-rouge">git pull --rebase</code> to fetch the
upstream changes and rebase my patches on top of them. Because I tend to use
stable versions, I perform another interactive rebase to drop the commits
between the latest stable version tag and my patch before installing the
software.</p>

<p>Commit log before upgrading:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dt236  My patch.
3fkdf  Version 6.5.
</code></pre></div></div>

<p>Commit log after pulling:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>w467d  My patch.
gh25g  A commit.
g525g  Another commit.
3fkdf  Version 6.6.
vd425  Old commit.
q12vu  Another old commit.
3fkdf  Version 6.5.
</code></pre></div></div>

<p>Commit log after the interactive rebase:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>h57jh  My patch.
3fkdf  Version 6.6.
vd425  Old commit.
q12vu  Another old commit.
3fkdf  Version 6.5.
</code></pre></div></div>

<p>And finally, commit and push all the changes to my own git repository.</p>

</div>
          <p class="post-author right">by W. D. Sadeep Madurange</p>
        </div>
      </div>
    </main>

    <div class="footer">
  <div class="container">
    <div class="twelve columns right container-2">
      <p id="footer-text">&copy; ASCIIMX - 2025</p>
    </div>
  </div>
</div>


  </body>
</html>