fusd/make.include
2007-01-13 08:39:56 +00:00

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)