ifeq ($(shell which root-config 2>/dev/null),)
  ROOT = $(HOME)/root_build/debug
  $(info Cannot find root-config: guessing the root is $(ROOT). Please source thisroot.sh)
  ROOTINCDIR = $(ROOT)/include
  ROOTLIBDIR = $(ROOT)/lib
else
  ROOTINCDIR = $(shell root-config --incdir)
  ROOTLIBDIR = $(shell root-config --libdir)
endif

CFLAGS = -Wall -Wextra -pedantic
INC = -Ithird_party -Ithird_party/imgui
LIBS = -lglfw

ROOTFLAGS = -std=c++17 -m64 -I$(ROOTINCDIR)
ROOTLIBS = -L$(ROOTLIBDIR) -lCore -lRIO -lROOTNTuple -lxxhash -pthread -Wl,-rpath,$(ROOTLIBDIR) 

IMGUI_FLAGS = -Ithird_party -Ithird_party/imgui

ifeq ($(shell which mold 2>/dev/null),)
  MOLD =
else
  MOLD = mold -run
endif

.PHONY: all clean
all: build/imgui.o ubsan

clean:
	rm -f build/*.o rntviewer

build/imgui.o: src/imgui_inc.cpp
	@mkdir -p $(@D)/build
	$(CXX) -O2 -fPIC -c $(IMGUI_FLAGS) $< -o $@

# debug build
d: build/imgui.o
	$(MOLD) $(CXX) -DDEBUG -g -O0 -DENABLE_ASAN $(CFLAGS) $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp build/imgui.o -lasan $(LIBS) $(ROOTLIBS)

# release build
r: build/imgui.o
	$(MOLD) $(CXX) -O2 -DNDEBUG $(CFLAGS) $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp build/imgui.o $(LIBS) $(ROOTLIBS)

# debug-release build
dr: build/imgui.o
	$(MOLD) $(CXX) -g -O2 $(CFLAGS) $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp build/imgui.o $(LIBS) $(ROOTLIBS)
	
# sanitizers
asan: build/imgui.o
	$(MOLD) $(CXX) -DDEBUG -g -O0 $(CFLAGS) -fsanitize=address $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp build/imgui.o $(LIBS) $(ROOTLIBS)

ubsan: build/imgui.o
	$(MOLD) $(CXX) -DDEBUG -g -O0 $(CFLAGS) -fsanitize=undefined $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp build/imgui.o $(LIBS) $(ROOTLIBS)

# no gfx debug build
nogfx_d:
	$(MOLD) $(CXX) -DDEBUG -g -O0 -DRNT_NO_GFX -DENABLE_ASAN $(CFLAGS) $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp -lasan $(ROOTLIBS)

# no gfx release build
nogfx_r:
	$(MOLD) $(CXX) -O2 -DRNT_NO_GFX -DNDEBUG $(CFLAGS) $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp $(ROOTLIBS)