~mcf/samurai

ninja-compatible build tool written in C
Change nproc to long to match sysconf() return type
deps: Print name of file on parse error
deps: Handle escaped newlines in Makefile fragments

clone

read-only
https://git.sr.ht/~mcf/samurai
read/write
git@git.sr.ht:~mcf/samurai

You can also use your local clone with git send-email.

#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.