bau/fingerprint

Computes and stores build fingerprints for incremental compilation.

Types

Fingerprint = object
  sourceHash*: string        ## Content hash of source inputs.
  configHash*: string        ## Content hash of config inputs.
  envHash*: string           ## Hash of selected environment inputs.
  compilerHash*: string      ## Hash of compiler and platform identity.
  flagsHash*: string         ## Hash of compiler flags.
  profile*: string           ## Build profile name.
  platform*: string          ## Platform identifier.
  toolchain*: string         ## Toolchain identifier.
  mtimeHash*: string         ## Hash of source modification times.
Hash record used to decide whether a target is fresh.
FingerprintInputs = object
  sourcePaths*: seq[string]  ## Source files and dependency files to hash.
  compilerFlags*: seq[string] ## Compiler flags included in the cache key.
  profile*: string           ## Build profile name.
  configInputs*: seq[string] ## Config files included in the cache key.
  envInputs*: seq[string]    ## Environment entries included in the cache key.
  platform*: string          ## Platform identifier, usually `os-cpu`.
  toolchain*: string         ## Toolchain identifier, usually `nim-<version>`.
Inputs that determine a target build fingerprint.

Procs

proc `==`(a, b: Fingerprint): bool {....raises: [], tags: [], forbids: [].}

Compare all fingerprint fields for freshness checks.

Source mtimes are recorded for diagnostics, but content hashes decide freshness. This avoids recompiling after a checkout, formatter, generator, or archive extraction touches files without changing their contents.

proc cleanFingerprints(fpDir: string) {....raises: [OSError, IOError],
                                        tags: [ReadDirEffect, WriteDirEffect],
                                        forbids: [].}
Remove and recreate the fingerprint directory.
proc computeFingerprint(inputs: FingerprintInputs): Fingerprint {.
    ...raises: [IOError, OSError], tags: [ReadDirEffect, ReadIOEffect], forbids: [].}
Compute a fingerprint by hashing source, config, env, compiler, and flags.
proc computeFingerprint(sourcePaths: openArray[string];
                        compilerFlags: openArray[string]; profile: string;
                        configInputs: openArray[string] = [];
                        envInputs: openArray[string] = []): Fingerprint {.
    ...raises: [IOError, OSError], tags: [ReadDirEffect, ReadIOEffect], forbids: [].}
Compute a fingerprint from raw input sequences.
proc fromJson(data: string): Fingerprint {.
    ...raises: [IOError, OSError, JsonParsingError, ValueError, KeyError],
    tags: [ReadIOEffect, WriteIOEffect], forbids: [].}

Parse fingerprint JSON text.

Missing fields become empty strings for compatibility with older files.

proc initFingerprintInputs(sourcePaths: openArray[string];
                           compilerFlags: openArray[string]; profile: string;
                           configInputs: openArray[string] = [];
                           envInputs: openArray[string] = []): FingerprintInputs {.
    ...raises: [], tags: [], forbids: [].}
Build fingerprint input metadata from explicit source, flag, and config inputs.
proc loadFingerprint(fpDir: string; targetName: string; unitName: string): Option[
    Fingerprint] {....raises: [],
                   tags: [ReadDirEffect, ReadIOEffect, WriteIOEffect],
                   forbids: [].}
Load a saved fingerprint, returning none when absent or unreadable.
proc removeFingerprint(fpDir: string; targetName: string; unitName: string) {.
    ...raises: [OSError], tags: [ReadDirEffect, WriteDirEffect], forbids: [].}
Remove a saved fingerprint if it exists.
proc saveFingerprint(fpDir: string; targetName: string; unitName: string;
                     fp: Fingerprint) {....raises: [OSError, IOError], tags: [
    WriteDirEffect, ReadDirEffect, WriteIOEffect], forbids: [].}
Persist a fingerprint for a target build unit.
proc toJson(fp: Fingerprint): string {....raises: [], tags: [], forbids: [].}
Serialize a fingerprint to JSON text.