DEV Community

pophu
pophu

Posted on

Nimmake โ€” The Blazing-Fast Build Tool Built for Embedded Development

๐Ÿš€ Nimmake โ€” The Blazing-Fast Build Tool Built for Embedded Development

Say goodbye to complex Makefiles. Embrace a modern MCU build experience.

Nimmake is a lightweight, cross-platform build tool deeply optimized for ARM and RISC-V architectures. A Python-powered build system for MCU firmware development, it lets you effortlessly compile C/C++ source code for ARM, RISC-V, and a wide range of mainstream microcontrollers.

Built-in extensive MCU and toolchain configurations automatically generate the required compile flags. Add code as third-party libraries without manually adding source files, headers, or macros one by one; you can set dependencies between each library. Especially suitable for rapid development and prototyping.


๐Ÿค” Have You Encountered These Problems?

  • โŒ Makefiles growing increasingly complex and hard to maintain?
  • โŒ Manually adding source files, header paths, and macros every time you integrate a new library?
  • โŒ Full rebuilds taking forever, testing your patience?
  • โŒ Inconsistent build behavior across different team members' environments?

Nimmake was born to solve these pain points.


โœจ Why Choose Nimmake?

Pain Point Nimmake's Solution
Tedious manual config Modular Party System โ€” Integrate as third-party libraries, auto-generate compile flags, no manual config needed
Slow compilation Incremental Builds + Multi-Process Parallel + Build Cache โ€” Only compile what changed, doubled speed
Chaotic toolchain management Rich built-in MCU and toolchain configs โ€” Works out of the box, supports armgcc / LLVM / armclang
Lack of IDE support Auto-generate compile_commands.json โ€” Seamless integration with VS Code, CLion, and other IDEs

๐Ÿ”ฅ Core Features

โšก Extreme Compilation Speed

  • Incremental Builds โ€” Intelligently analyzes which files need rebuilding and compiles only what changed
  • Multi-Process Parallel โ€” Configurable job count via -j parameter, fully utilizing multi-core CPUs
  • Ninja Backend โ€” Optional Ninja mode (-n / --ninja) for even faster builds
  • Build Cache โ€” Cache compiled artifacts (--cache), lightning-fast rebuilds

๐Ÿงฉ Modular Third-Party Integration

Pre-built modules for FreeRTOS, LVGL, FatFS, EasyLogger, CherryUSB, FreeModbus, and more โ€” plug and play, no configuration from scratch.

๐Ÿ”ง Multi-Toolchain Support

One codebase, seamlessly switch between compilers:

  • armgcc โ€” Classic ARM GNU toolchain
  • LLVM/Clang โ€” Modern compiler with better error diagnostics
  • armclang โ€” ARM's official compiler, commercial-grade optimization

๐Ÿ›  Developer Friendly

  • Dry-Run Mode (--dry-run) โ€” Preview the build plan before executing
  • Compilation Database (--compiledb) โ€” Generate compile_commands.json for IDE IntelliSense and static analysis
  • Concise CLI โ€” Short command nmmk keeps you one step ahead

๐Ÿ“ฆ Quick Start in One Minute

1. Install Nimmake

pip install nimmake
Enter fullscreen mode Exit fullscreen mode

2. Verify Installation

nimmake --version
Enter fullscreen mode Exit fullscreen mode

3. Clone the Sample Project

git clone https://github.com/pophu/nimmake.git
cd nimmake/samples/05_arm32
Enter fullscreen mode Exit fullscreen mode

4. Build with One Command

nimmake
Enter fullscreen mode Exit fullscreen mode

That's it! No Makefile configuration, no manual compile flag management.


๐Ÿ“ Minimal Nimmake.py Example

A complete STM32F407 build script in just a dozen lines of code:

from nimmake.datasets import CORTEX_M4_CFG
from nimmake.Helper import Helper

hlp = Helper()

# Chip configuration
CFG = CORTEX_M4_CFG.clone()
hlp.Config(CFG)

# Toolchain configuration
hlp.Update({
    "TOOLPATH": r"D:\LLVM\arm-none-eabi-gcc14\bin",
    "TOOL": "gcc",
    "TOOL_PREFIX": "arm-none-eabi-",
})
hlp.Refresh()

# Source modules (Party System)
core = hlp.Parties("CORE", "src/Core")
driver = hlp.Parties("Driver", "src/Drivers", third_party="HAL")
core.DependOn([driver])

# Build targets
srcs = ["startup_stm32f407xx.s"]
t = hlp.Program("test", sources=srcs)
hlp.DefaultTarget(t)
Enter fullscreen mode Exit fullscreen mode

๐ŸŽฏ Use Cases

Scenario Description
๐Ÿƒ Rapid Prototyping Set up a build environment in minutes, no tedious configuration
๐Ÿงช Multi-Platform Firmware Seamlessly switch between ARM / RISC-V architectures
๐Ÿ‘ฅ Team Collaboration Unified build system, eliminating "it works on my machine"
๐Ÿ”„ CI/CD Integration CLI-driven, easily integrates into continuous integration pipelines

๐Ÿ“š Documentation Navigation

Document Contents
Basic Usage Chip config, toolchain setup, compile flags, Party system, build targets
Advanced Usage PC programs, ARM32/RISC-V MCU builds, multi-toolchain switching
Party System Third-party library integration details, parameter reference, built-in library list
CLI Parameters Detailed explanation of all command-line parameters
FAQ Answers to 18 common questions
Contributing How to contribute to Nimmake

๐ŸŒŸ Get Started Now

Nimmake makes MCU firmware building as simple as writing Python.

pip install nimmake
git clone https://github.com/pophu/nimmake.git
cd nimmake/samples/05_arm32
nimmake
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.