#!/usr/bin/env -S make -f

MAKEFLAGS += --no-builtin-rules
#MAKEFLAGS += --warn-undefined-variables
.DELETE_ON_ERROR:
.RECIPEPREFIX := >

SHELL := bash
.SHELLFLAGS := -o errexit -o nounset -o pipefail -c
.ONESHELL:

## Makefile for C programs
## (c) by Rainer Zachmann

PROGRAMS := solv solv2 solv3

DEBUG    := -g
OPTIMIZE := -Ofast -fopt-info-all=gcc-opt.log -march=native
WARNINGS := @gcc-warnings
DEFS     :=

CPPFLAGS = $(DEBUG) $(DEFS)
CFLAGS   = $(WARNINGS) $(OPTIMIZE)
LDFLAGS  = $(DEBUG)

CLEANSUFFIXES := d o

OBJECTS := $(foreach PROG,$(PROGRAMS),$(PROG).o $($(PROG)_OBJS))

include $(OBJECTS:%.o=%.d)

$(OBJECTS:%.o=%.d): %.d:

.PHONY: all
.DEFAULT_GOAL := all
all: $(PROGRAMS)

.SECONDEXPANSION: $(PROGRAMS)
$(PROGRAMS): %: %.o $$($$*_OBJS)
> gcc $(LDFLAGS) $^ $($*_LIBS:%=-l%) -o $@

$(OBJECTS): %.o: %.c
> gcc $(CPPFLAGS) $(CFLAGS) -MMD -c -o $@ $<

tags: $(wildcard *.[ch])
> ctags $^

.PHONY: clean
clean:
> rm -f $(foreach SUFFIX,$(CLEANSUFFIXES),$(OBJECTS:%.o=%.$(SUFFIX)))
> rm -f tags

.PHONY: distclean
distclean: clean
> rm -f $(PROGRAMS)
