cl-launch: Common Lispアプリケーションのための統合ランチャー

概要

cl-launchは、Common LispコードをUnixシェル環境で統一的に実行するためのラッパーツールです。Lisp実装の差異を抽象化し、スクリプト実行からスタンドアロン実行ファイルの生成まで幅広い用途に対応します。

基本的な使用パターン

# Lispフォームを直接評価して結果を表示
cl [オプション] '(評価するフォーム)'

# スクリプトファイルを実行
cl [オプション] スクリプトファイル 引数...

# 実行ファイルを生成
cl [オプション] --output 実行ファイル名 [オプション]

主要オプション

動作モード指定

  • -x, --execute: 指定したソフトウェアを即座に実行(デフォルト)
  • -o FILE, --output FILE: 実行可能ファイルを生成
  • -d IMAGE, --dump IMAGE: 高速起動用のイメージをダンプ
  • -u FILE, --update FILE: 既存スクリプトを最新版に更新

ソフトウェア構成

  • -s SYSTEM, --system SYSTEM: ASDFシステムを読み込み
  • -f FILE, --file FILE: ソースファイルを埋め込み
  • -L FILE, --load FILE: ファイルをコンパイルして読み込み
  • -e FORM, --eval FORM: ビルド時にフォームを評価
  • -i FORM, --init FORM: 再起動後にフォームを評価
  • -E FUN, --entry FUN: エントリ関数を指定(引数あり)
  • -r FUN, --restart FUN: 再起動関数を指定(引数なし)

環境設定

  • -l LISP..., --lisp LISP...: 使用するLisp実装を優先順で指定
  • -p PACKAGE, --package PACKAGE: 現在のパッケージを設定
  • -Q, --quicklisp: Quicklispを有効化
  • +Q, --no-quicklisp: Quicklispを無効化(デフォルト)
  • -R, --rc: 設定ファイルを読み込み
  • +R, --no-rc: 設定ファイルをスキップ

3段階実行モデル

第1段階: イメージ初期化

Lispイメージが起動され、以下が実行されます:

  1. UIOPベースのランタイムヘッダが読み込まれる
  2. ASDF 3.1.2以降が読み込まれる(require "asdf"が失敗する場合、$HOME/common-lisp/asdf//usr/share/common-lisp/source/cl-asdf/から検索)
  3. Quicklispが有効な場合はセットアップ(-Qオプション)

第2段階: ソフトウェアビルド

指定された順序でコードが処理されます:

  1. --evalで指定されたフォームが評価
  2. --loadで指定されたファイルがコンパイル/読み込み(*package*は現在のパッケージにバインド)
  3. --systemでASDFシステムがコンパイル/読み込み
  4. --finalで最終フォームが評価
  5. --dumpが指定されていればイメージが保存

第3段階: アプリケーション実行

uiop:restore-image経由で実行:

  1. uiop:*image-restore-hook*がFIFO順で呼び出し
  2. --initフォームが評価
  3. --entryまたは--restart関数が呼び出し
  4. 関数戻り値が真なら終了コード0、偽なら1

対応環境

Lisp実装

完全対応(スタンドアロン実行ファイル生成含む): SBCL 1.2.2+, CLISP 2.49, ECL 13.5.1+, CMUCL 20D, CCL 1.10, LispWorks Professional 6.1.0+

制限あり: GCL 2.7.0(ANSIモード), Allegro 9.0+, SCL 1.3.9(実行ファイル生成不可), ABCL 1.3.1(イメージダンプ不可), XCL 0.0.0.291(イメージダンプ不可)

シェル

bash 2.05/3.1+, zsh 4.3.2+, dash 0.5.3+, busybox 1.01 ash, posh 0.47で動作確認

実践的な例

シンプルなスクリプト

#!/usr/bin/cl --entry app-entry
(defun app-entry (args)
  (format t "処理開始~%~S~%" args))

完全なMakefile例

# cl-launchのダウンロード
cl-wrapper.sh:
        wget -O cl-wrapper.sh http://fare.tunes.org/files/cl-launch/cl-launch.sh
        chmod +x cl-wrapper.sh

# Lispソースから実行ファイル生成
launcher.sh: cl-wrapper.sh app.lisp
        ./cl-wrapper.sh --output launcher.sh --file app.lisp \
        --system myapp --entry myapp:main

# 複雑なビルド例
complex-app: cl-wrapper.sh init.lisp
        ./cl-wrapper.sh --output complex-app \
        --file init.lisp --system complex-system \
        --init "(complex-system:run uiop:*command-line-arguments*)" \
        --source-registry /opt/cl-systems/ \
        --lisp "sbcl ccl" --wrap 'SBCL=/usr/local/bin/sbcl-mine' \
        --no-include

シェル/Lisp両対応スクリプト

#!/bin/sh
":" ; exec cl-launch -X -- "$0" "$@" || exit
(format t "互換性のあるスクリプト~%")

高度な機能

イメージダンプ

--dump /path/to/imageで実行可能イメージを保存。次回の起動時間を短縮できます。--imageで事前にダンプしたイメージを使用可能。

スタンドアロン実行ファイル

--output app --dump '!' で独立実行ファイルを生成。SBCL/ECL/CLISP/CMUCL/CCL/LispWorks Professionalで利用可能。CLISPではsetuid実行に注意が必要。

ランタイムAPI

cl-launchは以下のAPIを提供:

  • cl-launch:compile-and-load-file: 必要に応じてコンパイルして読み込み

以下はUIOPに移行:

  • cl-launch:*arguments*uiop:*command-line-arguments*
  • cl-launch:getenvuiop:getenv
  • cl-launch:load-systemasdf:load-system
  • cl-launch:quituiop:quit

環境変数CL_LAUNCH_PID(プロセスID)とCL_LAUNCH_FILE(スクリプトパス)が設定される。

デバッグと設定

詳細出力モード

--verboseオプションまたは環境変数CL_LAUNCH_VERBOSEを設定すると、Lisp呼び出しコマンドやコンパイル詳細が表示される。

実装選択の制御

環境変数$LISPで優先実装を指定。$SBCL$CLISPでバイナリパスを、$SBCL_OPTIONSでコマンドラインオプションを制御可能。--wrapオプションでスクリプト生成時にこれらを固定できる。

注意事項

パッケージ設定はオプション処理中に変更される可能性があるため、重要な場合はin-packageを明示的に使用する。シェル/Lisp/Makefileの多重引用には特に注意が必要。

タグ: common-lisp cl-launch asdf uiop shell-scripting

7月19日 01:57 投稿