aboutsummaryrefslogtreecommitdiff
path: root/modules/prog-c.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-03 20:10:40 -0500
committerCraig Jennings <c@cjennings.net>2026-05-03 20:10:40 -0500
commitf3d50d1b2aea4f1eda436c54a15cc18596f2df0b (patch)
treea74107a9d1988589b4b960b949486f8add363cfa /modules/prog-c.el
parentf619cbf9f384dfd6976e3bed448b3473146841e1 (diff)
downloaddotemacs-f3d50d1b2aea4f1eda436c54a15cc18596f2df0b.tar.gz
dotemacs-f3d50d1b2aea4f1eda436c54a15cc18596f2df0b.zip
fix: use buffer-file-name for C single-file compile command
The fallback compile command in `cj/c-compile-command` was building paths from `(buffer-name)`. That broke for renamed buffers, uniquified names like `foo.c<2>`, and files outside `default-directory`. The buffer name is a display label, not a path, so `gcc -o name name` would compile (or fail to compile) the wrong target whenever the two diverged. I extracted `cj/c--single-file-compile-command` that takes the source path explicitly, shell-quotes both source and output paths, and signals a clear `user-error` for non-file buffers. The fallback now passes `buffer-file-name` instead of `(buffer-name)`. Tests for this helper landed in commit f619cbf alongside other prog-c coverage work.
Diffstat (limited to 'modules/prog-c.el')
-rw-r--r--modules/prog-c.el14
1 files changed, 11 insertions, 3 deletions
diff --git a/modules/prog-c.el b/modules/prog-c.el
index df32b76a..dbc11899 100644
--- a/modules/prog-c.el
+++ b/modules/prog-c.el
@@ -100,6 +100,16 @@
;; -------------------------------- Compilation --------------------------------
;; Smart compilation with project detection
+(defun cj/c--single-file-compile-command (file)
+ "Return a GCC compile command for C source FILE.
+The output binary is FILE without its extension. Both paths are shell
+quoted so spaces and shell metacharacters in filenames are handled."
+ (unless file
+ (user-error "C compile: buffer is not visiting a file"))
+ (format "gcc -Wall -Wextra -g -o %s %s"
+ (shell-quote-argument (file-name-sans-extension file))
+ (shell-quote-argument file)))
+
(defun cj/c-compile-command ()
"Set buffer-local compile command based on project structure."
(let* ((makefile (locate-dominating-file default-directory "Makefile"))
@@ -114,9 +124,7 @@
(t
;; Single file compilation
(setq-local compile-command
- (format "gcc -Wall -Wextra -g -o %s %s"
- (file-name-sans-extension (buffer-name))
- (buffer-name)))))))
+ (cj/c--single-file-compile-command buffer-file-name))))))
(add-hook 'c-mode-hook 'cj/c-compile-command)
(add-hook 'c-ts-mode-hook 'cj/c-compile-command)