blob: 2faeffaa6ec8b9886420e42b33baf5b4d2ce9195 [file] [log] [blame]
#
# Copyright 2001-2009 Texas Instruments - http://www.ti.com/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# dspbridge/mpu_api/make/build.mk
#
# DSP-BIOS Bridge build rules.
# ALL PATHS IN MAKEFILE MUST BE RELATIVE TO ITS DIRECTORY
CDEFS += $(CMDDEFS) # Add command line definitions
CDEFS += $(PROCFAMILY) # Processor Family e.g. 3430
CDEFS += $(CMDDEFS_START) # Definitions from start.mk
# ----------------------------------------------------------
# REMOVE LEADING AND TRAILING SPACES FROM MAKEFILE MACROS
# ----------------------------------------------------------
TARGETNAME := $(strip $(TARGETNAME))
TARGETTYPE := $(strip $(TARGETTYPE))
SUBMODULES := $(strip $(SUBMODULES))
SOURCES := $(strip $(SOURCES))
INCLUDES := $(strip $(INCLUDES))
LIBINCLUDES := $(strip $(LIBINCLUDES))
SH_SONAME := $(strip $(SH_SONAME))
ST_LIBS := $(strip $(ST_LIBS))
SH_LIBS := $(strip $(SH_LIBS))
CFLAGS := $(strip $(CFLAGS))
CDEFS := $(strip $(CDEFS))
EXEC_ARGS := $(strip $(EXEC_ARGS))
ST_LIB_ARGS := $(strip $(ST_LIB_ARGS))
SH_LIB_ARGS := $(strip $(SH_LIB_ARGS))
# ----------------------------------------------------------
# COMPILER OPTIONS
# ----------------------------------------------------------
# Preprocessor : dependency file generation
ifndef NODEPENDS
ifndef nodepends
CFLAGS += -MD
endif
endif
# Overall
CFLAGS += -pipe
# Preprocessor
CFLAGS +=
# Debugging
ifeq ($(BUILD),deb)
CFLAGS += -g
else
CFLAGS += -fomit-frame-pointer
endif
# Warnings
CFLAGS += -Wall -Wno-trigraphs -Werror-implicit-function-declaration #-Wno-format
# Optimizations
#CFLAGS += -O2 -fno-strict-aliasing
#CFLAGS += -Os -fno-strict-aliasing
CFLAGS += -fno-strict-aliasing
# Machine dependent
ifeq ($(PROCFAMILY),OMAP_3430)
CFLAGS += -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -march=armv7-a -msoft-float -Uarm -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR($(basename $(TARGETNAME)))" -D"KBUILD_MODNAME=KBUILD_STR($(basename $(TARGETNAME)))" -DMODULE -D__LINUX_ARM_ARCH__=7
endif
ifeq ($(PROCFAMILY),OMAP_4430)
CFLAGS += -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -march=armv7-a -msoft-float -Uarm -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR($(basename $(TARGETNAME)))" -D"KBUILD_MODNAME=KBUILD_STR($(basename $(TARGETNAME)))" -DMODULE -D__LINUX_ARM_ARCH__=7
endif
# Code generation
CFLAGS += -fno-common
# Macros
CFLAGS += -DLINUX $(addprefix -D, $(CDEFS))
ifdef __KERNEL__
CFLAGS += -D__KERNEL__ -fno-builtin
endif
# ----------------------------------------------------------
# OBJECTS
# ----------------------------------------------------------
BUILDDIR = .obj/
# setup the target - check the given type - make sure we have the
# correct suffix on it
# TARGETNAME should not have a suffix on it - give an error if it does
#ifneq ($(suffix $(TARGETNAME)),)
# $(error TARGETNAME can not have a suffix)
#endif
ifeq ($(TARGETTYPE),SH_LIB)
TARGET := $(basename $(TARGETNAME)).so
else
ifeq ($(TARGETTYPE),MODULE)
TARGET := $(basename $(TARGETNAME)).o
TARGETKO := $(addsuffix .ko,$(basename $(TARGET)))
TARGETMOD := $(addsuffix .mod,$(basename $(TARGET)))
else
ifeq ($(TARGETTYPE),ST_LIB)
TARGET := $(basename $(TARGETNAME)).a
else
ifeq ($(TARGETTYPE),EXEC)
TARGET := $(basename $(TARGETNAME)).out
else
ifneq ($(TARGETTYPE),)
TARGET := $(error Invalid TARGETTYPE)
endif
endif
endif
endif
endif
#LIBINCLUDES += $(TARGETDIR) $(TGTROOT)/lib $(TGTROOT)/usr/lib
LIBINCLUDES += $(TARGETDIR)/lib $(TARGETDIR)/usr/lib
SRCDIRS := $(sort $(dir $(SOURCES)))
OBJDIRS := $(addprefix $(BUILDDIR),$(SRCDIRS)) $(BUILDDIR)
BASEOBJ := $(addsuffix .o,$(basename $(SOURCES)))
OBJECTS := $(addprefix $(BUILDDIR), $(BASEOBJ))
ST_LIBNAMES := $(addsuffix .a, $(addprefix lib, $(ST_LIBS)))
DL_LIBNAMES := $(addsuffix .so, $(addprefix lib, $(SH_LIBS)))
vpath %.a $(LIBINCLUDES) $(TGTROOT)/lib $(TGTROOT)/usr/lib
vpath %.so $(LIBINCLUDES) $(TGTROOT)/lib $(TGTROOT)/usr/lib
# ----------------------------------------------------------
# BUILD ARGUMENTS
# ----------------------------------------------------------
MAPFILE := -Wl,-Map,$(TARGET).map
INCPATH := $(addprefix -I, . $(INCLUDES)) $(LINUXINCLUDE)
LIBPATH := $(addprefix -L, $(LIBINCLUDES))
LIBFILE := $(addprefix -l, $(ST_LIBS) $(SH_LIBS)) $(LIB_OBJS)
ifeq ($(TARGETTYPE),SH_LIB)
CFLAGS += -fpic
TARGETARGS := $(SH_LIB_ARGS) -nostartfiles -nodefaultlibs -nostdlib -shared -Wl
ifneq ($(SH_SONAME),)
TARGETARGS += -Wl,-soname,$(SH_SONAME)
endif
endif
ifeq ($(TARGETTYPE),MODULE)
TARGETARGS := $(SH_LIB_ARGS) -nostartfiles -nodefaultlibs -nostdlib -Wl,-r
ifneq ($(SH_SONAME),)
TARGETARGS += -Wl,-soname,$(SH_SONAME)
endif
endif
ifeq ($(TARGETTYPE),ST_LIB)
TARGETARGS := $(ST_LIB_ARGS) -nostartfiles -nodefaultlibs -nostdlib -Wl,-r
endif
ifeq ($(TARGETTYPE),EXEC)
TARGETARGS := $(EXEC_ARGS)
endif
.PHONY : all $(SUBMODULES) clean cleantrg SHELLERR Debug
# ==========================================================
# all
# ==========================================================
all : $(CHECKSHELL) $(SUBMODULES)
# ==========================================================
# Make submodules
# ==========================================================
$(SUBMODULES):
ifndef NORECURSE
ifndef norecurse
$(MAKE) -C $@ $(filter-out $(SUBMODULES),$(MAKECMDGOALS))
endif
endif
ifneq ($(TARGETTYPE),)
# if this is driver module level , build KO file too
ifneq ($(TOPLEVEL),)
all : $(OBJDIRS) $(TARGETKO)
else
all : $(OBJDIRS) $(TARGET)
endif
# ==========================================================
# Create directories
# ==========================================================
$(OBJDIRS) $(TARGETDIR) :
@$(call MKDIR, $@)
# ==========================================================
# Product 2.6.x kernel module based on target
# ==========================================================
# Link module .o with vermagic .o
$(TARGETKO): $(TARGETMOD).o $(TARGET)
$(LD) -EL -r -o $@ $^
# Compile vermagic
$(TARGETMOD).o: $(TARGETMOD).c
$(CC) -c $(TARGETARGS) $(CFLAGS) $(INCPATH) -o $@ $<
# Generate Module vermagic
$(TARGETMOD).c: $(TARGET)
$(MODPOST) $(TARGET)
# removed - need to be done as a pre-step to building
# $(MAKE) -C $(KRNLSRC) modules
# ==========================================================
# Build target
# ==========================================================
$(TARGET):$(OBJECTS) $(ST_LIBNAMES) $(DL_LIBNAMES)
# @$(SHELLCMD) echo Building $@
# $(CC) $(TARGETARGS) $(CFLAGS) $(LIBPATH) $(MAPFILE) -o $@ $(BASEOBJ) $(LIBFILE)
# $(CC) $(TARGETARGS) $(CFLAGS) $(LIBPATH) $(MAPFILE) -o $@ $(OBJECTS) $(LIBFILE)
ifeq ($(TARGETTYPE),ST_LIB)
$(AR) r $@ $(OBJECTS)
else
$(CC) $(TARGETARGS) $(CFLAGS) $(LIBPATH) $(MAPFILE) -o $@ $(OBJECTS) $(LIBFILE)
endif
# ==========================================================
# Compile .c file
# ==========================================================
$(BUILDDIR)%.o:%.c
# echo Compiling $(patsubst $(BUILDDIR)%.o,%.c, $@)
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $(patsubst $(BUILDDIR)%.o,%.c, $@)
# ==========================================================
# Compile .S file
# ==========================================================
$(BUILDDIR)%.o:%.S
# echo Compiling $(patsubst $(BUILDDIR)%.o,%.S, $@)
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $(patsubst $(BUILDDIR)%.o,%.S, $@)
endif # ifneq ($(TARGETTYPE),)
# ----------------------------------------------------------
# install - install the files
# ----------------------------------------------------------
install:: $(TARGETDIR) $(SUBMODULES) $(TARGET)
ifdef HOSTRELEASE
ifdef SH_SONAME
$(INSTALL) -D $(TARGET) $(TARGETDIR)/$(HOSTRELEASE)/$(SH_SONAME)
$(RM) -f $(TARGETDIR)/$(HOSTRELEASE)/$(TARGET)
ln -s $(SH_SONAME) $(TARGETDIR)/$(HOSTRELEASE)/$(TARGET)
else
ifneq ($(TOPLEVEL),)
$(INSTALL) -D $(TARGETKO) $(TARGETDIR)/$(HOSTRELEASE)/$(TARGETKO)
else
$(INSTALL) -D $(TARGET) $(TARGETDIR)/$(HOSTRELEASE)/$(TARGET)
endif
endif
endif
ifdef 0 # removed - components shouldn't put things in the production fs
ifdef ROOTFSRELEASE
$(call MKDIR, $(ROOTFSDIR)/$(ROOTFSRELEASE))
ifdef SH_SONAME
$(STRIP) --strip-unneeded -xgo $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(SH_SONAME) $(TARGET)
$(RM) -f $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGET)
ln -s $(SH_SONAME) $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGET)
else
ifneq ($(TOPLEVEL),)
$(STRIP) --strip-unneeded -xgo $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGETKO) $(TARGETKO)
else
$(STRIP) --strip-unneeded -xgo $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGET) $(TARGET)
endif
endif
endif
endif
# ----------------------------------------------------------
# clean - Remove build directory and target files
# Linux : Removes object and dependency files in build folder
# DOS : Removes object dirs in build folder
# ----------------------------------------------------------
clean : $(SUBMODULES)
ifneq ($(TARGETTYPE),)
ifneq ($(OBJECTS),)
- $(call RM,-f $(OBJECTS))
- $(call RM,-f $(OBJECTS:.o=.d))
- $(call RMDIR,-f $(BUILDDIR))
endif
- $(call RM,-f $(TARGET))
- $(call RM,-f $(TARGET).map)
- $(call RM,-f $(TARGETKO))
- $(call RM,-f $(TARGETMOD).c)
- $(call RM,-f $(TARGETMOD).o)
- $(call RM,-f $(TARGETMOD).d)
ifneq ($(TOPLEVEL),)
- @$(call RM,-f $(TARGETKO))
- @$(call RM,-f $(TARGETMOD).c)
- @$(call RM,-f $(TARGETMOD).o)
- @$(call RM,-f $(TARGETMOD).d)
endif
endif
cleantrg : $(SUBMODULES)
ifneq ($(TARGETTYPE),)
- @$(call RM, $(TARGET))
- @$(call RM, $(TARGET).map)
ifneq ($(TOPLEVEL),)
- @$(call RM, $(TARGETKO))
- @$(call RM, $(TARGETMOD).c)
- @$(call RM, $(TARGETMOD).o)
- @$(call RM, $(TARGETMOD).d)
endif
endif
# ----------------------------------------------------------
# Include dependency files generated by preprocessor.
#
# Dependency files are placed in main object directory because
# dependent files' paths for same source file varies with the
# directory from where gmake is run
# ----------------------------------------------------------
ifndef NODEPENDS
ifndef nodepends
ifneq ($(OBJECTS),)
-include $(OBJECTS:.o=.d)
endif
endif
endif
# ----------------------------------------------------------
# Generate fatal error if make variable SHELL is incorrect
# ----------------------------------------------------------
SHELLERR::
@$(SHELLCMD) echo Fatal error: SHELL set to $(SHELL) instead of $(MYSHELL)
@$(SHELLCMD) echo set $(MYSHELL) to correct path and CASE SENSITIVE FILE NAME and EXTENSTION
@$(SHELLCMD) echo of your command shell
$(ERR)
# ----------------------------------------------------------
# For debugging script
# ----------------------------------------------------------
Debug::$(SUBMODULES)
@$(SHELLCMD) echo SHELL: $(SHELL)
@$(SHELLCMD) echo
@$(SHELLCMD) echo CDEFS: $(CDEFS)
@$(SHELLCMD) echo
@$(SHELLCMD) echo CONFIG_SHELL: $(CONFIG_SHELL)
@$(SHELLCMD) echo
@$(SHELLCMD) echo CURDIR: $(CURDIR)
@$(SHELLCMD) echo
@$(SHELLCMD) echo SRCDIRS: $(SRCDIRS)
@$(SHELLCMD) echo
@$(SHELLCMD) echo OBJDIRS: $(OBJDIRS)
@$(SHELLCMD) echo
@$(SHELLCMD) echo OBJECTS: $(OBJECTS)
@$(SHELLCMD) echo
@$(SHELLCMD) echo BUILDDIR: $(BUILDDIR)
@$(SHELLCMD) echo
@$(SHELLCMD) echo TARGETDIR TARGETNAME: $(TARGET)
@$(SHELLCMD) echo
@$(SHELLCMD) echo MAKEDIR: $(MAKEDIR)
@$(SHELLCMD) echo
@$(SHELLCMD) echo INCLUDES: $(INCLUDES)
@$(SHELLCMD) echo
@$(SHELLCMD) echo DL_LIBNAMES: $(DL_LIBNAMES)
@$(SHELLCMD) echo
@$(SHELLCMD) echo LIBFILE: $(LIBFILE)
@$(SHELLCMD) echo