150 lines
2.8 KiB
Plaintext
150 lines
2.8 KiB
Plaintext
|
|
# auto-dependency generation makefile
|
|
|
|
|
|
#### Default values
|
|
|
|
SRCEXTENSIONS := c C cpp
|
|
CC := gcc
|
|
CPP := g++
|
|
LD := ld
|
|
AR := ar
|
|
|
|
#### build object directory token
|
|
|
|
CPU := $(shell uname -m)
|
|
OS := $(shell uname -s | tr '[A-Z]' '[a-z]')
|
|
|
|
DEFAULT_ARCH := $(CPU)-$(OS)
|
|
|
|
ifeq ($(strip $(ARCH)),)
|
|
ARCH := $(DEFAULT_ARCH)
|
|
endif
|
|
|
|
OBJTOKEN := obj.$(ARCH)
|
|
|
|
#
|
|
# Under most circumstances, paths are simple
|
|
#
|
|
|
|
ifeq ($(POSTROOT),..)
|
|
MODPATH := .
|
|
OBJDIR := $(OBJTOKEN)
|
|
else
|
|
MODPATH := $(POSTROOT)/$(MODULENAME)
|
|
OBJDIR := $(MODPATH)/$(OBJTOKEN)
|
|
endif
|
|
|
|
|
|
#
|
|
# Directories
|
|
#
|
|
|
|
MODLIBS := \
|
|
-L$(OBJDIR) \
|
|
$(foreach dir, $(MODULES), -L$(POSTROOT)/$(dir)/$(OBJTOKEN))
|
|
MODINCLUDES := \
|
|
-I$(MODPATH)/include \
|
|
$(foreach dir, $(MODULES), -I$(POSTROOT)/$(dir)/include)
|
|
ALLTARGETS := \
|
|
$(foreach targ, $(TARGETS), $(OBJDIR)/$(targ))
|
|
VPATH := \
|
|
$(MODPATH)/include \
|
|
$(foreach dir, $(SRCDIRS), $(MODPATH)/$(dir)) \
|
|
$(foreach dir, $(MODULES), $(POSTROOT)/$(dir)/include)
|
|
|
|
|
|
#### include paths
|
|
|
|
LIBPATH := $(MODLIBS)
|
|
INCLUDEPATH += -I. -Iinclude $(MODINCLUDES)
|
|
KCFLAGS = -O2 \
|
|
-Wall -Werror -Wstrict-prototypes \
|
|
-fno-strict-aliasing -fomit-frame-pointer \
|
|
-DMODULE -D__KERNEL__
|
|
|
|
CFLAGS := -fPIC -Wall -O2 -g
|
|
CCFLAGS := -Werror
|
|
CPPFLAGS := -ftemplate-depth-30
|
|
|
|
#### Architecture deps
|
|
|
|
KERNEL_INCLUDE := $(KERNEL_HOME)/include
|
|
BINSTRIP := strip
|
|
|
|
KCFLAGS += $(INCLUDEPATH)
|
|
CFLAGS += $(INCLUDEPATH) $(LIBPATH)
|
|
|
|
CCFLAGS += $(CFLAGS)
|
|
CPPFLAGS += $(CFLAGS)
|
|
|
|
#
|
|
# targets
|
|
#
|
|
|
|
default: $(ALLTARGETS)
|
|
|
|
####################################################
|
|
|
|
|
|
#
|
|
# Dependency generation
|
|
#
|
|
|
|
|
|
# Get list of all source files
|
|
SOURCES := \
|
|
$(notdir $(wildcard \
|
|
$(foreach dir, $(SRCDIRS), \
|
|
$(foreach ext, $(SRCEXTENSIONS), $(dir)/*.$(ext)))))
|
|
|
|
# Convert all .c, .cpp, .C to .d
|
|
SRC_AND_DEPENDS := $(foreach ext, $(SRCEXTENSIONS),\
|
|
$(patsubst %.$(ext),%.d,$(SOURCES)))
|
|
|
|
DEPENDS := $(foreach file, $(filter %.d,$(SRC_AND_DEPENDS)), $(OBJDIR)/$(file))
|
|
|
|
|
|
|
|
BASE = $(subst /,\/,$*)
|
|
ODIR = $(subst /,\/,$(OBJDIR))
|
|
|
|
# This magic is from the 'make' manual (with mods by jelson)
|
|
$(OBJDIR)/%.d: %.c
|
|
@mkdir -p $(OBJDIR)
|
|
set -e; $(CC) -MM -I$(KERNEL_INCLUDE) $(CFLAGS) $< \
|
|
| sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \
|
|
[ -s $@ ] || rm -f $@
|
|
|
|
$(OBJDIR)/%.d: %.C
|
|
@mkdir -p $(OBJDIR)
|
|
set -e; $(CC) -MM $(CPPFLAGS) $< \
|
|
| sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \
|
|
[ -s $@ ] || rm -f $@
|
|
|
|
$(OBJDIR)/%.d: %.cpp
|
|
@mkdir -p $(OBJDIR)
|
|
set -e; $(CC) -MM $(CPPFLAGS) $< \
|
|
| sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \
|
|
[ -s $@ ] || rm -f $@
|
|
|
|
|
|
#
|
|
# Rules
|
|
#
|
|
|
|
$(OBJDIR)/%.o: %.cpp
|
|
$(CPP) $(CPPFLAGS) $< -c -o $@
|
|
|
|
$(OBJDIR)/%.o: %.C
|
|
$(CPP) $(CPPFLAGS) $< -c -o $@
|
|
|
|
$(OBJDIR)/%.o: %.c
|
|
$(CC) $(CCFLAGS) $< -c -o $@
|
|
|
|
clean:
|
|
rm -f $(ALLTARGETS) $(OBJDIR)/*.[oa] $(OBJDIR)/*.so.* $(DEPENDS)
|
|
|
|
|
|
include $(DEPENDS)
|