GHC = ghc GHCBASEFLAGS = -package parsec -package array GHCFLAGS = $(GHCBASEFLAGS) -Wall -O2 -threaded CXX = g++ CXXFLAGS = -Wall -Wextra -std=c++17 -O2 OBJDIR = obj HASKELL_AUX := Input.hs CPP_AUX := HASKELL_SRC := $(filter-out $(HASKELL_AUX),$(wildcard *.hs)) CPP_SRC := $(filter-out $(CPP_AUX),$(wildcard *.cpp)) HASKELL_BIN := $(HASKELL_SRC:.hs=) CPP_BIN := $(CPP_SRC:.cpp=) BINARIES := $(HASKELL_BIN) $(CPP_BIN) .PHONY: all clean depend all: $(BINARIES) clean: rm -f $(BINARIES) .depend_hs rm -rf $(OBJDIR) # Generate the .depend_hs file for correct Haskell dependency tracking depend: ghc -dep-suffix '' -dep-makefile .depend_hs -M $(GHCBASEFLAGS) $(HASKELL_SRC) sed -i 's/\.o *:/:/; s/\.hi$$/.hs/g; s/\.hi[ \t]/.hs/g' .depend_hs rm -f .depend_hs.bak $(HASKELL_BIN): %: %.hs | $(OBJDIR)/% $(GHC) $(GHCFLAGS) -odir $(OBJDIR)/$* -hidir $(OBJDIR)/$* -o $@ $< $(CPP_BIN): %: %.cpp $(CPP_AUX) | $(OBJDIR) $(CXX) $(CXXFLAGS) -o $@ $< $(OBJDIR)/%: mkdir -p $@ # By default, if it's needed, just create an empty file (but don't truncate if it exists) .depend_hs: touch $@ -include .depend_hs