Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

GitHub Action to Setup Common Lisp for CI

This is a Github Action to setup Common Lisp, Roswell and Qlot.

It is useful to call it before running tests or building docs for your Common Lisp libraries. Action encapsulates all steps necessary to make available Roswell and Qlot inside the Github CI.

What this action does for you?

  • It installs Roswell and all it's dependencies, doing right thing depending on the operating system. It should work on Ubuntu, OSX and Windows.
  • Upgrade ASDF to the latest version.
  • Installs Qlot.
  • Adds to PATH these directories: ~/.roswell/bin and .qlot/bin
  • Creates .qlot by running qlot install. How to override content of the qlfile, see "Overriding qlfile" section.
  • And finally, it can install a specified ASDF system and all it's dependencies. But this step is optional.
  • Installed Roswell, .qlot and ~/.cache/common-lisp/ files are cached to speed up repeated builds.

Implementation support

Most implementations are tested on Linux, but for some of them Windows and OSX are also should work.

Note, that for correct execution, your workflow should use lispsh -eo pipefail instead of default bash. This way a workflow will work Linux, OSX and Windows. You you will ignore this advice, you'll see such error when trying to call ros or qlot scripts:

/c/Users/runneradmin/.roswell/lisp/quicklisp/bin/qlot: line 4: exec: ros: not found
Error: Process completed with exit code 127.
ImplementationLinuxOSXWindows
abcl-bin
allegro
ccl-bin
clasp
clasp-bin
clisp
clisp-head
cmu-bin
ecl
mkcl
npt
sbcl
sbcl-bin

A typical usage

Here is how a minimal GitHub Workflow might look like:

name: 'CI'on:
push:
branches:
- 'main'
- 'master'pull_request:
jobs:
tests:
runs-on: ubuntu-lateststrategy:
matrix:
lisp:
- sbcl-bin
- ccl-binenv:
LISP: ${{ matrix.lisp }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info
- uses: 40ants/run-tests@v2with:
asdf-system: cl-info

The part, corresponding to an action call is:

- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-info

If you remove with part, then action will skip the ASDF system installation.

Also, pay attention to the env section of the workflow. If you don't set up a LISP env variable, action will set default lisp implementation to sbcl:

env:
LISP: ${{ matrix.lisp }}

The last step in this workflow runs tests for the specified ASDF system. It is documented here.

Overriding Roswell version

By default this action will install the latest version of Roswell known to be working with this action. However, should you need to use a different version instead, you can specify that via the roswell-version argument:

- uses: 40ants/setup-lisp@v4
with:
roswell-version: v21.10.14.111

Overriding ASDF version

By default this action will install the latest version of ASDF known to be working with this action. However, should you need to use a different version instead, you can specify that via the asdf-version argument:

- uses: 40ants/setup-lisp@v4
with:
asdf-version: 3.3.5.3

Overriding Qlot version

By default this action will install the latest version of Qlot known to be working with this action. However, should you need to use a different version instead, you can specify that via the qlot-version argument:

- uses: 40ants/setup-lisp@v4
with:
qlot-version: 0.11.5

Overriding qlfile

Sometimes you might want to generate content of qlfile depending on matrix parameters. For example with matrix like this one:

matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latestquicklisp-dist:
- quicklisp
- ultralisplisp:
- sbcl-bin
- ccl-bin
- ecl

you might want to add an ultralisp source to the qlfile. Here is how this can be archived:

env:
LISP: ${{ matrix.lisp }}OS: ${{ matrix.os }}QUICKLISP_DIST: ${{ matrix.quicklisp-dist }}steps:
- uses: actions/checkout@v4
- uses: 40ants/setup-lisp@v4with:
asdf-system: cl-infoqlfile-template: | {% ifequal quicklisp_dist "ultralisp" %} dist ultralisp http://dist.ultralisp.org {% endifequal %}

Here we see a few important things.

  1. We put into the env var the type of the quicklisp distribution we want to our library to test against.
  2. We pass a multiline argument qlfile-template to the action.
  3. Template refers to quicklisp_dist to conditionally include a line into qlfile when quicklisp_dist == "ultralisp".

You can refer any environment variable inside the qlfile templater. Also note, it is using Djula markup, similar to Django and Jinja2.

Caching

Usually installing Roswell, a lisp implementation and dependencies take from 2 to 10 minutes. Multiply this to the number of matrix combinations and you'll get signifficant time.

Starting from version 4.0.0, this action cares about caching itself and you don't need to wrap it with actions/cache. This behaviour of enabled by default. Without cache action could be executed about 4 minutes, and with cache it runs only 20 seconds on Ubuntu or 1 minute on Windows.

A new input variable cache was added to control caching beheviour. It is true by default, but you can switch it to false to turn caching off.

The current month is used as part of the cache key, to refresh caches every month. This way a new Roswell, Qlot and ASDF will be used in a build. Also, you can set env.cache-name variable to some value, to force rebuild with a fresh cache.

Roadmap

  • Support CLPM.
  • Vendor all dependencies, to make action more reliable and secure.

Contribution

If you want to contribute to this system, join development at GitHub:

https://github.com/40ants/setup-lisp


[generated by 40ANTS-DOC]

About

GitHub Action to Setup Common Lisp tools

Topics

Resources

Stars

30 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages