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 (0)