Makefile 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. SRCDIR = src
  2. LIBSRCS := $(shell find $(SRCDIR)/toolbox -name "*.c")
  3. SRCS := $(shell find $(SRCDIR) -name "*.c")
  4. OBJDIR = .build
  5. LIBOBJS := $(patsubst %.c,%.o,$(subst $(SRCDIR),$(OBJDIR),$(LIBSRCS)))
  6. OBJS := $(patsubst %.c,%.o,$(subst $(SRCDIR),$(OBJDIR),$(SRCS)))
  7. DYNOBJDIR = .dynbuild
  8. DYNLIBOBJS := $(patsubst %.c,%.o,$(subst $(SRCDIR),$(DYNOBJDIR),$(LIBSRCS)))
  9. INCS = -I include/
  10. LIBS = -lc
  11. CFLAGS += -m64 $(INCS) -pedantic -Wall -Wextra -Wshadow \
  12. -Wcast-align -Wunused -Wconversion -Wmisleading-indentation\
  13. -Wduplicated-cond -Wduplicated-branches -Wlogical-op\
  14. -Wdouble-promotion -Wformat=2 -Wbad-function-cast \
  15. -Wmissing-declarations -Wmissing-parameter-type \
  16. -Wmissing-prototypes -Wnested-externs
  17. LDFLAGS += ${LIBS}
  18. CC += -std=c99
  19. ifeq ($(DEBUG), 0)
  20. CFLAGS += -O3
  21. else
  22. CFLAGS += -g -DDEBUG
  23. LDFLAGS += -g
  24. endif
  25. .PHONY: clean install uninstall reinstall all options run test \
  26. lib static_lib dynamic_lib
  27. BINDIR = bin
  28. TARGET = ToolBox
  29. BINARY = $(BINDIR)/$(TARGET)
  30. DYNLIB = lib$(shell echo $(TARGET) | tr '[:upper:]' '[:lower:]').so
  31. STALIB = lib$(shell echo $(TARGET) | tr '[:upper:]' '[:lower:]').ar
  32. PKGCONFILE = $(shell echo $(TARGET) | tr '[:upper:]' '[:lower:]').pc
  33. HEADERS = include/toolbox
  34. all: lib $(BINARY)
  35. lib: static_lib dynamic_lib
  36. static_lib: $(STALIB)
  37. dynamic_lib: $(DYNLIB)
  38. options:
  39. @echo $(TARGET) build options:
  40. @echo -e "CC = $(CC)"
  41. @echo -e "CFLAGS = $(CFLAGS)"
  42. @echo -e "LDFLAGS = $(LDFLAGS)"
  43. @echo
  44. run: $(BINARY)
  45. @./$(BINARY)
  46. test:
  47. ifneq ("$(wildcard compile_commands.json)","")
  48. @cppcheck --enable=all --suppress=missingInclude \
  49. --project=compile_commands.json $(INCS) .
  50. else
  51. @cppcheck --enable=all --suppress=missingInclude $(INCS) .
  52. endif
  53. bear:
  54. @make clean; bear -- make
  55. $(OBJS): $(SRCS) | $(OBJDIR)
  56. @echo [CC] $@ $(patsubst %.o, %.c, $(subst $(OBJDIR), $(SRCDIR), $@))
  57. @$(CC) -c $(CFLAGS) -o $@ $(patsubst %.o, %.c, $(subst $(OBJDIR), $(SRCDIR), $@))
  58. $(BINARY): $(OBJS) | $(BINDIR)
  59. @echo [LD] $@ $^
  60. @$(CC) $(LDFLAGS) -o $@ $^
  61. $(DYNLIBOBJS): $(LIBSRCS) | $(DYNOBJDIR)
  62. @echo [CC] -fPIC $@ $(patsubst %.o, %.c, $(subst $(DYNOBJDIR), $(SRCDIR), $@))
  63. @$(CC) -fPIC -c $(CFLAGS) -o $@ $(patsubst %.o, %.c, $(subst $(DYNOBJDIR), $(SRCDIR), $@))
  64. $(DYNLIB): $(DYNLIBOBJS)
  65. @echo [LD] $@ $^
  66. @$(CC) -shared $(LDFLAGS) -o $@ $^
  67. $(STALIB): $(LIBOBJS)
  68. @echo [AR] $@ $^
  69. @ar rs $@ $^
  70. clean:
  71. @rm -rf $(OBJDIR) $(BINDIR) $(DYNOBJDIR) $(DYNLIB) $(STALIB)
  72. $(BINDIR):
  73. @mkdir -p $@
  74. $(DYNOBJDIR) $(OBJDIR):
  75. @mkdir -p $@
  76. @mkdir -p $@/toolbox
  77. @mkdir -p $@/toolbox/list
  78. reinstall: uninstall install
  79. install: $(DYNLIB) $(STALIB)
  80. @echo installing dynamic library to /usr/lib
  81. @install -Dm755 $(DYNLIB) /usr/lib/$(DYNLIB)
  82. @echo installing static library to /usr/lib
  83. @install -Dm644 $(STALIB) /usr/lib/$(STALIB)
  84. @echo installing pkgconf file to /usr/lib/pkgconfig
  85. @install -Dm755 $(PKGCONFILE) /usr/lib/pkgconfig/$(PKGCONFILE)
  86. @echo installing headers to /usr/include
  87. @cp -rf $(HEADERS) /usr/$(HEADERS)
  88. @chmod 755 /usr/$(HEADERS)
  89. @find /usr/$(HEADERS) -type f -exec chmod 644 '{}' \;
  90. @find /usr/$(HEADERS) -type d -exec chmod 755 '{}' \;
  91. uninstall:
  92. @echo removing dynamic library from /usr/lib
  93. @rm -rf /usr/lib/$(DYNLIB)
  94. @echo removing static library from /usr/lib
  95. @rm -rf /usr/lib/$(STALIB)
  96. @echo removing pkgconf file from /usr/lib/pkgconfig
  97. @rm -rf /usr/lib/pkgconfig/$(PKGCONFILE)
  98. @echo removing headers from /usr/include
  99. @rm -rf /usr/$(HEADERS)