Skip to content

michaelforney/samurai

Folders and files

NameName
Last commit message
Last commit date

Latest commit

737f702 · Mar 3, 2025
Mar 3, 2025
Sep 3, 2019
Mar 5, 2020
Mar 31, 2021
Nov 11, 2021
Mar 3, 2025
Jun 17, 2023
Jul 1, 2019
Mar 3, 2025
Jul 20, 2022
Feb 23, 2024
Nov 26, 2018
Apr 7, 2021
Mar 22, 2020
Mar 3, 2025
Dec 10, 2020
Mar 20, 2020
Feb 22, 2019
Apr 29, 2021
Nov 17, 2018
Mar 3, 2025
Mar 3, 2025
Apr 5, 2021
Dec 10, 2020
Feb 2, 2025
Mar 3, 2025
Mar 3, 2025
Apr 5, 2021
Mar 3, 2025
Nov 11, 2021
Apr 5, 2021
Apr 5, 2021
Mar 3, 2025
Mar 3, 2025

Repository files navigation

samurai

builds.sr.ht status GitHub build status

samurai is a ninja-compatible build tool written in C99 with a focus on simplicity, speed, and portability.

Status

samurai implements the ninja build language through version 1.9.0 except for MSVC dependency handling (deps = msvc). It uses the same format for .ninja_log and .ninja_deps as ninja, currently version 5 and 4 respectively.

It is feature-complete and supports most of the same options as ninja.

Requirements

samurai requires various POSIX.1-2008 interfaces.

Scheduling jobs based on load average requires the non-standard getloadavg function. This feature can be enabled by defining HAVE_GETLOADAVG in your CFLAGS, along with any other necessary definitions for your platform.

Differences from ninja

samurai tries to match ninja behavior as much as possible, but there are several cases where it is slightly different:

  • samurai uses the variable lookup order documented in the ninja manual, while ninja has a quirk (ninja-build/ninja#1516) that if the build edge has no variable bindings, the variable is looked up in file scope before the rule-level variables.
  • samurai schedules jobs using a stack, so the last scheduled job is the first to execute, while ninja schedules jobs based on the pointer value of the edge structure (they are stored in a std::set<Edge*>), so the first to execute depends on the address returned by malloc. This may result in build failures due to insufficiently specified dependencies in the project's build system.
  • samurai does not post-process the job output in any way, so if it includes escape sequences they will be preserved, while ninja strips escape sequences if standard output is not a terminal. Some build systems, like meson, force color output from gcc by default using -fdiagnostics-color=always, so if you plan to save the output to a log, you should pass -Db_colorout=auto to meson.
  • samurai follows the POSIX Utility Syntax Guidelines, in particular guideline 9, so it requires that any command-line options precede the operands. It does not do GNU-style argument permutation.