Currently "chicken-home" can be used to obtain the location for sundry "data" files installed by eggs and usually required at runtime. This location may need to be changed when installing eggs into custom locations or when a CHICKEN installation via package manager uses a non-writable directory.
The attached patch deprecates "chicken-home" in favor of using the include-path, which is already changable (via environment variable) and also can hold several locations which makes it possible to have a set of possible locations, probably in addition to the default system directory (usually $PREFIX/share/chicken), quite similar to the repository-path. This patch addes "include-path" as a quasi-replacement for "chicken-home" (also chicken.platform module). Eggs that want to operate on installed data files at run-time should use "include-path" from now on to locate any files, or, if they wish to be backwards compatible, can access the variable "##sys#include-pathnames" as a temporary workaround. felix
From 40f033956a85859cc1c653da4a5d2dccc4740320 Mon Sep 17 00:00:00 2001 From: felix <fe...@call-with-current-continuation.org> Date: Mon, 22 Jan 2024 21:46:21 +0100 Subject: [PATCH] Deprecate chicken-home, add include-path init ##sys#include-pathnames in library.scm and populate with contents of CHICKEN_INCLUDE_PATH directly, instead of doing this in csi/chicken. Also move chop-separator from support.scm to batch-driver since it is only used there. --- DEPRECATED | 4 ++++ NEWS | 2 ++ batch-driver.scm | 21 ++++++++++++--------- csi.scm | 12 ++++-------- eval.scm | 2 -- library.scm | 20 +++++++++++++++++++- manual/Module (chicken platform) | 16 ++++++++++------ support.scm | 13 ++----------- types.db | 3 ++- 9 files changed, 55 insertions(+), 38 deletions(-) diff --git a/DEPRECATED b/DEPRECATED index c8d19bd1..716a148b 100644 --- a/DEPRECATED +++ b/DEPRECATED @@ -8,6 +8,10 @@ Deprecated functions and variables - "set-signal-handler!" and "signal-handler" have been deprecated in favor of "make-signal-handler" and "ignore-signal" which are better suited in a multithreaded environment. +- "chicken-home" is deprecated as it is not possible to override + when installing eggs into a custom location. Use "include-path" instead + (or "##sys#include-pathnames" for code that is intended to be + backwards compatible) when accessing the data location. 5.2.1 - current-milliseconds and its C implementations C_milliseconds and diff --git a/NEWS b/NEWS index 46c5d423..6b09db47 100644 --- a/NEWS +++ b/NEWS @@ -35,6 +35,8 @@ longer memoized (fixes #1830). - Condition objects produced by procedures that change errno now have an `errno' property. + - Deprecated "chicken-home" and added "include-path" in the + chicken.platform module. - Tools - The -R option for csi and csc now accepts list-notation like diff --git a/batch-driver.scm b/batch-driver.scm index 8f0a4f35..b9cbe674 100644 --- a/batch-driver.scm +++ b/batch-driver.scm @@ -219,7 +219,7 @@ '() `((import-syntax ,@default-imports))))) (cleanup-forms '(((chicken.base#implicit-exit-handler)))) - (outfile (cond ((memq 'output-file options) + (outfile (cond ((memq 'output-file options) => (lambda (node) (let ((oname (option-arg node))) (if (symbol? oname) @@ -227,18 +227,15 @@ oname) ) ) ) ((memq 'to-stdout options) #f) (else (make-pathname #f (if filename (pathname-file filename) "out") "c")) ) ) - (ipath (map chop-separator - (##sys#split-path - (or (get-environment-variable "CHICKEN_INCLUDE_PATH") "")))) (opasses (default-optimization-passes)) (time0 #f) (time-breakdown #f) (forms '()) (inline-output-file #f) (profile (or (memq 'profile options) - (memq 'accumulate-profile options) + (memq 'accumulate-profile options) (memq 'profile-name options))) - (profile-name + (profile-name (and-let* ((pn (memq 'profile-name options))) (cadr pn))) (hsize (memq 'heap-size options)) (kwstyle (memq 'keyword-style options)) @@ -339,6 +336,13 @@ no contf) ) db) ) ) + (define (chop-separator str) + (let ((len (sub1 (string-length str)))) + (if (and (> len 0) + (memq (string-ref str len) '(#\\ #\/))) + (substring str 0 len) + str) ) ) + (when unit (set! unit-name (string->symbol (option-arg unit)))) (when (or unit-name dynamic) @@ -347,7 +351,7 @@ (set! ##sys#dload-disabled #t) (repository-path #f)) (set! enable-specialization (memq 'specialize options)) - (set! debugging-chicken + (set! debugging-chicken (append-map (lambda (do) (map (lambda (c) (string->symbol (string c))) @@ -452,8 +456,7 @@ (set! ##sys#read-error-with-line-number #t) (set! ##sys#include-pathnames (append (map chop-separator (collect-options 'include-path)) - ##sys#include-pathnames - ipath) ) + ##sys#include-pathnames) ) (when (and outfile filename (string=? outfile filename)) (quit-compiling "source- and output-filename are the same") ) (when (memq 'keep-shadowed-macros options) diff --git a/csi.scm b/csi.scm index 63ff4221..7523bbcf 100644 --- a/csi.scm +++ b/csi.scm @@ -1022,13 +1022,10 @@ EOF (let* ([eval? (member* '("-e" "-p" "-P" "-eval" "-print" "-pretty-print") args)] [batch (or script (member* '("-b" "-batch") args) eval?)] [quietflag (member* '("-q" "-quiet") args)] - [quiet (or script quietflag eval?)] - [ipath (map chop-separator - (##sys#split-path - (or (get-environment-variable "CHICKEN_INCLUDE_PATH") "")))]) + [quiet (or script quietflag eval?)]) (define (collect-options opt) (let loop ([opts args]) - (cond [(member opt opts) + (cond [(member opt opts) => (lambda (p) (if (null? (cdr p)) (##sys#error "missing argument to command-line option" opt) @@ -1072,12 +1069,11 @@ EOF (for-each register-feature! (collect-options "-feature")) (for-each register-feature! (collect-options "-D")) (for-each unregister-feature! (collect-options "-no-feature")) - (set! ##sys#include-pathnames + (set! ##sys#include-pathnames (delete-duplicates (append (map chop-separator (collect-options "-include-path")) (map chop-separator (collect-options "-I")) - ##sys#include-pathnames - ipath) + ##sys#include-pathnames) string=?) ) (when kwstyle (cond [(not (pair? (cdr kwstyle))) diff --git a/eval.scm b/eval.scm index e760aad0..6d01e0f8 100644 --- a/eval.scm +++ b/eval.scm @@ -1283,8 +1283,6 @@ ;;; Find included file: -(define ##sys#include-pathnames (list (chicken-home))) - (define ##sys#resolve-include-filename (let ((string-append string-append) ) (lambda (fname exts repo source) diff --git a/library.scm b/library.scm index 3ec87a74..4a8a2d33 100644 --- a/library.scm +++ b/library.scm @@ -6555,7 +6555,9 @@ static C_word C_fcall C_setenv(C_word x, C_word y) { ;;; Platform configuration inquiry: (module chicken.platform - (build-platform chicken-version chicken-home + (build-platform chicken-version + chicken-home ;; DEPRECATED + include-path feature? features machine-byte-order machine-type repository-path installation-repository register-feature! unregister-feature! @@ -6628,6 +6630,7 @@ static C_word C_fcall C_setenv(C_word x, C_word y) { (define-foreign-variable installation-home c-string "C_INSTALL_SHARE_HOME") (define-foreign-variable install-egg-home c-string "C_INSTALL_EGG_HOME") +;; DEPRECATED (define (chicken-home) installation-home) (define path-list-separator @@ -6678,6 +6681,21 @@ static C_word C_fcall C_setenv(C_word x, C_word y) { (get-environment-variable "CHICKEN_INSTALL_REPOSITORY") install-egg-home))) +(define (chop-separator str) + (let ((len (fx- (string-length str) 1))) + (if (and (> len 0) + (memq (string-ref str len) '(#\\ #\/))) + (substring str 0 len) + str) ) ) + +(define ##sys#include-pathnames + (cond ((get-environment-variable "CHICKEN_INCLUDE_PATH") + => (lambda (p) + (map chop-separator (##sys#split-path p)))) + (else (list installation-home)))) + +(define (include-path) ##sys#include-pathnames) + ;;; Feature identifiers: diff --git a/manual/Module (chicken platform) b/manual/Module (chicken platform) index 7453195c..2d513034 100644 --- a/manual/Module (chicken platform) +++ b/manual/Module (chicken platform) @@ -26,12 +26,6 @@ building the executing system, which is one of the following: sun unknown -==== chicken-home - -<procedure>(chicken-home)</procedure> - -Returns a string which represents the installation directory (usually {{/usr/local/share/chicken}} on UNIX-like systems). - ==== chicken-version <procedure>(chicken-version [FULL])</procedure> @@ -40,6 +34,16 @@ Returns a string containing the version number of the CHICKEN runtime system. If the optional argument {{FULL}} is given and true, then a full version string is returned. +==== include-path + +<procedure>(include-path)</procedure> + +Returns a list of strings representing directory names where included files are located, +which defaults to the value of the environment variable +{{CHICKEN_INCLUDE_PATH}}, split on {{:}} (or {{;}} on Windows). +If the variable is not set, the list is initialized to contain the installation directory +(usually {{/usr/local/share/chicken}} on UNIX-like systems). + ==== repository-path <parameter>repository-path</parameter> diff --git a/support.scm b/support.scm index 1e74239a..a11c26ed 100644 --- a/support.scm +++ b/support.scm @@ -56,7 +56,7 @@ register-foreign-type! lookup-foreign-type clear-foreign-type-table! estimate-foreign-result-size estimate-foreign-result-location-size finish-foreign-result foreign-type->scrutiny-type scan-used-variables - scan-free-variables chop-separator + scan-free-variables make-block-variable-literal block-variable-literal? block-variable-literal-name make-random-name clear-real-name-table! get-real-name set-real-name! @@ -1459,18 +1459,9 @@ (values vars hvars) ) ) ; => freevars hiddenvars -;;; Some pathname operations: - -(define (chop-separator str) ; Used only in batch-driver.scm - (let ([len (sub1 (string-length str))]) - (if (and (> len 0) - (memq (string-ref str len) '(#\\ #\/))) - (substring str 0 len) - str) ) ) - ;;; Special block-variable literal type: -(define-record-type block-variable-literal +(define-record-type block-variable-literal (make-block-variable-literal name) block-variable-literal? (name block-variable-literal-name)) ; symbol diff --git a/types.db b/types.db index ad4f547f..c7c6e2b2 100644 --- a/types.db +++ b/types.db @@ -1356,7 +1356,8 @@ (chicken.platform#build-platform (#(procedure #:pure) chicken.platform#build-platform () symbol)) (chicken.platform#chicken-version (#(procedure #:pure) chicken.platform#chicken-version (#!optional *) string)) -(chicken.platform#chicken-home (#(procedure #:clean) chicken.platform#chicken-home () string)) +(chicken.platform#chicken-home deprecated) +(chicken.platform#include-path (#(procedure #:clean) chicken.platform#include-path () string)) (chicken.platform#feature? (#(procedure #:clean) chicken.platform#feature? (#!rest (or keyword symbol string)) boolean)) (chicken.platform#features (#(procedure #:clean) chicken.platform#features () (list-of keyword))) (chicken.platform#software-type (#(procedure #:pure) chicken.platform#software-type () symbol)) -- 2.40.0