Skip to content

mortie/easy-makefile

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

An easily configurable Makefile.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published