static_lib 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. CPPSTD ?= --std=c++1z
  2. CPPFLAGS += $(CPPSTD)
  3. SRCDIR ?= ./source
  4. SRCEXT ?= .cpp
  5. #SHARED
  6. override CPPFLAGS += -MMD -MP
  7. override CPPFLAGS += -I./include -I$(SRCDIR)
  8. override CPPFLAGS += $(shell cat .cxxflags 2> /dev/null | xargs)
  9. ARFLAGS := $(ARFLAGS)c
  10. INSTALL_INCLUDE ?= include
  11. INSTALL_SOURCE ?= source
  12. INSTALL_LIB ?= lib
  13. #LOCAL_TEMP
  14. #LOCAL_DIST
  15. COPYRIGHT_FILE ?= ./COPYRIGHT
  16. ifneq ($(shell cat $(COPYRIGHT_FILE) 2> /dev/null),)
  17. COPYRIGHT ?= $(COPYRIGHT_FILE)
  18. COPYRIGHT_DEP = $(COPYRIGHT_FILE)
  19. else
  20. COPYRIGHT ?= /dev/null
  21. endif
  22. PREFIX ?= $(DESTDIR)/usr/local
  23. INCDIR := $(PREFIX)/$(INSTALL_INCLUDE)
  24. LIBDIR := $(PREFIX)/$(INSTALL_LIB)
  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. ifneq ($(SHARED),)
  35. LIBEXT := .so
  36. override LOCALIB += $(wildcard lib/*.a)
  37. override LDFLAGS += --shared
  38. override LDFLAGS += $(shell cat .ldflags 2> /dev/null | xargs)
  39. override LDFLAGS += -L./lib
  40. override LDLIBS += $(shell cat .ldlibs 2> /dev/null | xargs)
  41. else
  42. LIBEXT := .a
  43. endif
  44. ifeq ($(origin NAME), undefined)
  45. NAME := $(shell pwd | xargs basename)
  46. endif
  47. ifeq ($(origin TARGET), undefined)
  48. TARGET := $(NAME)$(LIBEXT)
  49. endif
  50. OUT := $(DISTDIR)/$(TARGET)
  51. ifeq ($(origin HEADERS), undefined)
  52. HEADERS := $(shell find -wholename "$(SRCDIR)/*.hpp" && find -wholename "$(SRCDIR)/*.h")
  53. endif
  54. INCLUDE := $(ADD_INCLUDE:%=$(INCDIR)/%) $(HEADERS:$(SRCDIR)/%=$(INCDIR)/%)
  55. INCDIRS := $(shell dirname $(INCLUDE) 2> /dev/null)
  56. ifeq ($(origin SOURCES), undefined)
  57. SOURCES := $(shell find -wholename "$(SRCDIR)/*$(SRCEXT)")
  58. endif
  59. OBJECTS := $(SOURCES:$(SRCDIR)/%$(SRCEXT)=$(TEMPDIR)/%.o)
  60. OBJDIRS := $(shell dirname $(OBJECTS))
  61. DEPENDS := $(OBJECTS:.o=.d)
  62. INSTALL_SOURCES := $(SOURCES:$(SRCDIR)/%=$(INSTALL_SRCDIR)/%)
  63. INSTALL_SOURCES += $(INCLUDE:$(INCDIR)/%=$(INSTALL_SRCDIR)/%)
  64. INSTALL_SOURCES += $(ADD_INSTALL_SOURCES:%=$(INSTALL_SRCDIR)/%)
  65. INSTALL_SRCDIRS := $(shell dirname $(INSTALL_SOURCES))
  66. build: $(OUT)
  67. $(DISTDIR)/%.a: $(OBJECTS) | $(DISTDIR)
  68. $(AR) $(ARFLAGS) $@ $^
  69. $(DISTDIR)/%.so: $(OBJECTS) $(LOCALIB) | $(DISTDIR)
  70. $(CXX) $(LDFLAGS) $(OBJECTS) $(LOCALIB) $(LDLIBS) -o $@
  71. $(TEMPDIR)/%.o: $(SRCDIR)/%$(SRCEXT) | $(TEMPDIR)
  72. @mkdir -p $(@D)
  73. $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
  74. $(TEMPDIR):
  75. @mkdir -p $@
  76. $(DISTDIR):
  77. @mkdir -p $@
  78. clean:
  79. @rm $(DEPENDS) 2> /dev/null || true
  80. @rm $(OBJECTS) 2> /dev/null || true
  81. @rmdir -p $(OBJDIRS) 2> /dev/null || true
  82. @rmdir -p $(TEMPDIR) 2> /dev/null || true
  83. @echo Temporaries cleaned!
  84. distclean: clean
  85. @rm $(OUT) 2> /dev/null || true
  86. @rmdir -p $(DISTDIR) 2> /dev/null || true
  87. @echo All clean!
  88. install_all: install install_source
  89. install: $(LIBDIR)/$(TARGET) $(INCLUDE)
  90. $(LIBDIR)/$(TARGET): $(OUT) | $(LIBDIR)
  91. cp $< $@
  92. $(LIBDIR):
  93. @mkdir -p $@
  94. $(INCDIR)/%.h: $(SRCDIR)/%.h $(COPYRIGHT_DEP)
  95. @mkdir -p $(@D)
  96. cat $(COPYRIGHT) > $@
  97. cat $< >> $@
  98. $(INCDIR)/%.hpp: $(SRCDIR)/%.hpp $(COPYRIGHT_DEP)
  99. @mkdir -p $(@D)
  100. cat $(COPYRIGHT) > $@
  101. cat $< >> $@
  102. install_source: $(INSTALL_SOURCES)
  103. $(INSTALL_SRCDIR)/%: $(SRCDIR)/% $(COPYRIGHT_DEP)
  104. @mkdir -p $(@D)
  105. cat $(COPYRIGHT) > $@
  106. cat $< >> $@
  107. uninstall:
  108. -rm $(INCLUDE)
  109. @rmdir -p $(INCDIRS) 2> /dev/null || true
  110. -rm $(LIBDIR)/$(TARGET)
  111. @rmdir -p $(LIBDIR) 2> /dev/null || true
  112. @echo Archives/includes uninstalled!
  113. uninstall_source:
  114. -rm $(INSTALL_SOURCES)
  115. @rmdir -p $(INSTALL_SRCDIRS) 2> /dev/null || true
  116. @echo Source code uninstalled!
  117. uninstall_all: uninstall uninstall_source
  118. @echo Everything uninstalled!
  119. -include $(DEPENDS)
  120. ifneq ($(shell cat unit_tests/Makefile 2> /dev/null),)
  121. TESTMAKE = +@$(MAKE) --no-print-directory -C unit_tests/ PARENT_DISTDIR=../$(DISTDIR) LOCAL_TEMP=$(LOCAL_TEMP) LOCAL_DIST=$(LOCAL_DIST)
  122. else
  123. TESTMAKE = -@true
  124. endif
  125. test: $(OUT)
  126. @$(TESTMAKE)
  127. test-clean:
  128. @$(TESTMAKE) clean
  129. test-cleanrun:
  130. @$(TESTMAKE) cleanrun
  131. @$(TESTMAKE) run
  132. test-all: test-clean test
  133. clean: test-clean
  134. .PRECIOUS : $(OBJECTS)
  135. .PHONY : build clean distclean uninstall uninstall_source uninstall_all test test-clean test-cleanrun test-all