make.include 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # auto-dependency generation makefile
  2. #### Default values
  3. SRCEXTENSIONS := c C cpp
  4. CC := gcc
  5. CPP := g++
  6. LD := ld
  7. AR := ar
  8. #### build object directory token
  9. CPU := $(shell uname -m)
  10. OS := $(shell uname -s | tr '[A-Z]' '[a-z]')
  11. DEFAULT_ARCH := $(CPU)-$(OS)
  12. ifeq ($(strip $(ARCH)),)
  13. ARCH := $(DEFAULT_ARCH)
  14. endif
  15. OBJTOKEN := obj.$(ARCH)
  16. #
  17. # Under most circumstances, paths are simple
  18. #
  19. ifeq ($(POSTROOT),..)
  20. MODPATH := .
  21. OBJDIR := $(OBJTOKEN)
  22. else
  23. MODPATH := $(POSTROOT)/$(MODULENAME)
  24. OBJDIR := $(MODPATH)/$(OBJTOKEN)
  25. endif
  26. #
  27. # Directories
  28. #
  29. MODLIBS := \
  30. -L$(OBJDIR) \
  31. $(foreach dir, $(MODULES), -L$(POSTROOT)/$(dir)/$(OBJTOKEN))
  32. MODINCLUDES := \
  33. -I$(MODPATH)/include \
  34. $(foreach dir, $(MODULES), -I$(POSTROOT)/$(dir)/include)
  35. ALLTARGETS := \
  36. $(foreach targ, $(TARGETS), $(OBJDIR)/$(targ))
  37. VPATH := \
  38. $(MODPATH)/include \
  39. $(foreach dir, $(SRCDIRS), $(MODPATH)/$(dir)) \
  40. $(foreach dir, $(MODULES), $(POSTROOT)/$(dir)/include)
  41. #### include paths
  42. LIBPATH := $(MODLIBS)
  43. INCLUDEPATH += -I. -Iinclude $(MODINCLUDES)
  44. KCFLAGS = -O2 \
  45. -Wall -Werror -Wstrict-prototypes \
  46. -fno-strict-aliasing -fomit-frame-pointer \
  47. -DMODULE -D__KERNEL__
  48. CFLAGS := -fPIC -Wall -O2 -g
  49. CCFLAGS := -Werror
  50. CPPFLAGS := -ftemplate-depth-30
  51. #### Architecture deps
  52. KERNEL_INCLUDE := $(KERNEL_HOME)/include
  53. BINSTRIP := strip
  54. KCFLAGS += $(INCLUDEPATH)
  55. CFLAGS += $(INCLUDEPATH) $(LIBPATH)
  56. CCFLAGS += $(CFLAGS)
  57. CPPFLAGS += $(CFLAGS)
  58. #
  59. # targets
  60. #
  61. default: $(ALLTARGETS)
  62. ####################################################
  63. #
  64. # Dependency generation
  65. #
  66. # Get list of all source files
  67. SOURCES := \
  68. $(notdir $(wildcard \
  69. $(foreach dir, $(SRCDIRS), \
  70. $(foreach ext, $(SRCEXTENSIONS), $(dir)/*.$(ext)))))
  71. # Convert all .c, .cpp, .C to .d
  72. SRC_AND_DEPENDS := $(foreach ext, $(SRCEXTENSIONS),\
  73. $(patsubst %.$(ext),%.d,$(SOURCES)))
  74. DEPENDS := $(foreach file, $(filter %.d,$(SRC_AND_DEPENDS)), $(OBJDIR)/$(file))
  75. BASE = $(subst /,\/,$*)
  76. ODIR = $(subst /,\/,$(OBJDIR))
  77. # This magic is from the 'make' manual (with mods by jelson)
  78. $(OBJDIR)/%.d: %.c
  79. @mkdir -p $(OBJDIR)
  80. set -e; $(CC) -MM -I$(KERNEL_INCLUDE) $(CFLAGS) $< \
  81. | sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \
  82. [ -s $@ ] || rm -f $@
  83. $(OBJDIR)/%.d: %.C
  84. @mkdir -p $(OBJDIR)
  85. set -e; $(CC) -MM $(CPPFLAGS) $< \
  86. | sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \
  87. [ -s $@ ] || rm -f $@
  88. $(OBJDIR)/%.d: %.cpp
  89. @mkdir -p $(OBJDIR)
  90. set -e; $(CC) -MM $(CPPFLAGS) $< \
  91. | sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \
  92. [ -s $@ ] || rm -f $@
  93. #
  94. # Rules
  95. #
  96. $(OBJDIR)/%.o: %.cpp
  97. $(CPP) $(CPPFLAGS) $< -c -o $@
  98. $(OBJDIR)/%.o: %.C
  99. $(CPP) $(CPPFLAGS) $< -c -o $@
  100. $(OBJDIR)/%.o: %.c
  101. $(CC) $(CCFLAGS) $< -c -o $@
  102. clean:
  103. rm -f $(ALLTARGETS) $(OBJDIR)/*.[oa] $(OBJDIR)/*.so.* $(DEPENDS)
  104. include $(DEPENDS)