# CS111 Multiprocessing examples
PROGS = first-shell-soln cleanup-orders cleanup-orders-error-checking spawn-and-cleanup waitpid waitpid-status execvp-demo
CXX = /usr/bin/clang++-18

CXX_WARNINGS = -Wall -pedantic -Wno-unused-function -Wno-vla-extension -Wno-sign-compare
CXX_DEPS = -MMD -MF $(@:.o=.d)
CXX_DEFINES =
CXX_INCLUDES =

LIB_SRC = stsh-parser/scanner.cc stsh-parser/parser.cc stsh-parser/stsh-parse.cc stsh-parser/stsh-readline.cc


CXXFLAGS = -g -fPIE -fno-limit-debug-info $(CXX_WARNINGS) -O0 -std=c++20 $(CXX_DEPS) $(CXX_DEFINES) $(CXX_INCLUDES)
LDFLAGS = -lreadline -ll

LIB_OBJ = $(patsubst %.cc,%.o,$(patsubst %.S,%.o,$(LIB_SRC)))
LIB_DEP = $(patsubst %.o,%.d,$(LIB_OBJ))
LIB = stsh.a

PROGS_SRC = $(patsubst %,%.cc,$(PROGS))
PROGS_OBJ = $(patsubst %.cc,%.o,$(patsubst %.S,%.o,$(PROGS_SRC)))
PROGS_DEP = $(patsubst %.o,%.d,$(PROGS_OBJ))

all:: $(PROGS)

stsh-parser/scanner.cc stsh-parser/parser.cc stsh-parser/stsh-parse.cc stsh-parser/stsh-readline.cc: stsh-parser-build
stsh-parser-build:
	$(MAKE) -C stsh-parser

stsh-parser/parser.o: stsh-parser-build stsh-parser/parser.cc
stsh-parser/scanner.o: stsh-parser-build stsh-parser/scanner.cc

$(LIB): $(LIB_OBJ)
	rm -f $@
	ar r $@ $^
	ranlib $@

$(PROGS): %:%.o $(LIB)
	$(CXX) $^ $(LDFLAGS) -o $@

clean::
	$(MAKE) -C stsh-parser clean
	rm -f $(PROGS) $(PROGS_OBJ) $(PROGS_DEP)
	rm -f $(LIB) $(LIB_DEP) $(LIB_OBJ)

spartan:: clean
	$(MAKE) -C stsh-parser spartan
	\rm -fr *~

.PHONY: all clean spartan

-include $(LIB_DEP) $(PROGS_DEP)
