В этом разделе объясняются этапы, участвующие в сборке исполняемого файла Emacs. Вам не обязательно знать этот материал для сборки и установки Emacs, поскольку make-файлы выполняют все эти действия автоматически. Эта информация предназначена для разработчиков Emacs.
Сборка Emacs требует GNU Make версии 3.81 или новее.
Компиляция исходных файлов C в каталоге src создаёт исполняемый файл с именем temacs, также называемый базовым неочищенным Emacs. Он содержит интерпретатор Emacs Lisp и подсистемы ввода-вывода, но не команды редактирования.
Команда temacs -l loadup запустила бы temacs и направила бы его загрузить loadup.el. Библиотека loadup загружает дополнительные Lisp-библиотеки, которые настраивают обычную среду редактирования Emacs. После этого шага исполняемый файл Emacs больше не является базовым.
Поскольку загрузка стандартных Lisp-файлов занимает некоторое время, исполняемый файл temacs обычно не запускается пользователями напрямую. Вместо этого один из последних шагов сборки Emacs выполняет команду ‘temacs -batch -l loadup --temacs=метод-дампа’. Специальный параметр --temacs указывает temacs, как записать все стандартные предзагруженные Lisp-функции и переменные, чтобы при последующем запуске Emacs он запускался значительно быстрее. Параметр --temacs требует аргумента метод-дампа, который может быть одним из следующих:
Записывает предзагруженные Lisp-данные в файл дампа. Этот метод создаёт дополнительный файл данных, который Emacs загружает при запуске. Создаваемый файл дампа обычно называется emacs.pdmp и устанавливается в exec-directory Emacs (см. Функции справки). Этот метод является наиболее предпочтительным, поскольку он не требует от Emacs использования каких-либо специальных методов выделения памяти, которые могли бы мешать различным техникам компоновки памяти, используемым в современных системах для повышения безопасности и конфиденциальности.
Как ‘pdump’, но используется во время начальной сборки Emacs, когда нет ни предыдущего двоичного файла Emacs, ни байт-скомпилированных Lisp-файлов *.elc. Создаваемый файл дампа в этом случае обычно называется bootstrap-emacs.pdmp.
Этот метод заставляет temacs выгрузить исполняемую программу с именем emacs, в которую уже предзагружены все стандартные Lisp-файлы. (Аргумент ‘-batch’ предотвращает попытки temacs инициализировать какие-либо свои данные на терминале, поэтому таблицы терминальной информации в выгруженном Emacs пусты.) Этот метод также известен как unexec, поскольку он создаёт программный файл из работающего процесса и, в некотором смысле, является противоположностью выполнения программы для запуска процесса. Хотя этот метод был традиционным способом сохранения состояния Emacs, теперь он устарел.
Как ‘dump’, но используется при начальной сборке Emacs с методом unexec.
Выгруженный исполняемый файл emacs (также называемый чистым Emacs) устанавливается. Если для сборки Emacs использовался переносимый дампер, исполняемый файл emacs фактически является точной копией temacs, а соответствующий файл emacs.pdmp также устанавливается. Переменная preloaded-file-list хранит список предзагруженных Lisp-файлов, записанных в файле дампа или в выгруженном исполняемом файле Emacs. Если вы переносите Emacs на новую операционную систему и не можете реализовать дамп любого вида, то Emacs должен загружать loadup.el при каждом запуске.
По умолчанию выгруженный исполняемый файл emacs записывает такие сведения, как время сборки и имя хоста. Используйте параметр --disable-build-details команды configure, чтобы подавить эти сведения, чтобы сборка и установка Emacs дважды из одних и тех же исходников с большей вероятностью приводили к идентичным копиям Emacs.
Вы можете указать дополнительные файлы для предзагрузки, написав библиотеку с именем site-load.el, которая их загружает. Возможно, вам потребуется пересобрать Emacs с добавленным определением
#define SITELOAD_PURESIZE_EXTRA n
чтобы добавить n байт в чистую область для размещения дополнительных файлов; см. src/puresize.h. (Попробуйте добавлять приращения по 20000, пока не станет достаточно.) Однако преимущество предзагрузки дополнительных файлов уменьшается по мере увеличения быстродействия машин. На современных машинах это обычно не рекомендуется.
После того как loadup.el прочитает site-load.el, он находит строки документации для примитивных и предзагруженных функций (и переменных) в файле etc/DOC, где они хранятся, вызывая Snarf-documentation (см. Доступ к документации).
Вы можете указать другие Lisp-выражения для выполнения непосредственно перед дампом, поместив их в библиотеку с именем site-init.el. Этот файл выполняется после того, как найдены строки документации.
Если вы хотите предзагрузить определения функций или переменных, есть три способа сделать это и сделать их строки документации доступными при последующем запуске Emacs:
nil для byte-compile-dynamic-docstrings как локальную переменную в каждом из этих файлов и загрузить их с помощью либо site-load.el, либо site-init.el. (Этот метод имеет недостаток: строки документации постоянно занимают место в Emacs.)
Не рекомендуется помещать что-либо в site-load.el или site-init.el, что могло бы изменить какие-либо возможности, ожидаемые пользователями в обычном немодифицированном Emacs. Если вы считаете, что должны переопределить стандартные возможности для своего сайта, делайте это через default.el, чтобы пользователи могли при желании переопределить ваши изменения. См. Сводка: последовательность действий при запуске. Обратите внимание, что если site-load.el или site-init.el изменяют load-path, эти изменения будут потеряны после дампа. См. Поиск библиотек. Чтобы сделать постоянное изменение load-path, используйте параметр --enable-locallisppath команды configure.
В пакете, который может быть предзагружен, иногда необходимо (или полезно) отложить некоторые вычисления до последующего запуска Emacs. Подавляющее большинство таких случаев связано со значениями настраиваемых переменных. Например, tutorial-directory — это переменная, определённая в startup.el, который предзагружен. Значение по умолчанию устанавливается на основе data-directory. Переменной необходимо обращаться к значению data-directory при запуске Emacs, а не при его дампе, потому что исполняемый файл Emacs, вероятно, был установлен в другое место после дампа.
Эта функция откладывает инициализацию symbol до следующего запуска Emacs. Обычно вы используете эту функцию, указывая её в качестве свойства :initialize настраиваемой переменной. (Аргумент value не используется и предоставлен только для совместимости с формой, ожидаемой Custom.)
В маловероятном случае, если вам потребуется более общая функциональность, чем предоставляет custom-initialize-delay, вы можете использовать before-init-hook (см. Сводка: последовательность действий при запуске).
Эта функция сохраняет текущее состояние Emacs в файл дампа to-file, используя метод pdump. Обычно файл дампа называется имя-emacs.dmp, где имя-emacs — это имя исполняемого файла Emacs. Необязательный аргумент track-referrers, если он не равен nil, заставляет переносимый дампер сохранять дополнительную информацию, чтобы помочь отследить происхождение типов объектов, которые ещё не поддерживаются методом pdump.
Хотя код переносимого дампера может работать на многих платформах, создаваемые им файлы дампа не являются переносимыми — они могут быть загружены только тем исполняемым файлом Emacs, который их создал.
Если вы хотите использовать эту функцию в уже выгруженном Emacs, вы должны запустить Emacs с параметром ‘-batch’.
Если вы включаете файлы ‘.el’ в выгруженный Emacs, и этот файл ‘.el’ содержит код, который обычно выполняется во время загрузки, этот код не будет выполнен при запуске Emacs после дампа. Чтобы помочь обойти эту проблему, вы можете помещать функции в хук after-pdump-load-hook. Этот хук выполняется при запуске Emacs.
Эта функция сохраняет текущее состояние Emacs в исполняемый файл to-file, используя метод unexec. Она берёт символы из from-file (обычно это исполняемый файл temacs).
Эта функция не может использоваться в уже выгруженном Emacs. Эта функция устарела, и по умолчанию Emacs собирается без поддержки unexec, поэтому эта функция недоступна.
Если текущий сеанс Emacs восстановил своё состояние из файла дампа, эта функция возвращает информацию о файле дампа и времени, затраченном на восстановление состояния Emacs. Возвращаемое значение — это ассоциативный список ((dumped-with-pdumper . t) (load-time . время) (dump-file-name . файл)), где файл — это имя файла дампа, а время — это время в секундах, затраченное на восстановление состояния из файла дампа. Если текущий сеанс не был восстановлен из файла дампа, значение равно nil.