added readme
This commit is contained in:
parent
c4d2ec2529
commit
5582eac14f
1 changed files with 95 additions and 0 deletions
95
README.md
Normal file
95
README.md
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
# mgen
|
||||||
|
|
||||||
|
Makefile generator for C projects.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
`mgen` automatically generates build rules for all source files (extension `.c`)
|
||||||
|
it finds in a recursive search of the directory in which it is run. It places
|
||||||
|
the rules in your existing makefile, meaning you can easily change build options
|
||||||
|
and even write your own rules based on those generated.
|
||||||
|
|
||||||
|
`mgen` will place the generated rules between the strings "`#=mgen_start=#`" and
|
||||||
|
"`#=mgen_end=#`" in your makefile. If these lines are not present, it will add
|
||||||
|
them to the end of the file and place the rules there. Anything not between
|
||||||
|
these lines will not be touched by `mgen`.
|
||||||
|
|
||||||
|
`mgen` utilizes make variables when generating the build rules. Some of these
|
||||||
|
variable names are common, while others are specific to `mgen`.
|
||||||
|
These are:
|
||||||
|
|
||||||
|
- CC -> C compiler
|
||||||
|
- CFLAGS -> compilation flags
|
||||||
|
- LDLIBS -> linker libraries
|
||||||
|
- LDFLAGS -> linker flags
|
||||||
|
- TARGET -> name of final executable/library
|
||||||
|
- BUILDDIR -> the directory where the final executable/library will be placed
|
||||||
|
- OBJDIR -> the directory where compiled object files will be placed
|
||||||
|
- INCS -> place for `-I` compiler flags to specify include directories. (must
|
||||||
|
be placed in this variable, not in CFLAGS or elsewhere)
|
||||||
|
|
||||||
|
It is therefore recommended that you set these at the beginning of your
|
||||||
|
makefile, unless you want to use the `make` defaults.
|
||||||
|
|
||||||
|
`mgen` will set `BUILDDIR` by default to `./build`. `OBJDIR` will be set to
|
||||||
|
`BUILDDIR/obj`. The user may manually override either or both of these variables
|
||||||
|
themselves.
|
||||||
|
|
||||||
|
## Why use this tool?
|
||||||
|
|
||||||
|
`mgen` offers distinct advantages over other, more complex build systems. These
|
||||||
|
include:
|
||||||
|
|
||||||
|
1. **Simplicity.** There are no special languages to learn, extra configuration
|
||||||
|
files, and countless features that you won't ever use. Of course, if you need
|
||||||
|
those things, there are other options available; that is not the space `mgen`
|
||||||
|
intends to occupy.
|
||||||
|
1. **Extensibility.** Because `mgen` adds to your existing makefile, you can
|
||||||
|
write your own build rules in a language you already know: make. Your custom
|
||||||
|
rules can use the ones generated by `mgen`, or you can just use the generated
|
||||||
|
ones; it's up to you, `mgen` gives you that option.
|
||||||
|
1. **Portability.** Once the makefile is generated, it can be run on any machine
|
||||||
|
that runs `make`. Your users do not have to have `mgen` to compile your
|
||||||
|
program, they can just use the generated makefile.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
$ mgen --help
|
||||||
|
Usage: mgen [OPTIONS]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-p, --pretty Replace default make output with nice build messages (colors!)
|
||||||
|
-c, --clean Generate a 'clean' rule that removes all build files
|
||||||
|
-r, --run Generate a 'run' rule that allows you run the executable with 'make run'
|
||||||
|
-l, --library Configure build rule to create a library rather than an executable (NYI)
|
||||||
|
-m, --makefile <MAKEFILE> Path to makefile [default: ./Makefile]
|
||||||
|
-h, --help Print help
|
||||||
|
```
|
||||||
|
|
||||||
|
Starting from a "blank slate," i.e. you have no build system configured in your
|
||||||
|
project, simply run `mgen` in the root directory and then run `make`. It's as
|
||||||
|
easy as that.
|
||||||
|
|
||||||
|
If you already have a makefile in use, remove any rules to build the target or
|
||||||
|
object files (that's what `mgen` is for). You can keep any other, more complex
|
||||||
|
rules that depend on these things, though. Then, run `mgen` and `make` and you
|
||||||
|
are good to go.
|
||||||
|
|
||||||
|
## Build Instructions
|
||||||
|
|
||||||
|
Build: `cargo build --release`
|
||||||
|
|
||||||
|
Install (must build first) (needs root): `sh install.sh`
|
||||||
|
|
||||||
|
Uninstall (needs root): `sh uninstall.sh`
|
||||||
|
|
||||||
|
## Todo
|
||||||
|
|
||||||
|
- Add functionality to generate rules to build a library, as opposed to an
|
||||||
|
executable.
|
||||||
|
- Add exclude directory(ies) from search
|
||||||
|
- Eventually: write man page.
|
||||||
|
- Maybe: figure out a way to only have the user run `mgen` once, then the
|
||||||
|
makefile itself will call it again if it needs to be regenerated due to a
|
||||||
|
change in project structure ?
|
Loading…
Reference in a new issue