Configuration, IaC & Build DSL Languages — Tier 3 Index

Configuration, IaC & Build DSL Languages — Tier 3 Index

  • Type: Tier 3 family index
  • Family: Configuration / Infrastructure-as-Code / Build DSLs
  • Languages catalogued: 22
  • Last updated: 2026-05-07

Family overview

Configuration and build DSLs are the quiet majority of the languages most engineers actually touch every day. They split into three overlapping branches:

  1. Pure-config languages (Nix, Dhall, Cue, Jsonnet, KCL, Starlark) — typed, sandboxed, deterministic; designed to replace hand-written YAML/JSON with something that has variables, imports, and (in the typed cases) constraints. They reject I/O and side effects on principle: a config file should compute the same value on every machine.
  2. Infrastructure-as-Code (HCL/Terraform, Pulumi, Ansible, Puppet, Chef, Salt, Helm, Kustomize) — the language is just a surface; the real semantics live in a provider model that diffs declared state against an external system (AWS, Kubernetes, a Linux box) and reconciles. HCL won the public-cloud layer; Helm + Kustomize won the Kubernetes layer; Ansible won the SSH-into-a-box layer.
  3. Build DSLs (Make, Ninja, CMake, Meson, Bazel, Buck2, SCons, Waf, Premake, Tup, Earthly) — DAG description languages whose job is to be both expressive enough for humans and constrained enough that an engine can parallelize and cache them. The split here is between meta-build tools that emit lower-level build files (CMake → Ninja, Meson → Ninja, Premake → make/MSBuild) and direct builders (Bazel, Buck2, Make).

The unifying theme of the 2020s has been typed config: Cue, Dhall, KCL, and Pkl (Apple) all argue that schemaless YAML at scale is a bug, not a feature, and that configuration deserves a real type system. Whether any of them displaces YAML at scale is still open.

In our deep library

No deep notes exist for any language in this family yet. Cross-cutting context lives in:

Tier 3 — the family

LanguageFirst releaseStatus 2026NicheWhy it mattersSource URL
Nix2003Active, growingReproducible package builds + system configPurely-functional language whose evaluation produces a deterministic store path; backbone of NixOS and increasingly used as a build cache for non-Nix projectshttps://nixos.org/
Dhall2017Active, nicheTotal functional configNo I/O, no recursion, guaranteed termination; can compile to YAML/JSON; a deliberate “anti-Turing-complete” stance for safetyhttps://dhall-lang.org/
Cue2018Active, gainingTyped JSON/YAML supersetUnifies schema and value in one language via lattice-based constraint solving; Google-incubated, used by Istio, Tailscale, Daggerhttps://cuelang.org/
Jsonnet2014ActiveTemplated JSONGoogle’s take on “JSON with functions and inheritance”; widely used in Grafana dashboards, Tanka, ksonnet legacyhttps://jsonnet.org/
HCL (HashiCorp Configuration Language)2014DominantPublic-cloud IaCThe de facto IaC syntax via Terraform/OpenTofu; humans read HCL, machines see JSON-equivalent ASThttps://github.com/hashicorp/hcl
Starlark (formerly Skylark)2017ActiveBuild-system configDeterministic Python subset; runs Bazel BUILD files, Buck2, Tilt, and Pants; deliberately drops recursion, while/for-else, and other non-deterministic Python featureshttps://github.com/bazelbuild/starlark
Puppet DSL2005Mature, decliningDeclarative system configResource-graph model with idempotent providers; one of the foundational IaC languages, now overshadowed by Ansible and Terraformhttps://puppet.com/docs/puppet/latest/lang_summary.html
Ansible (YAML-as-language)2012Dominant in agentless config mgmtSSH-driven imperative-declarative hybridYAML playbooks orchestrate idempotent modules over SSH; effectively a YAML-shaped scripting language with Jinja2 expressionshttps://docs.ansible.com/
Chef (Ruby DSL)2009Mature, decliningSystem configInternal Ruby DSL; recipes and resources; led the early DevOps wave alongside Puppethttps://docs.chef.io/
Salt (Salt DSL / Jinja YAML)2011Mature, nicheEvent-driven config + remote executionYAML+Jinja state files over a ZeroMQ pub/sub bus; strong in HPC and large fleetshttps://docs.saltproject.io/
KCL (Kusion Configuration Language)2022Active, growingTyped cloud-native configCNCF Sandbox project; type-safe alternative to YAML/Helm with first-class schema validationhttps://www.kcl-lang.io/
Pulumi2018ActiveReal-language IaCNot its own DSL — uses TypeScript, Python, Go, C#, Java, YAML; “configuration as code in the language you already know”https://www.pulumi.com/docs/
Helm templates (Go templates + YAML)2016DominantKubernetes packagingGo template language over YAML; a chart is a parameterized bundle of K8s manifests; criticized for whitespace fragility but unmatched in ecosystemhttps://helm.sh/docs/
Kustomize2018Dominant alongside HelmOverlay-based K8s configPure-YAML overlays + patches; no templating, just merging; built into kubectl since v1.14https://kustomize.io/
Make1976Universal, ancientOriginal build DSLTab-significant rules + macros; the bedrock; every later build tool defines itself relative to Makehttps://www.gnu.org/software/make/manual/
Tup2009NicheDAG-based buildTracks file accesses via FUSE/inotify so the build graph is correct by construction, not declaredhttps://gittup.org/tup/
Ninja2012Universal as backendLow-level build DSLDesigned to be machine-generated; minimal syntax, maximally fast incremental builds; used by CMake, Meson, gnhttps://ninja-build.org/
CMake2000Dominant in C/C++Meta-buildCMake DSL describes targets cross-platform, generates Ninja/Make/MSBuild/Xcode projects; ubiquitous despite frequent complaintshttps://cmake.org/cmake/help/latest/
Meson2013Active, growingModern meta-buildPython-flavored DSL; emits Ninja; used by GNOME, systemd, GStreamerhttps://mesonbuild.com/
Bazel2015 (open-sourced from Google’s Blaze)ActiveHermetic, scalable buildStarlark BUILD files + a content-addressed action cache; built for monorepos, used at Google, Stripe, Pinterest, Lyfthttps://bazel.build/
Buck22023ActiveMeta’s Bazel-class rebuildRewritten in Rust on top of a more general DAG engine; Starlark front-end; replaced original Buck (Java)https://buck2.build/
SCons2000Mature, nichePython-as-build-DSLThe build script is a Python program; flexibility but slower than Ninja-class engines; still used in scientific code and SCons-native projectshttps://scons.org/
Waf2005NichePython-based buildPython build framework; powers Samba’s build; explicit configure/build/install phaseshttps://waf.io/
Premake2002NicheLua-based buildLua DSL that emits VS solutions, Xcode projects, Make/Ninja; popular in indie game devhttps://premake.github.io/
Earthly (Earthfile DSL)2020ActiveContainerized buildCombines Make-style targets with Dockerfile syntax; every step runs in a container for reproducibilityhttps://earthly.dev/

Notable threads

  • The “typed YAML” arc. Jsonnet (2014) opened the door, Cue (2018) added constraints as types, Dhall (2017) added totality, KCL (2022) and Apple’s Pkl (2024) extend the trend. The thesis is the same in all four: untyped YAML at production scale is structurally unsafe.
  • Starlark as the build-DSL standard. Bazel, Buck2, Pants 2, and Tilt all picked Starlark. Determinism and a familiar Python-shape made it the path of least resistance once Bazel proved the design out.
  • HCL’s quiet monopoly. Terraform won the IaC wars in the mid-2010s. With OpenTofu now a CNCF project after the BSL relicense, HCL is effectively the lingua franca of cloud declaration regardless of which engine evaluates it.
  • Helm vs Kustomize was a draw. Both shipped in kubectl and both ecosystems thrive; teams routinely run Helm to render charts, then layer Kustomize overlays on top.
  • Make is immortal. Despite 50 years and a hundred replacements, make remains the default ./configure && make && sudo make install ritual, the orchestrator-of-orchestrators in CI files, and the “I’ll just write a Makefile” answer at every shop.

Citations