# $Id$

ifeq ($(TARGET),)
TARGET = $(shell uname -s)
endif

ifeq ($(CC),)
CC = gcc
endif

CFLAGS = -Wall -Wextra -Iinclude
LDFLAGS =
LIBS =

ifeq ($(DEBUG),1)
CFLAGS += -g
endif

ifeq ($(VULKAN_NO_STRING_HELPER),1)
VK_STRING_HELPER_DEFINE =
else
VK_STRING_HELPER_DEFINE = -DHAS_VK_ENUM_STRING_HELPER
endif

CFLAGS += $(VK_STRING_HELPER_DEFINE)

L_CFLAGS = $(CFLAGS) -fPIC -D_MILSKO
L_LDFLAGS = $(LDFLAGS)
L_LIBS = $(LIBS)

E_CFLAGS = $(CFLAGS)
E_LDFLAGS = $(LDFLAGS) -Lsrc
E_LIBS = $(LIBS) -lMw

L_OBJS = src/core.o src/default.o src/draw.o src/lowlevel.o src/font.o src/boldfont.o src/error.o
L_OBJS += src/external/ds.o src/external/image.o
L_OBJS += src/widget/window.o src/widget/button.o src/widget/frame.o src/widget/menu.o src/widget/submenu.o src/widget/image.o

ifeq ($(TARGET),NetBSD)
CFLAGS += -I/usr/X11R7/include -I/usr/pkg/include
LDFLAGS += -L/usr/X11R7/lib -L/usr/pkg/lib -Wl,-R/usr/X11R7/lib -Wl,-R/usr/pkg/lib
UNIX = 1

OPENGL = 1
else ifeq ($(TARGET),Linux)
L_LIBS += -ldl
UNIX = 1

OPENGL = 1
VULKAN = 1
else ifeq ($(TARGET),Windows)
WINDOWS = 1

OPENGL = 1
VULKAN = 1
else ifeq ($(TARGET),UnixWare)
CC = gcc
UNIX = 1
L_LIBS += -lsocket -lnsl

NO_XRENDER = 1
else
$(error Add your platform definition)
endif

ifeq ($(UNIX),1)
L_CFLAGS += -DUSE_X11
L_OBJS += src/backend/x11.o
L_LIBS += -lX11
ifeq ($(NO_XRENDER),1)
L_CFLAGS += -DNO_XRENDER
else
L_LIBS += -lXrender
endif
L_LIBS += -lXext

GL = -lGL

E_LIBS += -lm

SO = .so
EXEC =
else ifeq ($(WINDOWS),1)
L_CFLAGS += -DUSE_GDI
L_LDFLAGS += -Wl,--out-implib,src/libMw.lib -static-libgcc
L_OBJS += src/backend/gdi.o
L_LIBS += -lgdi32

GL = -lopengl32

SO = .dll
EXEC = .exe
endif

EXAMPLES = examples/example$(EXEC) examples/rotate$(EXEC) examples/image$(EXEC)

ifeq ($(OPENGL),1)
L_OBJS += src/widget/opengl.o
EXAMPLES += examples/opengl$(EXEC)
endif

ifeq ($(VULKAN),1)
L_OBJS += src/widget/vulkan.o
EXAMPLES += examples/vulkan$(EXEC)
endif

.PHONY: all format clean lib examples

all: lib examples
lib: src/libMw$(SO)
examples: $(EXAMPLES)

format:
	clang-format --verbose -i `find src include examples tools "(" -name "*.c" -or -name "*.h" ")" -and -not -name "stb_*.h"`
	perltidy -b -bext='/' --paren-tightness=2 `find tools -name "*.pl"`

src/libMw$(SO): $(L_OBJS)
	$(CC) $(L_LDFLAGS) -shared -o $@ $^ $(L_LIBS)

examples/opengl$(EXEC): examples/opengl.o src/libMw$(SO)
	$(CC) $(E_LDFLAGS) -o $@ $< $(E_LIBS) $(GL)

examples/%$(EXEC): examples/%.o src/libMw$(SO)
	$(CC) $(E_LDFLAGS) -o $@ $< $(E_LIBS)

src/%.o: src/%.c
	$(CC) $(L_CFLAGS) -c -o $@ $<

examples/%.o: examples/%.c
	$(CC) $(E_CFLAGS) -c -o $@ $<

clean:
	rm -f src/*.dll src/*.so src/*.a src/*.lib */*.o */*/*.o examples/*.exe $(EXAMPLES) examples/opengl examples/vulkan
