MESHLIB_DIR = ../MeshLib
MESHLIB_CFLAGS = -I$(MESHLIB_DIR)
MESHLIB_LIB = $(MESHLIB_DIR)/libmesh.a

DEBUG = -g
#DEBUG = -O2
CC = g++

CFLAGS = -Wall -Werror $(DEBUG) $(MESHLIB_CFLAGS)
LDFLAGS = $(DEBUG)

TARGETS = stl_dump stl_repair stl_checkbin stl_split stl_to_scad tetra diameter

.PHONY: all
all:
	@$(MAKE) --no-print-directory .depend
	@$(MAKE) --no-print-directory -C $(MESHLIB_DIR)
	@$(MAKE) --no-print-directory $(TARGETS)

.cpp.o:
	$(CC) $(CFLAGS) -c $<

# stl_dump

STL_DUMP_SRCS = stl_dump.cpp
STL_DUMP_OBJS = $(STL_DUMP_SRCS:.cpp=.o)

stl_dump: $(STL_DUMP_OBJS) $(MESHLIB_LIB)
	$(CC) $(LDFLAGS) -o stl_dump $(STL_DUMP_OBJS) $(MESHLIB_LIB) -lm

# stl_repair

STL_REPAIR_SRCS = stl_repair.cpp
STL_REPAIR_OBJS = $(STL_REPAIR_SRCS:.cpp=.o)

stl_repair: $(STL_REPAIR_OBJS) $(MESHLIB_LIB)
	$(CC) $(LDFLAGS) -o stl_repair $(STL_REPAIR_OBJS) $(MESHLIB_LIB) -lm

# stl_checkbin

STL_CHECKBIN_SRCS = stl_checkbin.cpp
STL_CHECKBIN_OBJS = $(STL_CHECKBIN_SRCS:.cpp=.o)

stl_checkbin: $(STL_CHECKBIN_OBJS)
	$(CC) $(LDFLAGS) -o stl_checkbin $(STL_CHECKBIN_OBJS)

# stl_split

STL_SPLIT_SRCS = stl_split.cpp
STL_SPLIT_OBJS = $(STL_SPLIT_SRCS:.cpp=.o)

stl_split: $(STL_SPLIT_OBJS) $(MESHLIB_LIB)
	$(CC) $(LDFLAGS) -o stl_split $(STL_SPLIT_OBJS) $(MESHLIB_LIB) -lm

# stl_to_scad

STL_TO_SCAD_SRCS = stl_to_scad.cpp
STL_TO_SCAD_OBJS = $(STL_TO_SCAD_SRCS:.cpp=.o)

stl_to_scad: $(STL_TO_SCAD_OBJS) $(MESHLIB_LIB)
	$(CC) $(LDFLAGS) -o stl_to_scad $(STL_TO_SCAD_OBJS) $(MESHLIB_LIB) -lm

# tetra

TETRA_SRCS = tetra.cpp
TETRA_OBJS = $(TETRA_SRCS:.cpp=.o)

tetra: $(TETRA_OBJS) $(MESHLIB_LIB)
	$(CC) $(LDFLAGS) -o tetra $(TETRA_OBJS) $(MESHLIB_LIB) -lm

# diameter

DIAMETER_SRCS = diameter.cpp
DIAMETER_OBJS = $(DIAMETER_SRCS:.cpp=.o)

diameter: $(DIAMETER_OBJS) $(MESHLIB_LIB)
	$(CC) $(LDFLAGS) -o diameter $(DIAMETER_OBJS) $(MESHLIB_LIB) -lm

SOURCES = $(STL_DUMP_SRCS) $(STL_REPAIR_SRCS) $(STL_CHECKBIN_SRCS) \
	$(STL_SPLIT_SRCS) $(STL_TO_SCAD_SRCS) $(TETRA_SRCS) $(DIAMETER_SRCS)

.depend: $(SOURCES)
	$(CC) -E -MM $(CFLAGS) $(SOURCES) > .depend

sinclude .depend

.PHONY: clean
clean:
	$(RM) stl_dump $(STL_DUMP_OBJS)
	$(RM) stl_repair $(STL_REPAIR_OBJS)
	$(RM) stl_checkbin $(STL_CHECKBIN_OBJS)
	$(RM) stl_split $(STL_SPLIT_OBJS)
	$(RM) stl_to_scad $(STL_TO_SCAD_OBJS)
	$(RM) tetra $(TETRA_OBJS) tetra_cw.stl tetra_ccw.stl
	$(RM) diameter $(DIAMETER_OBJS)
	$(RM) .depend core
