doomemacs/modules/lang/fortran/autoload.el
Colin Woodbury 1dfdfd53c6 feat(fortran): name executable after the file name
Previously the output was always the default `a.out`. Note that this is
only for the single-file non-fpm case, where the user just wants to
compile and run a one-off Fortran program.
2022-05-27 02:59:55 +02:00

117 lines
3 KiB
EmacsLisp

;;; lang/fortran/autoload.el -*- lexical-binding: t; -*-
;;
;;; Generalised Building
;;;###autoload
(defun +fortran/build ()
"Compile a Fortran project or file.
If the current file is detected to be within an fpm project, then
building will occur with fpm. Otherwise it will default to ifort
or gfortran, depending on what feature flags are set."
(interactive)
(cond ((+fortran--fpm-toml) (+fortran/fpm-build))
((featurep! +intel) (+fortran/ifort-compile))
(t (+fortran/gfortran-compile))))
;;;###autoload
(defun +fortran/run ()
"Run a Fortran project or file.
If the current file is detected to be within an fpm project, then
building will occur with fpm. Otherwise it will default to ifort
or gfortran, depending on what feature flags are set."
(interactive)
(cond ((+fortran--fpm-toml) (+fortran/fpm-run))
((featurep! +intel) (+fortran/ifort-run))
(t (+fortran/gfortran-run))))
(defun +fortran--exec-name ()
"The name of the output executable."
(file-name-sans-extension buffer-file-name))
;;
;;; Intel Fortran
;;;###autoload
(defun +fortran/ifort-compile ()
"Compile the current buffer using ifort."
(interactive)
(compile (format "ifort %S -o %S"
(buffer-file-name)
(+fortran--exec-name))))
;;;###autoload
(defun +fortran/ifort-run ()
"Run the current buffer using ifort."
(interactive)
(let ((exec (+fortran--exec-name)))
(delete-file exec)
(+fortran/ifort-compile)
(while (not (file-exists-p exec))
(sleep-for 1))
(compile (format "%S" exec))))
;;
;;; GFortran
(defun +fortran--std ()
"Which version of Fortran should we target?"
(pcase major-mode
(`fortran-mode "-std=legacy")
(_ "")))
;;;###autoload
(defun +fortran-compilation-buffer-name-fn (mode)
"The name of the buffer produced by `compile'."
"*fortran-compilation*")
;;;###autoload
(defun +fortran/gfortran-compile ()
"Compile the current buffer using gfortran."
(interactive)
(compile (format "gfortran %s %S -o %S"
(+fortran--std)
buffer-file-name
(+fortran--exec-name))))
;;;###autoload
(defun +fortran/gfortran-run ()
"Run the current buffer using gfortran."
(interactive)
(let ((exec (+fortran--exec-name)))
(delete-file exec)
(+fortran/gfortran-compile)
(while (not (file-exists-p exec))
(sleep-for 1))
(compile (format "%S" exec))))
;;
;;; FPM
;;;###autoload
(defun +fortran--fpm-toml ()
"If this is an fpm project, find its toml file."
(when-let* ((project-root (doom-project-root))
(toml (expand-file-name "fpm.toml" project-root)))
(when (file-exists-p toml)
toml)))
;;;###autoload
(defun +fortran/fpm-build ()
"Build the current project using fpm."
(interactive)
(compile "fpm build"))
;;;###autoload
(defun +fortran/fpm-run ()
"Run the current project using fpm."
(interactive)
(compile "fpm run"))
;;;###autoload
(defun +fortran/fpm-test ()
"Test the current project using fpm."
(interactive)
(compile "fpm test"))