Makefile 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. ###############################################
  2. #!file Makefile
  3. #!author TooOld2Rock'nRoll (toooldtorock-n-roll@riseup.net)
  4. #!date 2022
  5. #!remark Last modified in 2023/oct
  6. #!brief Makefile for the Arcade Fighter Library.
  7. #!see - Mecklenburg, R. - 2009 - Managing Projects with GNU Make (Nutshell Handbooks)
  8. ###############################################
  9. SHELL := /bin/bash # Use bash syntax
  10. #the output library name!
  11. override OUT := libArcadeFighter.a
  12. srcdir := src
  13. incdir := inc
  14. objdir := .obj
  15. shadir := shaders
  16. shatargetdir := $(incdir)/graphics/$(shadir)
  17. create_dirs := $(objdir) $(shatargetdir)
  18. .SUFFIXES: .vert .frag
  19. #flags for the compiler
  20. override CFLAGS += -g -Wall -Wpedantic -pthread -MP -MD
  21. override CXXFLAGS += $(CFLAGS)
  22. #where to look for header files
  23. CPPFLAGS := -I$(incdir)
  24. #how to pack static library
  25. ARFLAGS := rs
  26. #list all source files
  27. vpath %.c $(srcdir)
  28. vpath %.cpp $(srcdir)
  29. c_files := $(wildcard $(srcdir)/*.c)
  30. cpp_files := $(wildcard $(srcdir)/*.cpp)
  31. #change path of .o files to the objdir target.
  32. c_objs := $(patsubst $(srcdir)/%.c,$(objdir)/%.o,$(c_files))
  33. cpp_objs:= $(patsubst $(srcdir)/%.cpp,$(objdir)/%.o,$(cpp_files))
  34. #list all shader files that need to be transformed into header files
  35. shader_files := $(wildcard $(shadir)/shader.*)
  36. shader_headers := $(patsubst $(shadir)/%,$(shatargetdir)/%.hpp,$(shader_files))
  37. #create necessary directories if not created yet
  38. create-output-directories := \
  39. $(shell for d in $(create_dirs); \
  40. do [[ -d $$d ]] || mkdir -p $$d; \
  41. done)
  42. # $(info SRC_LIST: $(c_files) $(cpp_files) $(shader_headers))
  43. #$(info OBJ_LIST: $(c_objs) $(cpp_objs) $(shader_dep))
  44. #*******************************
  45. #********build targets**********
  46. #*******************************
  47. .PHONY: all mem_profiling clean
  48. #.PHONY: help put this help up there when ready....
  49. # help - The default goal
  50. #TODO make a proper help!!!
  51. #help:
  52. #@$(MAKE) --print-data-base --question no-such-target /
  53. #$(GREP) -v -e '^no-such-target' -e '^makefile' /
  54. #$(AWK) '/^[^.%][-A-Za-z0-9_]*: { print substr($$1, 1, length($$1)-1) }' /
  55. #$(SORT) /
  56. #$(PR) --omit-pagination --width=80 --columns=4
  57. all: $(OUT)
  58. #change flags depending on target!
  59. mem_profiling: CFLAGS += -fsanitize=address -fno-omit-frame-pointer
  60. mem_profiling: all
  61. #pack the library and all necessary files
  62. $(OUT): $(c_objs) $(cpp_objs)
  63. $(AR) $(ARFLAGS) $@ $?
  64. ranlib $@
  65. #make .o into .d files and set as dependency (to recompile on header files changes)
  66. #clean does not need to generate a list of dependencies!
  67. ifneq "$(MAKECMDGOALS)" "clean"
  68. -include $(c_objs:.o=.d) $(cpp_objs:.o=.d)
  69. endif
  70. #compile .c files
  71. $(c_objs): $(shader_headers)
  72. $(COMPILE.c) $(OUTPUT_OPTION) $(patsubst $(objdir)/%.o,$(srcdir)/%.c,$@)
  73. #compile .cpp files
  74. $(cpp_objs): $(shader_headers)
  75. $(COMPILE.cc) $(OUTPUT_OPTION) $(patsubst $(objdir)/%.o,$(srcdir)/%.cpp,$@)
  76. #transform shader files into .hpp files so they can be shipped with the library
  77. $(shader_headers): $(shader_files)
  78. $(file > $@,R""($(file < $(patsubst $(shatargetdir)/%.hpp,$(shadir)/%,$@)))"")
  79. #remove all files generated by make
  80. clean:
  81. rm -rf $(shatargetdir)/*
  82. rm -rf $(objdir)/*
  83. rm -f $(OUT)