Last active
November 20, 2020 21:49
-
-
Save keeferrourke/fe72476a8dd8c4c02ff18eaed74e1de0 to your computer and use it in GitHub Desktop.
Generic Makefile
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Generic makefile for a C project | |
# Written by Keefer Rourke <[email protected]> | |
# | |
# This file is Public Domain or, in places where public domain works | |
# are not recognized, licensed as CC0. Legal text: | |
# <https://creativecommons.org/publicdomain/zero/1.0/legalcode.txt> | |
# | |
# This Makefile should not rely and any GNU-specific functionality, | |
# though it is based on the GNU make documentation which is available | |
# at: <https://www.gnu.org/software/make/manual/make.html> | |
# specify the shell, in case the SHELL variable is not set or is not | |
# inherited from the environment | |
SHELL = /bin/bash | |
# set suffix list, to prevent confusion between different make programs | |
# line 17 clears an implied suffix list, and line 18 sets a new one | |
.SUFFIXES: | |
.SUFFIXES: .c .h .o | |
# project set up and directories | |
CC = gcc | |
INCLDIR = include/ | |
BINDIR = bin/ | |
OBJDIR = obj/ | |
SRCDIR = src/ | |
# final executable name | |
_BIN = a.out | |
BIN = $(addprefix $(BINDIR), $(_BIN)) | |
# files; here all object files will be stored in $(OBJDIR), with the | |
# same base names as corresponding c files from SRCDIR | |
SRC = $(wildcard src/*.c) | |
_OBJS = $(patsubst src/%.c, %.o, $(SRC)) | |
OBJS = $(addprefix $(OBJDIR), $(_OBJS)) | |
# compilation flags | |
CFLAGS = -Wall -std=c99 -pedantic -g -I$(INCLDIR) | |
OFLAGS = | |
# compile binary and object files | |
.PHONY: all | |
all: $(BIN) docs | |
$(BIN): $(BINDIR) $(OBJS) | |
$(CC) $(OFLAGS) $(OBJS) -o $(BIN) | |
$(BINDIR): | |
mkdir -p $(BINDIR) | |
$(OBJS): $(OBJDIR) $(SRC) | |
$(CC) $(CFLAGS) -c $(SRC) -o $(OBJS) | |
$(OBJDIR): | |
mkdir -p $(OBJDIR) | |
# generate docs with doxygen | |
# this is intended to be used with a Doxyfile that specifies LaTeX | |
# output; modify as required for different documentation formats | |
# | |
# DOCDIR and TEXDIR must match the appropriate directories specified in | |
# Doxyfile | |
DOCDIR = docs/ | |
TEXDIR = latex/ | |
.PHONY: docs docs-clean | |
docs: Doxyfile | |
doxygen | |
# generate PDF from LaTeX sources | |
cd $(DOCDIR)$(TEXDIR) && $(MAKE) | |
mv $(DOCDIR)$(TEXDIR)refman.pdf $(DOCDIR) | |
docs-clean: | |
cd $(DOCDIR)$(TEXDIR) && $(MAKE) clean | |
# clean entire project directory | |
.PHONY: clean | |
clean: | |
- rm -rf $(BINDIR) $(OBJDIR) $(DOCDIR) | |
# check code quality | |
.PHONY: cppcheck memcheck | |
cppcheck: | |
cppcheck --enable=all --language=c --std=c99 --inconclusive \ | |
--suppress=missingInclude $(SRC) -i $(INCLDIR) | |
memcheck: all | |
valgrind -v --show-leak-kinds=all --leak-check=full --track-origins=yes \ | |
./$(BIN) | |
# debugging make | |
print-% : | |
@echo $* = $($*) |
@Ramya2099, yeah this might just be a good starting point. It worked for my use cases during school, but probably isn't great for much else!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
When I am trying to maintain the same structure as above, this makefile is not generating the executable file.