emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/native-comp 6f8ec144 1/4: Output native compiled preloaded files


From: Andrea Corallo
Subject: feature/native-comp 6f8ec144 1/4: Output native compiled preloaded files into the 'preloaded' subfolder
Date: Sun, 4 Apr 2021 16:52:39 -0400 (EDT)

branch: feature/native-comp
commit 6f8ec1449197f1fcd730df91dddf6f7750284593
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    Output native compiled preloaded files into the 'preloaded' subfolder
    
        * src/comp.c (fixup_eln_load_path): Account the fact that the
        file can be dumped in the 'preloaded' subfolder.
        * lisp/loadup.el: Likewise.
        * src/lread.c (maybe_swap_for_eln1): New function.
        (maybe_swap_for_eln): Handle 'preloaded' subfolder.
        * src/Makefile.in (LISP_PRELOADED): Export preloaded files.
---
 lisp/loadup.el  | 30 +++++++++++++++---------
 src/Makefile.in |  1 +
 src/comp.c      | 29 +++++++++++++++++------
 src/lread.c     | 73 +++++++++++++++++++++++++++++++++++++--------------------
 4 files changed, 89 insertions(+), 44 deletions(-)

diff --git a/lisp/loadup.el b/lisp/loadup.el
index 57058ac..c3948e4 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -465,17 +465,25 @@ lost after dumping")))
                     (when (subr-native-elisp-p f)
                       (puthash (subr-native-comp-unit f) nil h)))))
       (maphash (lambda (cu _)
-                 (native-comp-unit-set-file
-                  cu
-                 (cons
-                   ;; Relative filename from the installed binary.
-                   (file-relative-name (concat eln-dest-dir
-                                               (file-name-nondirectory
-                                                (native-comp-unit-file cu)))
-                                       bin-dest-dir)
-                   ;; Relative filename from the built uninstalled binary.
-                   (file-relative-name (native-comp-unit-file cu)
-                                       invocation-directory))))
+                 (let* ((file (native-comp-unit-file cu))
+                        (preloaded (equal (substring (file-name-directory file)
+                                                     -10 -1)
+                                          "preloaded"))
+                        (eln-dest-dir-eff (if preloaded
+                                              (expand-file-name "preloaded"
+                                                                eln-dest-dir)
+                                            eln-dest-dir)))
+                   (native-comp-unit-set-file
+                    cu
+                   (cons
+                     ;; Relative filename from the installed binary.
+                     (file-relative-name (expand-file-name
+                                          (file-name-nondirectory
+                                           file)
+                                          eln-dest-dir-eff)
+                                         bin-dest-dir)
+                     ;; Relative filename from the built uninstalled binary.
+                     (file-relative-name file invocation-directory)))))
               h))))
 
 (when (hash-table-p purify-flag)
diff --git a/src/Makefile.in b/src/Makefile.in
index c6b1f55..b8bad73 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -500,6 +500,7 @@ shortlisp := $(filter-out ${shortlisp_filter},${shortlisp})
 ## the critical path (relevant in parallel compilations).
 ## We don't really need to sort, but may as well use it to remove duplicates.
 shortlisp := loaddefs.el loadup.el $(sort ${shortlisp})
+export LISP_PRELOADED = ${shortlisp}
 lisp = $(addprefix ${lispsource}/,${shortlisp})
 
 ## Construct full set of libraries to be linked.
diff --git a/src/comp.c b/src/comp.c
index 67c8e39..9bad9b9 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -4091,6 +4091,7 @@ for new compilations.
 If BASE-DIR is nil use the first entry in `comp-eln-load-path'.  */)
   (Lisp_Object filename, Lisp_Object base_dir)
 {
+  Lisp_Object source_filename = filename;
   filename = Fcomp_el_to_eln_rel_filename (filename);
 
   /* If base_dir was not specified search inside Vcomp_eln_load_path
@@ -4129,9 +4130,18 @@ If BASE-DIR is nil use the first entry in 
`comp-eln-load-path'.  */)
   if (!file_name_absolute_p (SSDATA (base_dir)))
     base_dir = Fexpand_file_name (base_dir, Vinvocation_directory);
 
-  return Fexpand_file_name (filename,
-                           Fexpand_file_name (Vcomp_native_version_dir,
-                                              base_dir));
+  /* In case the file being compiled is found in 'LISP_PRELOADED'
+     target for output the 'preloaded' subfolder.  */
+  Lisp_Object lisp_preloaded =
+    Fgetenv_internal (build_string ("LISP_PRELOADED"), Qnil);
+  base_dir = Fexpand_file_name (Vcomp_native_version_dir, base_dir);
+  if (!NILP (lisp_preloaded)
+      && !NILP (Fmember (CALL1I (file-name-base, source_filename),
+                        Fmapcar (intern_c_string ("file-name-base"),
+                                 CALL1I (split-string, lisp_preloaded)))))
+         base_dir = Fexpand_file_name (build_string ("preloaded"), base_dir);
+
+  return Fexpand_file_name (filename, base_dir);
 }
 
 DEFUN ("comp--install-trampoline", Fcomp__install_trampoline,
@@ -4750,10 +4760,15 @@ fixup_eln_load_path (Lisp_Object directory)
   Lisp_Object eln_cache_sys =
     Ffile_name_directory (concat2 (Vinvocation_directory,
                                   directory));
-  /* One directory up...  */
-  eln_cache_sys =
-    Ffile_name_directory (Fsubstring (eln_cache_sys, Qnil,
-                                     make_fixnum (-1)));
+  bool preloaded =
+    !NILP (Fequal (Fsubstring (eln_cache_sys, make_fixnum (-10),
+                              make_fixnum (-1)),
+                  build_string ("preloaded")));
+  /* One or two directories up...  */
+  for (int i = 0; i < (preloaded ? 2 : 1); i++)
+    eln_cache_sys =
+      Ffile_name_directory (Fsubstring (eln_cache_sys, Qnil,
+                                       make_fixnum (-1)));
   Fsetcar (last_cell, eln_cache_sys);
 }
 
diff --git a/src/lread.c b/src/lread.c
index 156df73..e53e1f6 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -1645,6 +1645,40 @@ directories, make sure the PREDICATE function returns 
`dir-ok' for them.  */)
   return file;
 }
 
+#ifdef HAVE_NATIVE_COMP
+static bool
+maybe_swap_for_eln1 (Lisp_Object src_name, Lisp_Object eln_name,
+                    Lisp_Object *filename, int *fd, struct timespec mtime)
+{
+  struct stat eln_st;
+  int eln_fd = emacs_open (SSDATA (ENCODE_FILE (eln_name)), O_RDONLY, 0);
+
+  if (eln_fd > 0)
+    {
+      if (fstat (eln_fd, &eln_st) || S_ISDIR (eln_st.st_mode))
+       emacs_close (eln_fd);
+      else
+       {
+         struct timespec eln_mtime = get_stat_mtime (&eln_st);
+         if (timespec_cmp (eln_mtime, mtime) >= 0)
+           {
+             emacs_close (*fd);
+             *fd = eln_fd;
+             *filename = eln_name;
+             /* Store the eln -> el relation.  */
+             Fputhash (Ffile_name_nondirectory (eln_name),
+                       src_name, Vcomp_eln_to_el_h);
+             return true;
+           }
+         else
+           emacs_close (eln_fd);
+       }
+    }
+
+  return false;
+}
+#endif
+
 /* Look for a suitable .eln file to be loaded in place of FILENAME.
    If found replace the content of FILENAME and FD. */
 
@@ -1653,7 +1687,6 @@ maybe_swap_for_eln (bool no_native, Lisp_Object 
*filename, int *fd,
                    struct timespec mtime)
 {
 #ifdef HAVE_NATIVE_COMP
-  struct stat eln_st;
 
   if (no_native
       || load_no_native)
@@ -1687,36 +1720,24 @@ maybe_swap_for_eln (bool no_native, Lisp_Object 
*filename, int *fd,
     }
   Lisp_Object eln_rel_name = Fcomp_el_to_eln_rel_filename (src_name);
 
+  Lisp_Object dir = Qnil;
   FOR_EACH_TAIL_SAFE (eln_path_tail)
     {
+      dir = XCAR (eln_path_tail);
       Lisp_Object eln_name =
        Fexpand_file_name (eln_rel_name,
-                          Fexpand_file_name (Vcomp_native_version_dir,
-                                             XCAR (eln_path_tail)));
-      int eln_fd = emacs_open (SSDATA (ENCODE_FILE (eln_name)), O_RDONLY, 0);
-
-      if (eln_fd > 0)
-       {
-         if (fstat (eln_fd, &eln_st) || S_ISDIR (eln_st.st_mode))
-           emacs_close (eln_fd);
-         else
-           {
-             struct timespec eln_mtime = get_stat_mtime (&eln_st);
-             if (timespec_cmp (eln_mtime, mtime) >= 0)
-               {
-                 *filename = eln_name;
-                 emacs_close (*fd);
-                 *fd = eln_fd;
-                 /* Store the eln -> el relation.  */
-                 Fputhash (Ffile_name_nondirectory (eln_name),
-                           src_name, Vcomp_eln_to_el_h);
-                 return;
-               }
-             else
-               emacs_close (eln_fd);
-           }
-       }
+                          Fexpand_file_name (Vcomp_native_version_dir, dir));
+      if (maybe_swap_for_eln1 (src_name, eln_name, filename, fd, mtime))
+       return;
     }
+
+  /* Look also in preloaded subfolder of the last entry in
+     `comp-eln-load-path'.  */
+  dir = Fexpand_file_name (build_string ("preloaded"),
+                          Fexpand_file_name (Vcomp_native_version_dir,
+                                             dir));
+  maybe_swap_for_eln1 (src_name, Fexpand_file_name (eln_rel_name, dir),
+                      filename, fd, mtime);
 #endif
 }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]