;;; 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 gfortran." (interactive) (if (+fortran--fpm-toml) (+fortran/fpm-build) (+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 gfortran." (interactive) (if (+fortran--fpm-toml) (+fortran/fpm-run) (+fortran/gfortran-run))) ;; ;;; 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" (+fortran--std) buffer-file-name))) ;;;###autoload (defun +fortran/gfortran-run () "Run the current buffer using gfortran." (interactive) (delete-file "./a.out") (+fortran/gfortran-compile) (while (not (file-exists-p "./a.out")) (sleep-for 1)) (compile "./a.out")) ;; ;;; 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"))