Makefile 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. CXXFLAGS += --std=c++1z
  2. CXXFLAGS += -MMD -MP
  3. CXXFLAGS += $(shell cat .cxxflags 2> /dev/null | xargs)
  4. CXXFLAGS += -I./include
  5. LDFLAGS += $(shell cat .ldflags 2> /dev/null | xargs)
  6. LDLIBS += $(shell cat .ldlibs 2> /dev/null | xargs)
  7. ifneq ($(strip $(WEB)),)
  8. LIBDIR := ./lib/web
  9. CXXFLAGS += -s USE_SDL=2
  10. LDFLAGS += -s USE_SDL=2
  11. TOOLS_CXX := $(CXX)
  12. CXX := emcc
  13. else
  14. LIBDIR := ./lib
  15. LDLIBS += -lSDL2main -lSDL2 -lpthread -lGL -lGLEW
  16. endif
  17. LDFLAGS += -L$(LIBDIR)
  18. SOURCES := $(shell echo *.cpp)
  19. TEMPDIR := temp
  20. DISTDIR := out
  21. ifneq ($(strip $(WEB)),)
  22. TEMPDIR := $(TEMPDIR)/web
  23. DISTDIR := $(DISTDIR)/web
  24. endif
  25. OBJECTS := $(SOURCES:%.cpp=$(TEMPDIR)/%.o)
  26. LOCALIB := $(wildcard $(LIBDIR)/*.a)
  27. DEPENDS := $(OBJECTS:.o=.d)
  28. ifneq ($(strip $(WEB)),)
  29. BINEXT := /main.html
  30. SHELL_TEMPLATE := ./common/emscripten_shell.template
  31. SHELLS := $(OBJECTS:%.o=%.shell)
  32. TITLIZE := ./tools/titlize
  33. endif
  34. TARGETS := $(SOURCES:%.cpp=$(DISTDIR)/%$(BINEXT))
  35. ifneq ($(strip $(WEB)),)
  36. JS := $(TARGETS:%.html=%.js)
  37. WASM := $(TARGETS:%.html=%.wasm)
  38. OUTDIRS := $(shell dirname $(TARGETS))
  39. endif
  40. GIT_HEAD_FILE := .git/HEAD
  41. GIT_HEAD_SHA := $(shell git rev-parse HEAD)
  42. build: $(TARGETS)
  43. ifneq ($(strip $(WEB)),)
  44. $(DISTDIR)/%$(BINEXT): $(TEMPDIR)/%.o $(TEMPDIR)/%.shell $(LOCALIB) | $(DISTDIR)
  45. @mkdir -p $(@D)
  46. $(CXX) $(LDFLAGS) $< $(LOCALIB) $(LDLIBS) -o $@ --shell-file $(TEMPDIR)/$*.shell
  47. # TODO: dependency on HEAD file doesn't work, need to parse it and depend on it if it's a sha or specified file if it's a ref
  48. $(TEMPDIR)/%.shell: $(SHELL_TEMPLATE) $(GIT_HEAD_FILE) $(TITLIZE)
  49. @sed -e 's/__TITLE__/$(shell echo $* | $(TITLIZE))/g' -e 's/__COMMIT_SHA_FILE__/$(GIT_HEAD_SHA)\/$*.cpp/g' $(SHELL_TEMPLATE) > $@
  50. $(TITLIZE): $(TITLIZE).cpp
  51. make WEB= CXX=$(TOOLS_CXX) $(TITLIZE)
  52. else
  53. $(DISTDIR)/%$(BINEXT): $(TEMPDIR)/%.o $(LOCALIB) | $(DISTDIR)
  54. @mkdir -p $(@D)
  55. $(CXX) $(LDFLAGS) $< $(LOCALIB) $(LDLIBS) -o $@
  56. endif
  57. $(TEMPDIR)/%.o: %.cpp | $(TEMPDIR)
  58. $(CXX) $(CXXFLAGS) -o $@ -c $<
  59. $(TEMPDIR):
  60. @mkdir -p $@
  61. $(DISTDIR):
  62. @mkdir -p $@
  63. clean:
  64. @rm $(DEPENDS) 2> /dev/null || true
  65. @rm $(OBJECTS) 2> /dev/null || true
  66. @rmdir -p $(TEMPDIR) 2> /dev/null || true
  67. @echo Temporaries cleaned!
  68. distclean: clean
  69. @rm $(TARGETS) 2> /dev/null || true
  70. @rm $(JS) 2> /dev/null || true
  71. @rm $(WASM) 2> /dev/null || true
  72. @rm $(SHELLS) 2> /dev/null || true
  73. @rmdir -p $(OUTDIRS) 2> /dev/null || true
  74. @rmdir -p $(DISTDIR) 2> /dev/null || true
  75. @echo All clean!
  76. -include $(DEPENDS)
  77. .PRECIOUS : $(OBJECTS)
  78. .PRECIOUS : $(SHELLS)
  79. .PHONY : clean distclean