diff --git a/module/language/elisp/compile-tree-il.scm b/module/language/elisp/compile-tree-il.scm index baa6b2a3c..0334e6f33 100644 --- a/module/language/elisp/compile-tree-il.scm +++ b/module/language/elisp/compile-tree-il.scm @@ -1,6 +1,6 @@ ;;; Guile Emacs Lisp -;; Copyright (C) 2009, 2010, 2011, 2013 Free Software Foundation, Inc. +;; Copyright (C) 2009-2011, 2013, 2018 Free Software Foundation, Inc. ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ #:use-module (language tree-il) #:use-module (system base pmatch) #:use-module (system base compile) + #:use-module (system base target) #:use-module (srfi srfi-1) #:use-module (srfi srfi-8) #:use-module (srfi srfi-11) @@ -460,7 +461,9 @@ (map compile-expr args)))) (defspecial eval-when-compile (loc args) - (make-const loc (compile `(progn ,@args) #:from 'elisp #:to 'value))) + (make-const loc (with-native-target + (lambda () + (compile `(progn ,@args) #:from 'elisp #:to 'value))))) (defspecial if (loc args) (pmatch args @@ -702,7 +705,9 @@ args body)))) (make-const loc name)))) - (compile tree-il #:from 'tree-il #:to 'value) + (with-native-target + (lambda () + (compile tree-il #:from 'tree-il #:to 'value))) tree-il))))) (defspecial defun (loc args) diff --git a/module/language/elisp/spec.scm b/module/language/elisp/spec.scm index 38a32c2df..d8758ecda 100644 --- a/module/language/elisp/spec.scm +++ b/module/language/elisp/spec.scm @@ -1,6 +1,6 @@ ;;; Guile Emac Lisp -;; Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 2001, 2009, 2010, 2018 Free Software Foundation, Inc. ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -23,6 +23,7 @@ #:use-module (language elisp parser) #:use-module (system base language) #:use-module (system base compile) + #:use-module (system base target) #:export (elisp)) (define-language elisp @@ -31,5 +32,12 @@ #:printer write #:compilers `((tree-il . ,compile-tree-il))) -(compile-and-load (%search-load-path "language/elisp/boot.el") - #:from 'elisp) +;; Compile and load the Elisp boot code for the native host +;; architecture. We must specifically ask for native compilation here, +;; because this module might be loaded in a dynamic environment where +;; cross-compilation has been requested using 'with-target'. For +;; example, this happens when cross-compiling Guile itself. +(with-native-target + (lambda () + (compile-and-load (%search-load-path "language/elisp/boot.el") + #:from 'elisp))) diff --git a/module/system/base/target.scm b/module/system/base/target.scm index 93616f4a3..2088cd866 100644 --- a/module/system/base/target.scm +++ b/module/system/base/target.scm @@ -1,6 +1,6 @@ ;;; Compilation targets -;; Copyright (C) 2011, 2012, 2013, 2014, 2017 Free Software Foundation, Inc. +;; Copyright (C) 2011-2014,2017-2018 Free Software Foundation, Inc. ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -22,7 +22,7 @@ (define-module (system base target) #:use-module (rnrs bytevectors) #:use-module (ice-9 regex) - #:export (target-type with-target + #:export (target-type with-target with-native-target target-cpu target-vendor target-os @@ -64,6 +64,12 @@ (%target-word-size (triplet-pointer-size target))) (thunk)))) +(define (with-native-target thunk) + (with-fluids ((%target-type %host-type) + (%target-endianness (native-endianness)) + (%target-word-size %native-word-size)) + (thunk))) + (define (cpu-endianness cpu) "Return the endianness for CPU." (if (string=? cpu (triplet-cpu %host-type))