The purpose of this package is to automate come of the basic and repetetive tasks involved in C programming. All the tasks that this pacakge automate are language agnostic and whilst the defaults are C specific you can set them to any statically compiled language.
CC = <compiler set by basic-c-compile-compiler>
INFILE= <file-name>.c
OUTFILE= <file-name>.o
build: %(INFILE)
$(CC) -Wall $(INFILE) -o $(OUTFILE)
clean:
rm -rf *.o
rebuild: clean buildNote: INFILE can also be a list of files depending on what
basic-c-compile-all-files is set to.
This pacakge has three entry points: basic-c-compile-file,
basic-c-compile-makefile and basic-c-compile-run-c.
This command initially checks if you want to compile with or without a
Makefile (just press ‘y’ or ‘n’). If you press ‘y’, it will check for
a Makefile in the file’s directory. If there is one present, it will
check for of the form <file-name>.o. Upon finding one, the package
will run the command make rebuild. This assumes the Makefile is
structured as expected. If no file is found, then make build will be
run. If you choose to run without a Makefile,
<compiler> <flags> -o <file-name>.<extension> <file-name>.c will be run.
<compiler> = basic-c-compiler-compiler
<flags> = basic-c-compile-compiler-flags
<extension> = basic-c-compiler-outfile-extension
This command creates a Makefile in the form shown above.
If the variable basic-c-compile-all-files is set to “all”, then all
the files in the directory with the .c extension will be
compiled. If set to “selected” you will be prompted to write a list of
the files to be compiled. The files should be separated by a space. If
basic-c-compile-all-files is set to anything else, only the current
file will be included.
This command runs the output file <file-name>.<extension with
./<file-name>.<extension>.
All customisable setting can be found in the customisation menu (M-x
customize-variable). They are in the group basic-c-compile which is
in the tools section. You can also change them in your init file
with: (setq <variable-name> <variable-value>).
| Variable | Description | Default |
|---|---|---|
basic-c-compile-compiler | Set compiler | “gcc” |
basic-c-compile-all-files | Choose the set of files compiled | “all” |
basic-c-compiler-flags | String of the flags used by the compiler | “-Wall” |
basic-c-coomile-auto-comp | Boolean defining wherer or not to update out-of-date outfiles | t |
basic-c-compile-outfile-extension | String or nil setting the extension added to the outfile | “.o” |
basic-c-compile-make-clean | Command run for make clean | “rm -f *.o” |
This example below is how I have the package setup for me. In my init file I have:
(require basic-c-compile)
(setq basic-c-compiler "gcc-6"
basic-c-compile-all-files nil
basic-c-compile-compiler-flags "-Wall -Werror -std=c11"The main issue I find with this workflow is for programs that require file redirection because the eshell doesn’t support this. Basically, that’s the only time that I switch to a shell outside of Emacs. Currently, I am working on adding this facility.
Currently when you run basic-c-compile-run-c it hangs after
basic-c-compile-file. To get passed this just press enter and it
will continue. I am trying to sort this out though.