diff --git a/asdf.lisp b/asdf.lisp
index c6ad0bc..44fa96b 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -767,8 +767,6 @@ with given pathname and if it exists return its truename."
                             :directory `(:absolute ,@path))))
         (translate-pathname absolute-pathname wild-root (wilden new-base))))))
 
-(defgeneric* compile-file* (x &key output-file &allow-other-keys))
-
 ;;;; -------------------------------------------------------------------------
 ;;;; ASDF Interface, in terms of generic functions.
 (defgeneric* find-system (system &optional error-p))
@@ -1907,6 +1905,8 @@ recursive calls to traverse.")
   (setf (gethash (type-of operation) (component-operation-times c))
         (get-universal-time)))
 
+(defparameter *compile-op-compile-file-function* 'compile-file*)
+
 ;;; perform is required to check output-files to find out where to put
 ;;; its answers, in case it has been overridden for site policy
 (defmethod perform ((operation compile-op) (c cl-source-file))
@@ -1918,7 +1918,8 @@ recursive calls to traverse.")
         (*compile-file-warnings-behaviour* (operation-on-warnings operation))
         (*compile-file-failure-behaviour* (operation-on-failure operation)))
     (multiple-value-bind (output warnings-p failure-p)
-        (apply #'compile-file* source-file :output-file output-file
+        (apply *compile-op-compile-file-function*
+               source-file :output-file output-file
                (compile-op-flags operation))
       (when warnings-p
         (case (operation-on-warnings operation)
@@ -1937,6 +1938,20 @@ recursive calls to traverse.")
       (unless output
         (error 'compile-error :component c :operation operation)))))
 
+#+(and ecl (not ecl-bytecmp))
+(setf
+ *compile-op-compile-file-function*
+ (lambda (input-file &rest keys &key output-file &allow-other-keys)
+   (declare (ignore output-file))
+   (multiple-value-bind (object-file flags1 flags2)
+       (apply 'compile-file* input-file :system-p t keys)
+     (values (and object-file
+                  (c::build-fasl (compile-file-pathname object-file :type :fasl)
+                                 :lisp-files (list object-file))
+                  object-file)
+             flags1
+             flags2))))
+
 (defmethod output-files ((operation compile-op) (c cl-source-file))
   (declare (ignorable operation))
   (let ((p (lispize-pathname (component-pathname c))))
@@ -3193,7 +3208,7 @@ effectively disabling the output translation facility."
   (when (and x (probe-file x))
     (delete-file x)))
 
-(defmethod compile-file* (input-file &rest keys &key output-file &allow-other-keys)
+(defun* compile-file* (input-file &rest keys &key output-file &allow-other-keys)
   (let* ((output-file (or output-file (apply 'compile-file-pathname* input-file keys)))
          (tmp-file (tmpize-pathname output-file))
          (status :error))
@@ -3217,18 +3232,6 @@ effectively disabling the output translation facility."
          (setf output-truename nil)))
       (values output-truename warnings-p failure-p))))
 
-#+(and ecl (not ecl-bytecmp))
-(defmethod compile-file* :around (input-file &rest keys &key output-file &allow-other-keys)
-  (declare (ignore output-file))
-  (multiple-value-bind (object-file flags1 flags2)
-      (apply #'call-next-method input-file :system-p t keys)
-    (values (and object-file
-                 (c::build-fasl (compile-file-pathname object-file :type :fasl)
-                                :lisp-files (list object-file))
-                           object-file)
-            flags1
-            flags2)))
-
 #+abcl
 (defun* translate-jar-pathname (source wildcard)
   (declare (ignore wildcard))
