(sigil build module-deps)
(sigil build module-deps) - Module Dependency Tracking
This library provides dependency tracking for .sgl modules to enable:
- Correct build ordering (dependencies compiled before dependents)
- Incremental builds (skip unchanged modules via mtime checks)
- 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-module-importsprocedureExtract 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-file-formsprocedureRead all s-expressions from a file. Returns #f if file cannot be read.
extract-imports-from-formsprocedureExtract imports from a list of top-level forms. Looks for (define-library ...) or (library ...) forms.
extract-imports-from-libraryprocedureExtract 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-declsprocedureExtract imports from a list of library declarations (the body of a define-library or of a matching cond-expand clause).
extract-imports-from-cond-expandprocedureGiven 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.
feature-test-satisfied?procedureEvaluate 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-import-setsprocedureExtract library names from import sets. Handles import set modifiers: only, except, prefix, rename
unwrap-import-setprocedureUnwrap 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-nameprocedureExtract 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.
library-name-to-pathprocedureConvert a library name to a relative file path. (sigil io) -> "sigil/io" (srfi srfi-9) -> "srfi/srfi-9"
resolve-module-pathprocedureResolve 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-source-fileprocedureFind 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-compiled-fileprocedureFind a compiled file in lib-paths. Checks each path for <lib-path>/<rel-path>.sgb
build-module-graphprocedureBuild 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-dependenciesprocedureResolve a list of imports to dependency paths. Filters out external dependencies that can't be resolved.
topological-sort-modulesprocedureTopologically sort source files by dependencies. Returns files in order: dependencies before dependents. Only sorts source files; compiled dependencies are not included in output.
sort-modules-by-depsprocedureSort 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-source-depsprocedureFilter graph to only include source file dependencies. Removes compiled (.sgb) dependencies.
kahn-process-modulesprocedureKahn's algorithm main loop (module-specific version).
decrement-in-degrees-modulesprocedureDecrement in-degrees for a list of nodes.
detect-module-cyclesprocedureDetect cycles in module dependency graph. Returns list of nodes involved in cycles, or empty list.
module-needs-compile?procedureCheck 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
any-recompiled?procedureCheck if any dependency was recompiled this session.
any-dep-newer?procedureCheck if any compiled dependency is newer than output.
compile-modules-incrementalprocedureCompile 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-directoryprocedureEnsure directory exists