diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..8f93c1a --- /dev/null +++ b/COPYING @@ -0,0 +1,30 @@ +Copyright (c) 2004, Michel Schinz +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8ea4464 --- /dev/null +++ b/Makefile @@ -0,0 +1,61 @@ +# Makefile for the scsh installation library. Needs GNU make. +# $Id: Makefile,v 1.1 2004/03/31 19:47:07 michel-schinz Exp $ + +NAME = scsh-install-lib +VERSION = 1.0.0 +FULL_NAME = $(NAME)-$(VERSION) + +LIB_FILES += scheme/install-lib/install-lib.scm +LIB_FILES += scheme/install-lib/install-lib-module.scm + +DOC_FILES += doc/latex/proposal.pdf + +DIST_FILES = $(LIB_FILES) $(DOC_FILES) install.scm README COPYING + +DIST_TMP_DIR = distrib-tmp +DIST_MAIN_DIR = $(DIST_TMP_DIR)/$(FULL_NAME) + +ARCHIVE = $(FULL_NAME).tar.gz +MD5_FILE = $(ARCHIVE).md5 + +WEB_USER = schinz +WEB_HOST = lamppc29.epfl.ch +WEB_DIR = /home/schinz/public_html/scsh_packages/ + +# Commands used in the rules +CP = cp +INSTALL = install +MD5SUM = md5sum +MKDIR = mkdir +PDFLATEX = pdflatex +SCP = scp +RM = rm +TAR = tar + +all: + +clean: + $(RM) -f $(ARCHIVE) $(MD5_FILE) $(DOC_FILES) + +distrib: $(ARCHIVE) + +$(ARCHIVE): $(DIST_FILES) + $(RM) -rf $(DIST_TMP_DIR) + $(MKDIR) $(DIST_TMP_DIR) + $(MKDIR) $(DIST_MAIN_DIR) + $(MKDIR) $(DIST_MAIN_DIR)/doc + $(CP) -p $(DOC_FILES) $(DIST_MAIN_DIR)/doc + $(MKDIR) $(DIST_MAIN_DIR)/scheme + $(CP) -p $(LIB_FILES) $(DIST_MAIN_DIR)/scheme + $(CP) -p install.scm README COPYING $(DIST_MAIN_DIR) + $(TAR) --create --gzip --file=$@ --directory=$(DIST_TMP_DIR) $(FULL_NAME) + $(RM) -rf $(DIST_TMP_DIR) + +install-web: $(ARCHIVE) $(DOC_FILES) $(MD5_FILE) + $(SCP) $^ $(WEB_USER)@$(WEB_HOST):$(WEB_DIR) + +%.pdf: %.tex + cd $(dir $^); $(PDFLATEX) $(notdir $^); $(PDFLATEX) $(notdir $^) + +%.md5: % + $(MD5SUM) $^ > $@ diff --git a/README b/README new file mode 100644 index 0000000..c08d03f --- /dev/null +++ b/README @@ -0,0 +1,55 @@ + scsh installation library + +Introduction +------------ + +This is the scsh installation library, which aims at making it easy to +install extension libraries for scsh. + +The complete documentation for this library can be found in +doc/proposal.pdf. Apart from describing the library itself, this +document also explains how to install and use scsh packages in +general. + +Notice that this library needs scsh v0.6.6 or newer, and will not +work at all with older versions. + + +Installation +------------ + +This library must be installed before any attempt at installing scsh +packages is made. + +Installation is performed by running the install.scm script found in +the same directory as the present file. This script accepts the +following option: + + --prefix directory in which to install files + (default: /usr/local) + +The following files are installed: + + /bin/scsh-install-pkg + + The script to run in order to install scsh packages. Its use is + explained in the documentation (see below). + + /share/scsh/install-lib/scheme/install-lib.scm + /share/scsh/install-lib/scheme/install-lib-module.scm + + The Scheme code for the installation library. + + /share/doc/scsh/install-lib/proposal.pdf + + The documentation describing the installation library, and how to + manage scsh packages in general. + + +Staged installation +------------------- + +The installation script provides support for staged installation, as +needed by some package managment systems. The destination directory in +which files should be installed can be specified using the +"--dest-dir" option. diff --git a/install.scm b/install.scm new file mode 100755 index 0000000..adf7489 --- /dev/null +++ b/install.scm @@ -0,0 +1,132 @@ +#!/bin/sh +exec scsh -e main -o let-opt -o srfi-1 -o srfi-37 -s "$0" "$@" +!# + +;; Install scsh's installation library as follows: +;; - files install-lib.scm and install-lib-module.scm go to +;; /share/scsh/install-lib/scheme/ +;; - file proposal.pdf goes to +;; /share/scsh/doc/install-lib/ +;; - a new file called scsh-install-pkg, providing an entry point to +;; the installation library, is installed in /bin + +;; TODO most of the following functions were lifted straight from +;; install-lib.scm, but should really be shared in some way. + +;; Replace all bindings of KEY in ALIST with one binding KEY to DATUM. +(define (alist-replace key datum alist) + (alist-cons key datum (alist-delete key alist))) + +;; Return the value associated with KEY in ALIST. If none exists, +;; return DEFAULT, or signal an error if no DEFAULT was given. +(define (alist-get key alist . rest) + (cond ((assoc key alist) => cdr) + ((not (null? rest)) (first rest)) + (else (error "cannot find key in alist" key alist)))) + +;; Return the name of the parent directory of FNAME. +(define (parent-directory fname) + (file-name-directory (directory-as-file-name fname))) + +;; Create directory FNAME and all its parents, as needed. +(define (create-directory&parents fname . rest) + (let-optionals rest ((perms #o777)) + (let ((parent (parent-directory fname))) + (if (not (file-exists? parent)) + (apply create-directory&parents parent rest)) + (if (not (file-exists? fname)) + (create-directory fname perms))))) + +;; Return the name of FNAME, which must be absolute, with NEW-ROOT as +;; root. +(define (re-root-file-name fname new-root) + (let ((fname-pl (split-file-name fname)) + (new-root-pl (split-file-name new-root))) + (if (string=? (first fname-pl) "") + (path-list->file-name (append new-root-pl (cdr fname-pl))) + (error "no root to replace in relative file name" fname)))) + +;; Copy SOURCE to TARGET-DIR, with the same name. +(define (copy-file-to-dir source target-dir) + (let ((target (absolute-file-name (file-name-nondirectory source) + target-dir))) + (run (cp ,source ,target)) + (set-file-mode target (file-mode source)))) + +(define usage #< specify directory where files are installed + (default: /usr/local) + --dest-dir specify prefix to used during installation + (to be used only during staged installations) + +END +) + +;; Template for scsh-install-pkg script, must be plugged with the +;; directory containing the Scheme code. +(define scsh-install-pkg-template #<