sigildocs

(sigil build module-deps)

(sigil build module-deps) - Module Dependency Tracking

This library provides dependency tracking for .sgl modules to enable:

  1. Correct build ordering (dependencies compiled before dependents)
  2. Incremental builds (skip unchanged modules via mtime checks)
  3. Future tree-shaking support for bundles

Example usage: (define source-files (glob "src/*/.sgl")) (define lib-paths '("build/lib" "~/.sigil/lib")) (compile-modules-incremental source-files "build/lib" lib-paths)

Exports

Extract import declarations from a .sgl source file. Returns a list of library names (each is a list of symbols). Example: ((sigil io) (sigil path) (srfi srfi-9))

Read all s-expressions from a file. Returns #f if file cannot be read.

Extract imports from a list of top-level forms. Looks for (define-library ...) or (library ...) forms.

Extract imports from a define-library form. Handles: (define-library (name) (import ...) (export ...) ...) Also descends into (cond-expand ...) library-declaration clauses, selecting the branch that matches the BUILD-TARGET feature set (the same set the compiler's cond-expand sees — see feature-test-satisfied?). Without this, an (import ...) declared inside a cond-expand clause is invisible to the native module-meta extractor, so web-native-entry's topological init order misses that dependency edge and a re-export through such a facade never materializes under native codegen (t-0c0b).

Extract imports from a list of library declarations (the body of a define-library or of a matching cond-expand clause).

Given the clauses of a (cond-expand clause ...) form, return the imports of the first clause whose feature requirement is satisfied (mirroring R7RS cond-expand and the compiler's branch selection). An else clause matches unconditionally.

Evaluate a cond-expand feature requirement against the current build's feature set. Supports feature identifiers and (and ...)/(or ...)/ (not ...) combinators, matching cpsevalfeature_test in the compiler. (library ...) requirements are treated as unsatisfied here: the static extractor has no module registry to consult, and facades in practice gate imports on target/OS feature symbols (e.g. wasm), not library presence.

Extract library names from import sets. Handles import set modifiers: only, except, prefix, rename

Unwrap import set modifiers to get the base library name. (only (lib name) ...) -> (lib name) (except (lib name) ...) -> (lib name) (prefix (lib name) ...) -> (lib name) (rename (lib name) ...) -> (lib name)

Extract library name from a define-library form or bootstrap module creation form. (sigil core) uses %make-module instead of define-library, but native sidecar generation still needs a stable module name for object naming and reachability metadata. Returns the library name as a list of symbols.

Convert a library name to a relative file path. (sigil io) -> "sigil/io" (srfi srfi-9) -> "srfi/srfi-9"

Resolve a library name to a file path. First searches source-files for .sgl, then lib-paths for .sgb. Returns: (cons 'source path) | (cons 'compiled path) | #f

Find a source file matching the library path. Checks for .sgl extension and verifies the file's declared library name matches the expected name. This prevents false matches when a source file path is a suffix of another library's path — e.g., src/tube/youtube.sgl (providing (tube youtube)) should not match an import of (youtube).

Find a compiled file in lib-paths. Checks each path for <lib-path>/<rel-path>.sgb

Build a dependency graph for source files. Returns an alist of (source-path . (list of dependency paths)) Dependencies can be source paths or compiled paths.

Resolve a list of imports to dependency paths. Filters out external dependencies that can't be resolved.

Topologically sort source files by dependencies. Returns files in order: dependencies before dependents. Only sorts source files; compiled dependencies are not included in output.

Sort source files by their dependencies. Simple wrapper that builds the graph and returns sorted file list. source-files: list of .sgl file paths lib-paths: list of paths to search for compiled dependencies Returns: source files in dependency order (dependencies first)

Filter graph to only include source file dependencies. Removes compiled (.sgb) dependencies.

Kahn's algorithm main loop (module-specific version).

Decrement in-degrees for a list of nodes.

Detect cycles in module dependency graph. Returns list of nodes involved in cycles, or empty list.

Check if a module needs to be recompiled. Returns #t if:

  • Output .sgb doesn't exist
  • Source .sgl is newer than output .sgb
  • Any dependency (source or compiled) is newer than output
  • Any source dependency was recompiled this session

Check if any dependency was recompiled this session.

Check if any compiled dependency is newer than output.

Compile modules in dependency order with incremental support. source-files: list of .sgl file paths output-dir: directory for .sgb output files lib-paths: list of paths to search for compiled dependencies glob-base: base directory for computing relative paths (optional) force?: if #t, recompile everything regardless of mtime

Returns: (list compiled-files skipped-files)

Ensure directory exists