skel

skel is a hacker's project compiler and build tool. It is an extensible software library designed for managing projects.

The cli is the main entry point for typical users. This documentation is for library developers and internal use.

SKEL/CORE
SKEL/COMP/DIR-LOCALS
SKEL/CORE/INT
SKEL/COMP
SKEL/NET/CLIENT
SKEL/COMP/CONTAINER
SKEL/INFER
SKEL/CORE/PLAN
SKEL/COMP/ORG
SKEL/CORE/HEADER
SKEL/CORE/SCHEMA
SKEL/CORE/OBJ
SKEL/COMP/CARGO
SKEL/TESTS
SKEL/CORE/LOG
SKEL
SKEL/NET/CORE
SKEL/CLI
SKEL/CORE/PROTO
SKEL/NET
SKEL/CORE/UTIL
SKEL/TOOLS/VIEW
SKEL/COMP/MAKEFILE
SKEL/TOOLS/DEPLOY
SKEL/SRV
SKEL/CORE/DB
SKEL/NET/SERVER
SKEL/COMP/ASD
SKEL/CORE/VM
SKEL/CORE/PRINT
uiop
asdf
sb-posix
sb-bsd-sockets
sb-concurrency
cl-ppcre
std
obj
dat
cli
organ
doc
vc
pod
net
box
rdb
NIL
NIL
NIL
NIL
homer
skel/tests
core/lib
bin/skc
bin/skel
bin/homer
core/pkg.lisp
core/condition.lisp
core/proto.lisp
core/header.lisp
core/var.lisp
core/obj.lisp
core/component.lisp
core/rule.lisp
core/project.lisp
core/print.lisp
core/fs.lisp
core/schema.lisp
core/db.lisp
core/log.lisp
core/util.lisp
core/vm.lisp
comp/pkg.lisp
comp/asd.lisp
comp/cargo.lisp
comp/container.lisp
comp/org.lisp
comp/dir-locals.lisp
comp/makefile.lisp
pkg.lisp
srv.lisp
infer.lisp
net/var.lisp
net/proto.lisp
net/server.lisp
net/client.lisp
tools/pkg.lisp
tools/deploy.lisp
tools/view.lisp
ext/pkg.lisp
ext/asdf.lisp
ext/krypt.lisp
ext/packy.lisp
cli.lisp
skel.lisp
ASD
MAKEFILE
SKELRC
SKELFILE
HEADER-COMMENTS
MK-VAL-DESIGNATOR
*DEFAULT-MAKEFILE*
SK-PROJECT
WITH-PROJECT
MAKEFILE
INIT-SKEL-LOGGER
SK-COMPILE
SK-WRITE-ASD-COMPONENTS
SKEL-SIMPLE-ERROR
SK-PULL
*SKEL-PROJECT*
LIST-ALL-PROJECTS
SKEL-CONDITION
LOAD-SKELFILE
SK-USER
SKEL
*SKEL-LOG-SCHEMA*
SK-SNIPPETS
MAKE-SHEBANG-COMMENT
SK-LOG-REPAIR
*SKEL-USER-CONFIG*
SK-FIND*
SK-INSTALL
SK-VC
*SKELFILE-EXTENSION*
SK-STASH
SK-VERSION
FIND-SK-FILE
SK-BUNDLE
PUSH-MK-RULE
SK-CONFIG
SK-MOD
SK-SCRIPT
*SKEL-CLI*
SK-COMPONENTS
*SKEL-INIT-HOOK*
SK-WRITELN
SK-CALL
PARSE-SK-RUST-SYSTEM
SK-AUTHOR
SK-UNPACK
SK-META
INIT-SKELRC
SK-PRINT
*MAKEFILE-EXTENSION*
*MK-COMMAND-PREFIXES*
SK-TARGET
SK-ABBREV
LOAD-SYSTEM-SKELRC
SK-PUSH
SKEL-STORE
DIR-LOCAL-VAR-DESIGNATOR
SK-DEPLOY
SK-RULE-SOURCE
INIT-SKELFILE
SKEL-SYNTAX-ERROR
SK-PACK
SK-KIND
*SKEL-SYSTEM-CONFIG*
MAKE-SOURCE-FILE-HEADER
SK-LOG-LIST
SK-PROJECT-SLOT
SK-BIND
SK-RUN
SCRIPT-DESIGNATOR
SK-READ-FILE
*MK-MAGIC-VARS*
SK-UNBUNDLE
SK-LOAD-COMPONENT
SK-TRANSFORM
SK-INCLUDE
*SKEL-LOGGER*
SK-CONFIG-SLOT
SK-CONVERT
LICENSE-DESIGNATOR
MAKE-SOURCE-HEADER-COMMENT
SK-FIND
SK-CALL*
MAKE-SHEBANG-FILE-HEADER
FILE-HEADER-KIND
SK-TEST
SK-TANGLE
SK-COMMAND
SK-RULE-TARGET
SYSTEM-SKELRC
SK-USER-CONFIG
SK-TAGS
PUSH-MK-VAR
EDIT-SKELRC
SK-SAVE
SK-DESCRIPTION
SK-RULE
FILE-HEADER
READ-SYSTEM-DEFINITIONS
*SKELFILE-BOUNDARY*
SKEL-DB-LOGGER
SK-LOG-SCHEMA
SK-ORG-FILE
MK-VAR
SK-COMPONENT
SK-SHELL
*DEFAULT-SKEL-USER*
*DEFAULT-SKELFILE*
*DEFAULT-SKEL-VC-KIND*
SK-CACHE
SK-SNIPPET
SKEL-STASH
SK-STORE
SKEL-CACHE
SK-FETCH
SK-LICENSE
SK-ABBREVS
SKEL-ERROR
SK-PHASES
SKEL-DB-SINK
CONTACT-DESIGNATOR
SK-WRITE
SK-WRITE-FILE
MAKE-FILE-HEADER
LOAD-SKELRC
SK-LOG-SHUTDOWN
SK-READ
SK-NEW
MAKE-SK-RULE
*SKEL-LOGGER-CONFIG*
*DEFAULT-SKEL-CACHE*
SK-RUST-SYSTEM
SK-REGISTER
SK-WEAVE
PUSH-MK-DIRECTIVE
SK-SCRIPTS
USER-SKELRC
SKEL-REGISTRY
SK-MAKE
MK-VAL
LOAD-USER-SKELRC
FIND-PROJECT-ROOT
*DEFAULT-SKELRC*
SK-INSTALL-USER-CONFIG
SK-LISP-SYSTEM
SKEL-IO-ERROR
SK-WRITE-STRING
SETF-SKEL-VARS
INIT-SYSTEM-SKELRC
SK-CONTAINERFILE
SK-RULE-RECIPE
SKEL-PATH
PARSE-SK-LISP-SYSTEM
INVALID-SKEL-AST
DEF-SK-CLASS
INIT-USER-SKELRC
SK-LOG-CLOSE
SKEL-COMPILE-ERROR
SKEL-DB
SK-RULES
SK-SYSTEM-CONFIG
*DIR-LOCALS-FILE*
SK-SOURCE
SK-PARENT
INIT-SKEL
*SKEL-ENV*
SK-SRC
SK-ENV
FIND-SKELFILE
SK-BUILD
SK-DIR-LOCALS
SK-LOAD
SK-SEARCH-PROJECT
SKEL-DB-PATH
SK-REGISTRY

1. Overview

This library started as a Rust crate but was re-written in Lisp as the purpose of the library grew from managing a small collection of user-space libraries (also written in Rust) to managing large collections in many different langs.

It is obvious in hindsight, that this project needs Lisp. Today, skel built on CLOS with classes and methods exposing the core API.

2. Architecture

The library core is built on CLOS. Most important data structures are represented with classes, slots, and methods such as the sk-project class which has a slot named :components and a method specialized on it called load-ast.

We make use of mixins defined within the library like sk-meta as well as classes defined downstream - the sxp class for example provides a default method for AST functions (load-ast build-ast) and is defined in the std/sxp package.

On top of the core we build our compilers or 'translators' which convert core objects to a corresponding external representation. For example the makefile and mk-* classes defined in skel/comp/make can be built from a sk-project and sk-* instances. Once built, the sk-compile method can be used to actually generate the GNU Make output as a stream of bytes.

The remainder of the skel system is dedicated to extensions. These are all optional. There are built-in extension called tools which run within the skel system and external extensions (ext) which integrate with a particular external system.

The tools we provide are similar to Cargo's custom commands, but they don't need to be a separate binary - they can be compiled into the core image. The downside is that this requires re-compiling skel every time you want to add a new tool. However since this is Lisp not Rust, we can compile anywhere - including from within skel itself.

ext contains extensions for external systems. These modules are the 'edges' of the system and provide support to programs which need to be able to access skel data at runtime. These modules always compiled separately and aren't built into the default core image.