An easily configurable Makefile.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
example
LICENSE
Makefile
README.md

README.md

Easy Makefile

This is a makefile designed to be dropped in to a project and for the most part "just work" after a little bit of configuration in a config.mk file.

Make is a great tool, but I remember how hard it was to learn. It's very different from most other build systems. It's my hope that this file can be useful for someone who's new to C or C++.

If there's anything you'd like to see changed, for example limitations or bad practices, feel free to create an issue.

Simple example

Download the Makefile:

wget https://raw.githubusercontent.com/mortie/easy-makefile/master/Makefile

and create a config file for it:

config.mk:

TARGET=example-program

Now just run make, and all C source files in src/ will be compiled into a binary called example-program. If you change any header or source file, only the the necessary files will be recompiled the next time you run make.

To compile C++ instead of C:

config.mk:

EXT=.cc
TARGET=example-program

Here, we set the file extension to .cc (the UNIX convention for C++ files). Instesad of $(CC), the Makefile will now use $(CXX), which is a C++ compiler (generally g++ on GNU/Linux systems).

Slightly bigger example

The example directory contains a small example project.

Variables

TARGET

TARGET is the name of the binary.

FILES

FILES is the list of files to compile.

Default value: $(shell find $(SRC) -name '*$(EXT)' | sed 's/^.\///) - Find all files with the extension you specify with EXT in the directory you specify with SRC. The sed command is to remove the annoying ./ prefix you get when setting SRC to the current directory (.).

EXT

EXT is the filename extension for your source files, generally .c for C and .cc for C++.

Default value: .c

SRC

SRC is the directory which contains the source files.

Default value: src

COMPILER

COMPILER is the compiler. This defaults to $(CXX) if EXT is .cc, and $(CC) otherwise. You generally don't need to change this yourself, as long as you use the extension .cc for C++ and .c for C.

WARN

WARN is a list of warning options.

Default value: all pedantic (expands to -Wall -Wpedantic)

LINK

LINK is a list of shared libraries to link with. To link with the math library for example (libm.so): LINK=m (expands to -lm)

INCLUDE

INCLUDE is a list of directories to append to your include search path. To include a directory called headers: INCLUDE=headers (expands to -Iheaders)

LIBS

LIBS is a list of statically linked libraries (generally libfoo.a), which the final binary will be linked with.

FLAGS

FLAGS is general compiler flags.

FLAGS_DBG

FLAGS_DBG is flags which are only applied when compiling in debug mode (aka make DEBUG=1).

Default: -g -o0 -DDEBUG

FLAGS_NDBG

FLAGS_NDBG is flags which are only applied when compiling without debug mode.

DEPS

DEPS is additional targets you want to add as a dependency for $(TARGET).

JUNK

JUNK is additional files to be deleted with a make clean.

TOOLCHAIN

TOOLCHAIN is mainly for cross compiling. If you set TOOLCHAIN=aarch64-linux-gnu- and CC=gcc, source files will be compiled with aarch64-linux-gnu-gcc, and thus be compiled for 64-bit ARM.