More tweaking of encodings, based on excellent discussion with Orivej Desh. 2.20.7
authorFrancois-Rene Rideau <fare@tunes.org>
Sat, 31 Mar 2012 17:10:07 +0000 (13:10 -0400)
committerFrancois-Rene Rideau <fare@tunes.org>
Sat, 31 Mar 2012 17:10:07 +0000 (13:10 -0400)
Minimal documentation.

asdf.asd
asdf.lisp
doc/asdf.texinfo

index bc6c417..199957e 100644 (file)
--- a/asdf.asd
+++ b/asdf.asd
@@ -14,7 +14,7 @@
   :licence "MIT"
   :description "Another System Definition Facility"
   :long-description "ASDF builds Common Lisp software organized into defined systems."
-  :version "2.20.6" ;; to be automatically updated by bin/bump-revision
+  :version "2.20.7" ;; to be automatically updated by bin/bump-revision
   :depends-on ()
   :components
   ((:file "asdf")
index 26ecf3f..946423c 100644 (file)
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -1,5 +1,5 @@
 ;;; -*- mode: Common-Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp -*-
-;;; This is ASDF 2.20.6: Another System Definition Facility.
+;;; This is ASDF 2.20.7: Another System Definition Facility.
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome:
 ;;; please mail to <asdf-devel@common-lisp.net>.
@@ -70,6 +70,9 @@
             (and (= system::*gcl-major-version* 2)
                  (< system::*gcl-minor-version* 7)))
     (pushnew :gcl-pre2.7 *features*))
+  #+(or abcl (and allegro ics) (and clisp unicode) clozure (and cmu unicode)
+        (and ecl unicode) lispworks (and sbcl sb-unicode) scl)
+  (pushnew :asdf-unicode *features*)
   ;;; make package if it doesn't exist yet.
   ;;; DEFPACKAGE may cause errors on discrepancies, so we avoid it.
   (unless (find-package :asdf)
          ;; "2.345.6" would be a development version in the official upstream
          ;; "2.345.0.7" would be your seventh local modification of official release 2.345
          ;; "2.345.6.7" would be your seventh local modification of development version 2.345.6
-         (asdf-version "2.20.6")
+         (asdf-version "2.20.7")
          (existing-asdf (find-class 'component nil))
          (existing-version *asdf-version*)
          (already-there (equal asdf-version existing-version)))
@@ -955,9 +958,9 @@ another pathname in a degenerate way."))
 
 (defgeneric* (setf component-property) (new-value component property))
 
-(defgeneric* component-encoding (component))
+(defgeneric* component-external-format (component))
 
-(defgeneric* (setf component-encoding) (new-value component))
+(defgeneric* component-encoding (component))
 
 (eval-when (#-gcl :compile-toplevel :load-toplevel :execute)
   (defgeneric* (setf module-components-by-name) (new-value module)))
@@ -1293,11 +1296,9 @@ processed in order by OPERATE."))
   new-value)
 
 (defparameter *utf-8-external-format*
-  (progn ;; (or ... :default) triggers a warning on acl. Sigh.
-    :default
-    #+(or abcl (and allegro ics) clozure (and cmu unicode)
-          (and ecl unicode) lispworks (and sbcl sb-unicode) scl) :utf-8
-    #+(and clisp unicode) charset:utf-8)
+  #+(and asdf-unicode (not clisp)) :utf-8
+  #+(and asdf-unicode clisp) charset:utf-8
+  #-asdf-unicode :default
   "Default :external-format argument to pass to CL:OPEN and also
 CL:LOAD or CL:COMPILE-FILE to best process a UTF-8 encoded file.
 On modern implementations, this will decode UTF-8 code points as CL characters.
@@ -1311,22 +1312,25 @@ hopefully, if done consistently, it won't affect program behavior too much.")
            (component-encoding it)
            :utf-8)))
 
-(defmethod (setf component-encoding) (new-value (c component))
-  (setf (%component-encoding c) new-value))
-
-(defun default-encoding-external-format-hook (encoding)
-  (unless (eq encoding :utf-8)
-    (warn (compatfmt "~@<Your ASDF component is using encoding ~S but it isn't recognized. Your system should :defsystem-depends-on (:asdf-encodings). Falling back to UTF-8.~:>") encoding))
-  *utf-8-external-format*)
+(defun default-encoding-external-format (encoding)
+  (case encoding
+    (:utf-8 *utf-8-external-format*)
+    (:default :default) ;; for backwards compatibility only. Usage discouraged.
+    (otherwise
+     (cerror "Continue using :external-format :default" (compatfmt "~@<Your ASDF component is using encoding ~S but it isn't recognized. Your system should :defsystem-depends-on (:asdf-encodings).~:>") encoding)
+     :default)))
 
 (defvar *encoding-external-format-hook*
-  #'default-encoding-external-format-hook
+  #'default-encoding-external-format
   "Hook for an extension to define a mapping between non-default encodings
 and implementation-defined external-format's")
 
 (defun encoding-external-format (encoding)
   (funcall *encoding-external-format-hook* encoding))
 
+(defmethod component-external-format ((c component))
+  (encoding-external-format (component-encoding c)))
+
 (defclass proto-system () ; slots to keep when resetting a system
   ;; To preserve identity for all objects, we'd need keep the components slots
   ;; but also to modify parse-component-form to reset the recycled objects.
@@ -2393,7 +2397,6 @@ recursive calls to traverse.")
 (defmethod perform ((operation compile-op) (c cl-source-file))
   #-:broken-fasl-loader
   (let ((source-file (component-pathname c))
-        (external-format (encoding-external-format (component-encoding c)))
         ;; on some implementations, there are more than one output-file,
         ;; but the first one should always be the primary fasl that gets loaded.
         (output-file (first (output-files operation c)))
@@ -2404,7 +2407,7 @@ recursive calls to traverse.")
          c #'(lambda ()
                (apply *compile-op-compile-file-function* source-file
                       :output-file output-file
-                      :external-format external-format
+                      :external-format (component-external-format c)
                       (compile-op-flags operation))))
       (unless output
         (error 'compile-error :component c :operation operation))
@@ -2509,11 +2512,10 @@ recursive calls to traverse.")
 
 (defmethod perform ((o load-source-op) (c cl-source-file))
   (declare (ignorable o))
-  (let ((source (component-pathname c))
-        (external-format (encoding-external-format (component-encoding c))))
+  (let ((source (component-pathname c)))
     (setf (component-property c 'last-loaded-as-source)
           (and (call-with-around-compile-hook
-                c #'(lambda () (load source :external-format external-format)))
+                c #'(lambda () (load source :external-format (component-external-format c))))
                (get-universal-time)))))
 
 (defmethod perform ((operation load-source-op) (c static-file))
index 72e4fa0..4889c0a 100644 (file)
@@ -222,7 +222,8 @@ the following implementations provide ASDF 2 this way:
 abcl allegro ccl clisp cmucl ecl sbcl xcl.
 The following implementations don't provide it yet but will in a future release:
 lispworks scl.
-The following implementations are obsolete and most probably will never bundle it:
+The following implementations are obsolete, not actively maintained,
+and most probably will never bundle it:
 cormancl gcl genera mcl.
 
 If the implementation you are using doesn't provide ASDF 2,
@@ -2904,6 +2905,69 @@ overriding the source-location and/or timestamping systems,
 checking that some compile-time side-effects were properly balanced,
 etc.
 
+Note that there is no around-load hook. This is on purpose.
+Some implementations such as ECL or GCL link object files,
+which allows for no such hook.
+Other implementations allow for concatenating FASL files,
+which doesn't allow for such a hook either.
+We aim to discourage something that's not portable,
+and has some dubious impact on performance and semantics
+even when it is possible.
+Things you might want to do with an around-load hook
+are better done around-compile,
+though it may at times require some creativity
+(see e.g. the @code{package-renaming} system).
+
+
+@section Controlling source file character encoding
+
+Starting with ASDF 2.21, components accept a @code{:encoding} option.
+By default, only @code{:utf-8} is accepted, and
+utf-8 is assumed for all source code processed by ASDF.
+Source code that only use the ASCII subset is of course
+directly supported without modification.
+
+Source code that uses more than the ASCII character set
+wasn't portably supported previously, although in practice,
+utf-8 worked everywhere and was backhandedly enforced by
+a lot of people using SBCL and utf-8 and sending reports to authors
+so they make their packages compatible.
+This change therefore only formalizes a de facto standard,
+and allows for extension and customization
+where no such thing was previously possible.
+
+On implementations that do not support unicode,
+the @code{:default} external-format is used to read source files.
+Non-ASCII characters intended to be read as one CL character
+may end up being read as multiple CL characters on these implementations.
+In most cases, this shouldn't affect the software's semantics:
+comments will be skipped just the same, strings with be read and printed
+with slightly different lengths, symbol names will be accordingly longer,
+but none of it should matter.
+But a few systems may fail to work properly, that actually depend
+on unicode characters (for instance @code{lambda-reader}).
+The @code{#+asdf-unicode} feature tells you if unicode was detected.
+
+In the future, there will be a @code{asdf-encoding} extension system,
+that will register support for more encodings using the
+@code{*encoding-external-format-hook*} facility.
+If you need such an extension already,
+you may contact the authors of ASDF for support.
+
+For backwards compatibility with users who insist on a non-UTF-8 encoding,
+but cannot immediately transition to using @code{asdf-encoding}
+(maybe because it isn't ready), the @code{:encoding :default} option
+used in your @code{defsystem} form will restore
+the behavior of ASDF 2.20 and earlier.
+This shouldn't be required in libraries,
+because user pressure as mentioned above will already have pushed
+library authors towards using UTF-8;
+but authors of end-user programs might care.
+
+Finally, since this feature depends on ASDF 2.21,
+you may want to wait for ASDF 2.21 or later being widely available
+(hopefully later in 2012) before you start using this feature.
+
 
 @section Miscellaneous Exported Functions