binary 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. CPPSTD ?= --std=c++1z
  2. CPPFLAGS += $(CPPSTD)
  3. SRCDIR ?= ./source
  4. SRCEXT ?= .cpp
  5. override CPPFLAGS += -MMD -MP
  6. override CPPFLAGS += $(shell cat .cxxflags 2> /dev/null | xargs)
  7. override CPPFLAGS += -I./include -I$(SRCDIR)
  8. override LDFLAGS += $(shell cat .ldflags 2> /dev/null | xargs)
  9. override LDFLAGS += -L./lib
  10. override LDLIBS += $(shell cat .ldlibs 2> /dev/null | xargs)
  11. override LOCALIB += $(wildcard lib/*.a)
  12. INSTALL_BIN ?= bin
  13. INSTALL_SOURCE ?= source
  14. #LOCAL_TEMP
  15. #LOCAL_DIST
  16. COPYRIGHT_FILE ?= ./COPYRIGHT
  17. ifneq ($(shell cat $(COPYRIGHT_FILE) 2> /dev/null),)
  18. COPYRIGHT ?= $(COPYRIGHT_FILE)
  19. COPYRIGHT_DEP = $(COPYRIGHT_FILE)
  20. else
  21. COPYRIGHT ?= /dev/null
  22. endif
  23. PREFIX ?= $(DESTDIR)/usr/local
  24. BINDIR := $(PREFIX)/$(INSTALL_BIN)
  25. INSTALL_SRCDIR := $(PREFIX)/$(INSTALL_SOURCE)
  26. TEMPDIR := temp
  27. ifneq ($(LOCAL_TEMP),)
  28. TEMPDIR := $(TEMPDIR)/$(LOCAL_TEMP)
  29. endif
  30. DISTDIR := out
  31. ifneq ($(LOCAL_DIST),)
  32. DISTDIR := $(DISTDIR)/$(LOCAL_DIST)
  33. endif
  34. ifeq ($(origin TARGET), undefined)
  35. TARGET := $(shell pwd | xargs basename)
  36. endif
  37. OUT := $(DISTDIR)/$(TARGET)
  38. ifeq ($(origin HEADERS), undefined)
  39. HEADERS := $(shell find -wholename "$(SRCDIR)/*.hpp" && find -wholename "$(SRCDIR)/*.h")
  40. endif
  41. ifeq ($(origin SOURCES), undefined)
  42. SOURCES := $(shell find -wholename "$(SRCDIR)/*$(SRCEXT)")
  43. endif
  44. OBJECTS := $(SOURCES:$(SRCDIR)/%$(SRCEXT)=$(TEMPDIR)/%.o)
  45. OBJDIRS := $(shell dirname $(OBJECTS))
  46. DEPENDS := $(OBJECTS:.o=.d)
  47. INSTALL_SOURCES := $(SOURCES:$(SRCDIR)/%=$(INSTALL_SRCDIR)/%)
  48. INSTALL_SOURCES += $(HEADERS:$(SRCDIR)/%=$(INSTALL_SRCDIR)/%)
  49. INSTALL_SRCDIRS := $(shell dirname $(INSTALL_SOURCES))
  50. $(OUT): $(OBJECTS) $(LOCALIB) | $(DISTDIR)
  51. $(CXX) $(LDFLAGS) $(OBJECTS) $(LOCALIB) $(LDLIBS) -o $@
  52. $(TEMPDIR)/%.o: $(SRCDIR)/%$(SRCEXT) | $(TEMPDIR)
  53. @mkdir -p $(@D)
  54. $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
  55. $(TEMPDIR):
  56. @mkdir -p $@
  57. $(DISTDIR):
  58. @mkdir -p $@
  59. clean:
  60. @rm $(DEPENDS) 2> /dev/null || true
  61. @rm $(OBJECTS) 2> /dev/null || true
  62. @rmdir -p $(OBJDIRS) 2> /dev/null || true
  63. @rmdir -p $(TEMPDIR) 2> /dev/null || true
  64. @echo Temporaries cleaned!
  65. distclean: clean
  66. @rm $(OUT) 2> /dev/null || true
  67. @rmdir -p $(DISTDIR) 2> /dev/null || true
  68. @echo All clean!
  69. install_all: install install_source
  70. install: $(BINDIR)/$(TARGET)
  71. $(BINDIR)/$(TARGET): $(OUT) | $(BINDIR)
  72. install --strip $< $@
  73. $(BINDIR):
  74. @mkdir -p $@
  75. install_source: $(INSTALL_SOURCES)
  76. $(INSTALL_SRCDIR)/%: $(SRCDIR)/% $(COPYRIGHT_DEP)
  77. @mkdir -p $(@D)
  78. cat $(COPYRIGHT) > $@
  79. cat $< >> $@
  80. uninstall:
  81. -rm $(BINDIR)/$(TARGET)
  82. @rmdir -p $(BINDIR) 2> /dev/null || true
  83. @echo Binary uninstalled!
  84. uninstall_source:
  85. -rm $(INSTALL_SOURCES)
  86. @rmdir -p $(INSTALL_SRCDIRS) 2> /dev/null || true
  87. @echo Source code uninstalled!
  88. uninstall_all: uninstall uninstall_source
  89. @echo Everything uninstalled!
  90. -include $(DEPENDS)
  91. .PRECIOUS : $(OBJECTS)
  92. .PHONY : clean distclean uninstall uninstall_source uninstall_all