Newer
Older
Import / research / mini-shell / Makefile
#
#  Universal Simple Makefile
#  (C) Copyright 2017
#  John Ryland
#
# Description:
#   Simple boilerplate of a Makefile where you don't
#   need to provide anything, it will generate a project
#   file for you which you can customize if you like.
#   The project file will be initially populated with
#   any source files in the current directory. Header
#   file dependancies are then automatically calculated.
#
OBJECTS      = $(patsubst %.cpp, build/.objs/%.o, $(SOURCES))
DEPENDS      = $(patsubst build/.objs/%.o, build/.deps/%.cpp.d, $(OBJECTS))
BASENAME     = $(shell basename $(PWD))
PLATFORM     = $(shell uname -s)
ARCH         = $(shell uname -m)
COMPILER     = $(shell c++ --version | tr [a-z] [A-Z] | grep -o 'CLANG\|GCC' | head -n 1)
COMPILER_VER = $(shell c++ --version | grep -o "[0-9]\.[0-9]" | head -n 1)
PROJECT_FILE = $(BASENAME).pro

-include $(PROJECT_FILE)

all: $(PROJECT_FILE) build/$(TARGET) $(ADDITIONAL_DEPS)
		@grep "TODO" $(SOURCES) *.h

clean:
		rm -rf build

$(PROJECT_FILE):
		@echo "TARGET   = $(BASENAME)" > $@
		@echo "SOURCES  = $(shell ls *.c *.cpp 2> /dev/null)" >> $@
		@echo "CFLAGS   =" >> $@
		@echo "LFLAGS   =" >> $@

build/.deps/%.cpp.d: %.cpp
		@mkdir -p `dirname $@`
		c++ $(CFLAGS) -MT $(patsubst %.cpp, build/.objs/%.o, $<) -MD -E $< -MF $@ > /dev/null

build/.objs/%.o: %.cpp build/.deps/%.cpp.d
		@mkdir -p `dirname $@`
		c++ $(CFLAGS) -c $< -o $@

build/$(TARGET): $(OBJECTS) $(DEPENDS)
		c++ $(LFLAGS) $(OBJECTS) -o $@
		strip -S $@

.PHONY: all clean

-include $(DEPENDS)

debug:
		@echo "BASENAME     = $(BASENAME)"
		@echo "PROJECT_FILE = $(PROJECT_FILE)"
		@echo "PLATFORM     = $(PLATFORM)"
		@echo "ARCH         = $(ARCH)"
		@echo "COMPILER     = $(COMPILER)"
		@echo "VERSION      = $(COMPILER_VER)"