jamie@252: #### jamie@252: #### Generic Makefile for C or C++ projects jamie@252: #### jamie@252: #### This file is public domain. jamie@252: #### Jamie Bullock 2014 jamie@252: #### jamie@252: jamie@252: ################################### jamie@252: ### User configurable variables ### jamie@252: ################################### jamie@252: jamie@252: #### It is best not to modify this file jamie@252: #### Instead override these variables in a separate Make.config file if needed jamie@252: jamie@252: # The name of the product to build (default uses parent directory name) jamie@252: NAME ?= $(notdir $(CURDIR)) jamie@252: # The file suffix of source files, can be .c or .cpp jamie@252: SUFFIX ?= .c jamie@252: # List of directories containing source files to be compiled jamie@252: DIRS ?= . jamie@252: # Flags to pass to the compiler for release builds jamie@252: FLAGS ?= -O3 jamie@252: # Flags to pass to the compiler for debug builds jamie@252: DEBUG_FLAGS ?= -O0 -g jamie@252: # Flags to pass to the linker jamie@252: LDFLAGS ?= jamie@252: # Type of product to build: "shared" for a shared library, "static" for a static library, empty for standalone jamie@252: LIBRARY ?= static jamie@252: # Prefix to the path that the "install" target will install into. libs to $(PREFIX)/lib, executables to $(PREFIX)/bin jamie@252: PREFIX ?= /usr/local jamie@252: jamie@252: ############################################## jamie@252: ### Do not modify anything below this line ### jamie@252: ############################################## jamie@252: jamie@252: ifeq ($(OS),Windows_NT) jamie@252: else jamie@252: PLATFORM := $(shell uname -s) jamie@252: endif jamie@252: jamie@252: -include Make.config jamie@252: jamie@252: OUT_DIR := .build jamie@252: SRC := $(foreach dir, $(DIRS), $(wildcard $(dir)/*$(SUFFIX))) jamie@252: OBJ_ := $(SRC:$(SUFFIX)=.o) jamie@252: OBJ := $(addprefix $(OUT_DIR)/,$(OBJ_)) jamie@252: DEPS := $(OBJ:.o=.d) jamie@252: SHARED_SUFFIX := dll jamie@252: STATIC_SUFFIX := lib jamie@252: INSTALL_DIR := $(PREFIX)/lib jamie@252: jamie@252: ifeq "$(PLATFORM)" "Darwin" jamie@252: SHARED_SUFFIX := dylib jamie@252: STATIC_SUFFIX := a jamie@252: endif jamie@252: jamie@252: ifeq "$(PLATFORM)" "Linux" jamie@252: SHARED_SUFFIX := so jamie@252: STATIC_SUFFIX := a jamie@252: endif jamie@252: jamie@252: ifeq "$(LIBRARY)" "shared" jamie@252: OUT=lib$(NAME).$(SHARED_SUFFIX) jamie@252: LDFLAGS += -shared jamie@252: else ifeq "$(LIBRARY)" "static" jamie@252: OUT=lib$(NAME).$(STATIC_SUFFIX) jamie@252: else jamie@252: OUT=$(NAME) jamie@252: INSTALL_DIR := $(PREFIX)/bin jamie@252: endif jamie@252: jamie@252: ifeq "$(SUFFIX)" ".cpp" jamie@252: COMPILER := $(CXX) jamie@252: else ifeq "$(SUFFIX)" ".c" jamie@252: COMPILER := $(CC) jamie@252: endif jamie@252: jamie@252: .SUFFIXES: jamie@252: .PHONY: debug clean install uninstall jamie@252: jamie@252: $(OUT): $(OBJ) jamie@252: ifeq "$(LIBRARY)" "static" jamie@252: @$(AR) rcs $@ $^ jamie@252: else jamie@278: @$(COMPILER) $^ $(LDFLAGS) -o $@ jamie@252: endif jamie@252: jamie@252: debug: FLAGS = $(DEBUG_FLAGS) jamie@252: debug: $(OUT) jamie@252: jamie@252: $(OUT_DIR)/%.o: %$(SUFFIX) jamie@252: @mkdir -p $(dir $@) jamie@252: @$(COMPILER) $(CXXFLAGS) $(FLAGS) -MMD -MP -fPIC -c $< -o $@ jamie@252: jamie@278: check: $(OUT) jamie@278: @./$(OUT) jamie@278: jamie@278: test: check jamie@278: jamie@252: install: $(OUT) jamie@252: @install -d $(INSTALL_DIR) jamie@252: @install $(OUT) $(INSTALL_DIR) jamie@252: jamie@252: uninstall: jamie@252: @$(RM) $(INSTALL_DIR)/$(OUT) jamie@252: jamie@252: clean: jamie@252: @$(RM) -r $(OUT) $(OUT_DIR) jamie@252: jamie@252: -include: $(DEPS)