<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aidomx Dev</title>
    <description>The latest articles on DEV Community by Aidomx Dev (@aidomx).</description>
    <link>https://dev.to/aidomx</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4170019%2Fa786869f-5d52-4c8b-ba5f-1216c71af08b.png</url>
      <title>DEV Community: Aidomx Dev</title>
      <link>https://dev.to/aidomx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aidomx"/>
    <language>en</language>
    <item>
      <title>Satria: A Simple Builder for You — Beyond CMake Fatigue</title>
      <dc:creator>Aidomx Dev</dc:creator>
      <pubDate>Thu, 08 Oct 2026 02:33:10 +0000</pubDate>
      <link>https://dev.to/aidomx/example-project-with-rbot-a-simple-fast-and-modern-cc-build-system-4lfb</link>
      <guid>https://dev.to/aidomx/example-project-with-rbot-a-simple-fast-and-modern-cc-build-system-4lfb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Building C and C++ projects shouldn't be more complicated than writing the code itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're a C or C++ developer, you've probably experienced what I call &lt;em&gt;CMake fatigue&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You start with a simple project. A few source files, some headers, and perhaps a library.&lt;/p&gt;

&lt;p&gt;Then suddenly, you're dealing with configuration scripts, build generators, dependency graphs, and platform-specific linker behavior.&lt;/p&gt;

&lt;p&gt;CMake is powerful. Ninja is fast. Both have earned their place in modern software development.&lt;/p&gt;

&lt;p&gt;But what if you could build your project without managing all that complexity yourself?&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Satria&lt;/strong&gt;, formerly known as &lt;strong&gt;rbot (Rupa Builder Of Target)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Satria is a lightweight, declarative build system for C and C++ projects, built around one philosophy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A simple builder for you.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It aims to make project configuration straightforward, workspace orchestration practical, and incremental builds fast—without sacrificing the actual work required to produce correct build artifacts.&lt;/p&gt;

&lt;p&gt;Let's explore what makes it different.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Start Simple: Zero Boilerplate
&lt;/h2&gt;

&lt;p&gt;Imagine a typical C project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myproject/
├── src/
│   ├── main.c
│   └── utils.c
└── Buildfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Satria, your configuration can be as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;project&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Satria follows the principle of &lt;strong&gt;convention over configuration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of requiring you to explicitly enumerate every source file and compiler command, it can discover sources from the conventional project layout.&lt;/p&gt;

&lt;p&gt;To initialize a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;satria init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then build it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;satria
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Satria handles source discovery, compilation, dependency tracking, and linking.&lt;/p&gt;

&lt;p&gt;You can still customize the configuration when necessary.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;project&lt;/span&gt;

&lt;span class="py"&gt;compiler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;gcc, clang&lt;/span&gt;
&lt;span class="py"&gt;std&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;gnu11&lt;/span&gt;
&lt;span class="py"&gt;flags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Wall, Wextra&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal isn't to eliminate configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's to make configuration optional when reasonable and explicit when necessary.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  C++ Support
&lt;/h3&gt;

&lt;p&gt;Satria also supports C++ projects.&lt;/p&gt;

&lt;p&gt;Interactive initialization makes getting started easier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;satria init &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can select the project language and let Satria generate the initial project structure.&lt;/p&gt;

&lt;p&gt;For a C++ project, a Buildfile might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;project&lt;/span&gt;

&lt;span class="py"&gt;std&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;c++17&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Satria also supports compilation database generation for development tools such as clangd.&lt;/p&gt;

&lt;p&gt;This allows you to use modern editor features without maintaining a separate build configuration just for your language server.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Workspaces Without Configuration Chaos
&lt;/h2&gt;

&lt;p&gt;Single-project builds are relatively straightforward.&lt;/p&gt;

&lt;p&gt;Workspaces are where build systems become more interesting.&lt;/p&gt;

&lt;p&gt;Consider a project containing several interconnected components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workspace/
├── Buildfile.ws
├── library/
├── rupamod/
├── rupa/
│   ├── include/
│   └── src/
└── ruka/
    ├── include/
    └── src/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some projects may produce libraries.&lt;/p&gt;

&lt;p&gt;Others may produce executables.&lt;/p&gt;

&lt;p&gt;Another project might package resources into an archive that gets embedded into a binary.&lt;/p&gt;

&lt;p&gt;And sometimes, dependencies between components are circular.&lt;/p&gt;

&lt;h3&gt;
  
  
  The DAG Problem
&lt;/h3&gt;

&lt;p&gt;Ninja is designed around a Directed Acyclic Graph (DAG).&lt;/p&gt;

&lt;p&gt;This is a sensible architecture for a low-level build executor, but circular dependencies require careful modeling.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rupa ──────► Ruka
  ▲           │
  └───────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A naive project-level dependency graph would contain a cycle.&lt;/p&gt;

&lt;p&gt;Ninja cannot directly execute a cyclic build graph. The build configuration must represent the actual operations through an acyclic dependency structure.&lt;/p&gt;

&lt;p&gt;This can involve separating compilation from linking, adjusting dependency edges, or handling circular static-library references at link time.&lt;/p&gt;

&lt;p&gt;Satria approaches the problem at a higher level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workspace-Aware Build Execution
&lt;/h3&gt;

&lt;p&gt;A Satria workspace begins with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;workspace&lt;/span&gt;

&lt;span class="py"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;rupamod, rupa, ruka&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rather than treating the workspace as a collection of unrelated commands, Satria understands its projects and their output artifacts.&lt;/p&gt;

&lt;p&gt;Its workspace execution architecture separates important build phases, allowing project libraries to be prepared before dependent executable linking.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          Workspace
              │
              ▼
       Source Discovery
              │
              ▼
      Compile Project Objects
              │
              ▼
      Build Project Libraries
              │
              ▼
      Link Final Executables
              │
              ▼
       Package Releases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This architecture helps Satria manage complex project relationships without requiring developers to manually flatten every project into individual object-level build rules.&lt;/p&gt;

&lt;p&gt;It doesn't mean circular dependencies disappear.&lt;/p&gt;

&lt;p&gt;The linker must still receive the correct objects and libraries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference is that Satria takes responsibility for coordinating those operations.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Real Builds, Not Benchmark Shortcuts
&lt;/h2&gt;

&lt;p&gt;One of Satria's design principles is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A faster build is meaningful only when the required work is actually performed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A workspace may need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compile C and C++ sources.&lt;/li&gt;
&lt;li&gt;Generate object files.&lt;/li&gt;
&lt;li&gt;Create static and shared libraries.&lt;/li&gt;
&lt;li&gt;Package resources into archives.&lt;/li&gt;
&lt;li&gt;Embed archives into binaries.&lt;/li&gt;
&lt;li&gt;Link executables.&lt;/li&gt;
&lt;li&gt;Produce distribution packages and checksums.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Skipping necessary work isn't an optimization.&lt;/p&gt;

&lt;p&gt;It's an incomplete build.&lt;/p&gt;

&lt;p&gt;This principle matters when comparing Satria against tools such as Ninja.&lt;/p&gt;

&lt;p&gt;A benchmark that measures only compilation cannot automatically be considered equivalent to a build that also creates libraries, embeds resources, and packages releases.&lt;/p&gt;

&lt;p&gt;Both tools should be evaluated against the same required outputs whenever possible.&lt;/p&gt;

&lt;p&gt;Satria's workspace architecture is designed around performing those real operations efficiently.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Incremental Builds: Content Matters
&lt;/h2&gt;

&lt;p&gt;Traditional timestamp-based build systems often rebuild files when their modification times change.&lt;/p&gt;

&lt;p&gt;But a modification timestamp doesn't necessarily mean the contents changed.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/main.c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file's timestamp changes.&lt;/p&gt;

&lt;p&gt;Its contents do not.&lt;/p&gt;

&lt;p&gt;A timestamp-based dependency check may decide that recompilation is necessary.&lt;/p&gt;

&lt;p&gt;Satria uses content-based fingerprinting to distinguish actual content changes from timestamp-only updates.&lt;/p&gt;

&lt;p&gt;When the relevant content remains unchanged, unnecessary compilation can be avoided.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;Imagine a workspace containing hundreds or thousands of source files.&lt;/p&gt;

&lt;p&gt;A script updates timestamps across a directory.&lt;/p&gt;

&lt;p&gt;A conventional timestamp-driven build may schedule substantial work.&lt;/p&gt;

&lt;p&gt;Satria can recognize unchanged content and avoid recompiling it.&lt;/p&gt;

&lt;p&gt;This is particularly useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated files.&lt;/li&gt;
&lt;li&gt;Source synchronization.&lt;/li&gt;
&lt;li&gt;Large workspaces.&lt;/li&gt;
&lt;li&gt;Repeated development builds.&lt;/li&gt;
&lt;li&gt;Environments with unusual filesystem behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, hashing isn't free.&lt;/p&gt;

&lt;p&gt;The build system still needs to determine whether the relevant inputs changed.&lt;/p&gt;

&lt;p&gt;The challenge is making that verification cheaper than unnecessary compilation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Satria optimizes for doing the minimum necessary work—not merely the minimum number of commands.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Portable Builds: GNU ld Isn't Everywhere
&lt;/h2&gt;

&lt;p&gt;Portability is another area where build systems face practical challenges.&lt;/p&gt;

&lt;p&gt;On Linux, GNU binutils provides tools such as GNU &lt;code&gt;ld&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One common technique for embedding binary resources is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ld &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-b&lt;/span&gt; binary &lt;span class="nt"&gt;-o&lt;/span&gt; resource.o resource.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a relocatable object containing the binary data.&lt;/p&gt;

&lt;p&gt;However, not every platform's linker supports the same options.&lt;/p&gt;

&lt;p&gt;For example, Android Termux commonly uses LLVM's linker infrastructure.&lt;/p&gt;

&lt;p&gt;During a real CMake+Ninja workspace test on Termux, the build failed while attempting to embed an archive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ld: error: target emulation unknown:
-m or at least one .o file required
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The C compilation itself was not the problem.&lt;/p&gt;

&lt;p&gt;The embed command assumed GNU linker behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Satria's Approach
&lt;/h3&gt;

&lt;p&gt;Satria checks whether a suitable GNU &lt;code&gt;ld&lt;/code&gt; is available.&lt;/p&gt;

&lt;p&gt;When it is, Satria can use the GNU linker embedding strategy.&lt;/p&gt;

&lt;p&gt;When it isn't, the normal embed pipeline can use a C-array fallback.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        Embed Archive
              │
              ▼
       GNU ld available?
          /       \
        Yes        No
         │          │
         ▼          ▼
     GNU ld      C-array
      embed      fallback
         │          │
         └────┬─────┘
              ▼
       Build Continues
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Satria also caches the linker availability result to avoid repeating unnecessary detection work.&lt;/p&gt;

&lt;p&gt;This behavior matters because developers shouldn't have to redesign their build process every time they switch environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Honest Tooling
&lt;/h3&gt;

&lt;p&gt;There is an interesting distinction between normal builds and profiling.&lt;/p&gt;

&lt;p&gt;On Termux, requesting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;satria profile &lt;span class="nv"&gt;embed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rupamod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GNU ld tidak tersedia
(jalur fallback C-array tidak diprofilkan)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, the normal build supports the fallback, but that particular profiling operation does not yet measure it.&lt;/p&gt;

&lt;p&gt;Instead of reporting a misleading measurement, Satria explicitly states the limitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correctness and transparency matter more than pretending every feature is complete.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Performance: Numbers From Real Tests
&lt;/h2&gt;

&lt;p&gt;Performance claims should come from measurements, not marketing.&lt;/p&gt;

&lt;p&gt;Satria has been tested in several environments, including Linux, Android Termux, and proot-distro.&lt;/p&gt;

&lt;p&gt;One particularly interesting test used a real multi-project workspace containing C sources, libraries, embedded resources, executables, and release packaging.&lt;/p&gt;

&lt;h3&gt;
  
  
  Termux Native — Eight Workers
&lt;/h3&gt;

&lt;p&gt;The following results were obtained using Satria v0.2.3.109 on an eight-core Android device running Termux.&lt;/p&gt;

&lt;p&gt;Each run started with a workspace clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;satria &lt;span class="nt"&gt;-w&lt;/span&gt; clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Followed by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;satria &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="nt"&gt;-j8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build output was redirected to &lt;code&gt;/dev/null&lt;/code&gt; to reduce terminal-output overhead.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Cold Build&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;25.807 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;24.599 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;23.796 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;25.018 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;25.884 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Median&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25.018 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fastest run completed in &lt;strong&gt;23.796 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These builds included the workspace's release pipeline, producing &lt;code&gt;.tar.gz&lt;/code&gt; and &lt;code&gt;.deb&lt;/code&gt; packages along with SHA-256 checksums.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparing Against CMake+Ninja
&lt;/h3&gt;

&lt;p&gt;In a separate Termux native cold-build test, CMake+Ninja completed its configured workspace pipeline in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;36.501 seconds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Compared with Satria's five-run median of 25.018 seconds, this is a substantial observed difference.&lt;/p&gt;

&lt;p&gt;However, there are important qualifications.&lt;/p&gt;

&lt;p&gt;The CMake configuration used for this comparison did not reproduce every Satria output, particularly the complete release pipeline.&lt;/p&gt;

&lt;p&gt;Additionally, the CMake+Ninja result came from a single measured cold build rather than a five-run median.&lt;/p&gt;

&lt;p&gt;Therefore, these measurements demonstrate promising performance, but they should not be presented as a perfectly controlled, equal-work comparison.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scaling Across Workers
&lt;/h3&gt;

&lt;p&gt;The same Termux device was also tested using different worker counts.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workers&lt;/th&gt;
&lt;th&gt;Cold Build&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;65.790 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;50.890 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;27.739 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;27.016 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are individual measurements rather than medians.&lt;/p&gt;

&lt;p&gt;The results show substantial improvement when increasing parallelism from two to eight workers.&lt;/p&gt;

&lt;p&gt;Increasing the worker count beyond the device's eight cores produced only a small additional improvement in that particular run.&lt;/p&gt;

&lt;p&gt;This is expected: more workers do not create more physical CPU capacity.&lt;/p&gt;

&lt;p&gt;The best worker count depends on the hardware, compiler, workload, and system conditions.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Linux, Termux, and Toolchain Flexibility
&lt;/h2&gt;

&lt;p&gt;Satria isn't designed around a single compiler or operating environment.&lt;/p&gt;

&lt;p&gt;Its development bootstrap can adapt to the available toolchain.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./install.sh &lt;span class="nt"&gt;--dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Termux native, Satria can be built using Clang.&lt;/p&gt;

&lt;p&gt;On Linux systems with GCC available, GCC can be used.&lt;/p&gt;

&lt;p&gt;This flexibility helps keep the development experience straightforward across different environments.&lt;/p&gt;

&lt;p&gt;The build tool itself should not require users to install unnecessary platform-specific dependencies merely to support an optional optimization.&lt;/p&gt;

&lt;p&gt;That principle also influenced Satria's development.&lt;/p&gt;

&lt;p&gt;An experimental global compiler-pool design was explored, but the original scheduler remained attractive because it already demonstrated strong parallel performance without introducing an additional Android semaphore dependency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sometimes the better optimization is keeping the architecture simpler.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Profiling and Understanding Build Costs
&lt;/h2&gt;

&lt;p&gt;A fast build system should also help developers understand where time is being spent.&lt;/p&gt;

&lt;p&gt;Satria includes profiling functionality for selected build operations.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;satria profile &lt;span class="nv"&gt;library&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can expose the time spent in phases such as discovery, collection, and archiving.&lt;/p&gt;

&lt;p&gt;That information is useful because optimizing the wrong operation rarely improves overall performance.&lt;/p&gt;

&lt;p&gt;If a library archive takes hundreds of milliseconds while source discovery takes only a few milliseconds, optimizing a small loop in discovery probably won't produce a meaningful improvement.&lt;/p&gt;

&lt;p&gt;The same principle applies to workspace scheduling.&lt;/p&gt;

&lt;p&gt;The important question isn't simply how many operations the scheduler performs.&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;what those operations actually cost&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Satria's performance work focuses on measuring those costs and reducing unnecessary overhead without skipping required outputs.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Satria Is Not a Package Manager
&lt;/h2&gt;

&lt;p&gt;Satria's purpose is intentionally focused.&lt;/p&gt;

&lt;p&gt;It is a build system.&lt;/p&gt;

&lt;p&gt;It isn't trying to become a general-purpose package registry or dependency marketplace.&lt;/p&gt;

&lt;p&gt;Its responsibilities center on building projects, coordinating workspace artifacts, and producing the outputs developers need.&lt;/p&gt;

&lt;p&gt;This distinction helps prevent feature growth from overwhelming the core build engine.&lt;/p&gt;

&lt;p&gt;A tool doesn't need to do everything.&lt;/p&gt;

&lt;p&gt;It needs to do its intended job well.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Benchmarking Without Illusions
&lt;/h2&gt;

&lt;p&gt;Ninja is an excellent build executor.&lt;/p&gt;

&lt;p&gt;CMake is a mature and capable project configuration system.&lt;/p&gt;

&lt;p&gt;Satria doesn't need to pretend otherwise.&lt;/p&gt;

&lt;p&gt;Different architectures have different strengths.&lt;/p&gt;

&lt;p&gt;Ninja excels at executing a well-defined acyclic build graph.&lt;/p&gt;

&lt;p&gt;CMake offers extensive platform and toolchain configuration capabilities.&lt;/p&gt;

&lt;p&gt;Satria focuses on providing a compact, declarative build experience with integrated project and workspace orchestration.&lt;/p&gt;

&lt;p&gt;The important benchmark questions are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did both systems perform the same work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did both produce the required artifacts?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Were compiler settings and parallelism comparable?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Were measurements repeated under controlled conditions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A benchmark that ignores those questions may produce impressive numbers without meaningful conclusions.&lt;/p&gt;

&lt;p&gt;For Satria, losing a benchmark is not a reason to hide the result.&lt;/p&gt;

&lt;p&gt;It's an opportunity to investigate where the time went.&lt;/p&gt;

&lt;p&gt;And winning a benchmark is only meaningful when the comparison is fair.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: A Simple Builder for You
&lt;/h2&gt;

&lt;p&gt;Satria started from a straightforward idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building software should be simpler than configuring the tools used to build it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That philosophy extends beyond minimal configuration files.&lt;/p&gt;

&lt;p&gt;It influences how Satria handles workspaces, incremental compilation, toolchain compatibility, profiling, and performance optimization.&lt;/p&gt;

&lt;p&gt;With Satria, developers can start from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;project&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And grow into a multi-project workspace when necessary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;workspace&lt;/span&gt;

&lt;span class="py"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;rupamod, rupa, ruka&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without abandoning the same build system.&lt;/p&gt;

&lt;p&gt;Satria is still evolving.&lt;/p&gt;

&lt;p&gt;There are optimizations to explore, compatibility improvements to make, and features that need further development.&lt;/p&gt;

&lt;p&gt;But its direction remains clear:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep configuration simple. Perform the real work. Measure performance honestly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because a build system should help you build software—not become another project you have to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Satria — A Simple Builder for You
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/aidomx/satria.git" rel="noopener noreferrer"&gt;https://github.com/aidomx/satria.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What matters most to you in a build system: simplicity, portability, incremental performance, or workspace support?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>cpp</category>
      <category>buildsystem</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
