;; -*- lexical-binding: t; -*- ;;; yekneb-set-source-directory.el --- Sets the `source-directory' variable for GNU Emacs. ;; Copyright © 2021 - 2025 Ben Key ;; This file is part of the yekneb package. ;; ;; The yekneb package is free software: you can redistribute it and/or modify it ;; under the terms of the GNU General Public License as published by the Free ;; Software Foundation, either version 3 of the License, or (at your option) any ;; later version. ;; ;; The yekneb package is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ;; details. ;; ;; You should have received a copy of the GNU General Public License along with ;; the yekneb package. If not, see . (require 'cl-lib) (require 'find-func) (require 'yekneb-file-utilities) ;;;###autoload (defconst yekneb-source-directory-candidates (list (format "/usr/local/share/emacs/%d.%d" emacs-major-version emacs-minor-version) (expand-file-name (format "~/src/packages/emacs%d-%d.%d+1" emacs-major-version emacs-major-version emacs-minor-version)) (expand-file-name (format "~/src/packages/emacs-%d.%d" emacs-major-version emacs-minor-version)) (expand-file-name (format "~/src/emacs-%d.%d" emacs-major-version emacs-minor-version)) (expand-file-name "../src" invocation-directory) (expand-file-name (format "../src/emacs-%d.%d" emacs-major-version emacs-minor-version) invocation-directory) (expand-file-name (format "../../src/emacs-%d.%d" emacs-major-version emacs-minor-version) invocation-directory) (expand-file-name (format "../../../src/emacs-%d.%d" emacs-major-version emacs-minor-version) invocation-directory) (format "${USERPROFILE}/src/emacs-%d.%d" emacs-major-version emacs-minor-version) (format "${SOURCE_ROOT}/emacs-%d.%d" emacs-major-version emacs-minor-version) (format "${SystemDrive}/src/emacs-%d.%d" emacs-major-version emacs-minor-version) ) "A list of possible candidates for the source directory." ) (defun yekneb-source-directory-is-valid () "Determines if the `source-directory' variable set and is valid." (and source-directory (file-directory-p source-directory)) ) (defun yekneb-find-function-C-source-directory-is-valid () "Determines if the `source-directory' variable set and is valid." (and find-function-C-source-directory (file-directory-p find-function-C-source-directory)) ) ;;;###autoload (defun yekneb-set-source-directory () "Sets the `source-directory' and `find-function-C-source-directory' variables." (when (not (yekneb-source-directory-is-valid)) (cl-dolist (candidate yekneb-source-directory-candidates) (setq candidate (yekneb-convert-slash-in-file-name (substitute-env-vars candidate))) (when (and (file-directory-p candidate) (file-directory-p (expand-file-name "nt" candidate)) (file-directory-p (expand-file-name "src" candidate)) (file-exists-p (expand-file-name "src/emacs.c" candidate)) (file-directory-p (expand-file-name "site-lisp" candidate)) ) (setq source-directory candidate) (let ((dir (expand-file-name "src" source-directory))) (when (file-accessible-directory-p dir) (setq find-function-C-source-directory dir) ) ) (cl-return) ) ) ) ) (provide 'yekneb-set-source-directory)