CC=gcc
AS=as
LD=gcc

# -mcmodel=large 

TARGET =
LDFLAGS = -m32 -fno-PIC -fno-pie
CFLAGS = -m32 -Wall -Werror -W -fno-PIC -fno-pie
TGT_LDFLAGS =
TGT_CFLAGS =

all: targets

bin/%.elf:
	@mkdir -p $(dir $@)
	$(CC) -o $@ $(TGT_LDFLAGS) $(LDFLAGS) $(OBJECTS)

obj/%.o: src/%.c
	@mkdir -p $(dir $@)
	$(CC) -c -o $@ $(TGT_CFLAGS) $(CFLAGS) $^

obj/%.o: src/%.s
	@mkdir -p $(dir $@)
	$(CC) -c -o $@ $(TGT_CFLAGS) $(CFLAGS) $^

obj/%.o: src/%.S
	@mkdir -p $(dir $@)
	$(CC) -c -o $@ $(TGT_CFLAGS) $(CFLAGS) $^

to_obj = \
  $(patsubst src/%.c,obj/%.o, \
  $(patsubst src/%.s,obj/%.o, \
  $(patsubst src/%.S,obj/%.o,$1)))

define s2o
	$(call to_obj,$(1))
endef

# Elf target
# 1: binary name
# 2: C input files
# 3: Other dependencies
# 4: Extra CFLAGS
# 5: Extra LDFLAGS
define tgt
$(eval
TARGETS += $(1)
$(1): OBJECTS = $(call s2o,$(2))
$(1): $(call s2o,$(2))
$(1): $(3)
$(1): TGT_CFLAGS = $(4)
$(1): TGT_LDFLAGS = $(5)
)
endef

info:
	@echo $(TARGETS)

clean:
	rm -fr bin obj

include rules.mk

targets: $(TARGETS)
