(define* (compile-file* file #:key output-file (opts '())) ;; Like 'compile-file', but remove any (guix …) and (gnu …) modules ;; created during the process as an ugly workaround for ;; (FIXME). This ensures correctness, ;; but is overly conservative and very slow. (define (module-directory+file module) ;; Return the directory for MODULE, like the 'dir-hint' in ;; boot-9.scm. (match (module-name module) ((beginning ... last) (values (string-concatenate (map (lambda (elt) (string-append (symbol->string elt) file-name-separator-string)) beginning)) (symbol->string last))))) (define (clear-module-tree! root) ;; Delete all the modules under ROOT. (hash-for-each (lambda (name module) (module-remove! root name) (let-values (((dir name) (module-directory+file module))) (set-autoloaded! dir name #f)) (clear-module-tree! module)) (module-submodules root)) (hash-clear! (module-submodules root))) (compile-file file #:output-file output-file #:opts opts) (for-each (compose clear-module-tree! resolve-module) '((guix) (gnu))))