#****************************************************************************** | |
# | |
# makedefs - Definitions common to all makefiles. | |
# | |
# Copyright (c) 2005-2012 Texas Instruments Incorporated. All rights reserved. | |
# Software License Agreement | |
# | |
# Redistribution and use in source and binary forms, with or without | |
# modification, are permitted provided that the following conditions | |
# are met: | |
# | |
# Redistributions of source code must retain the above copyright | |
# notice, this list of conditions and the following disclaimer. | |
# | |
# Redistributions in binary form must reproduce the above copyright | |
# notice, this list of conditions and the following disclaimer in the | |
# documentation and/or other materials provided with the | |
# distribution. | |
# | |
# Neither the name of Texas Instruments Incorporated nor the names of | |
# its contributors may be used to endorse or promote products derived | |
# from this software without specific prior written permission. | |
# | |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
# | |
# This is part of revision 9453 of the Stellaris Firmware Development Package. | |
# | |
#****************************************************************************** | |
#****************************************************************************** | |
# | |
# Get the operating system name. If this is Cygwin, the .d files will be | |
# munged to convert c: into /cygdrive/c so that "make" will be happy with the | |
# auto-generated dependencies. | |
# | |
#****************************************************************************** | |
os:=${shell uname -s} | |
#****************************************************************************** | |
# | |
# The compiler to be used. | |
# | |
#****************************************************************************** | |
ifndef COMPILER | |
COMPILER=gcc | |
endif | |
#****************************************************************************** | |
# | |
# Definitions for using GCC. | |
# | |
#****************************************************************************** | |
ifeq (${COMPILER}, gcc) | |
# | |
# Get the prefix for the tools to use. Use arm-stellaris-eabi if it exists, | |
# otherwise fall back to arm-none-eabi. | |
# | |
PREFIX=${shell type arm-stellaris-eabi-gcc > /dev/null 2>&1 && \ | |
echo arm-stellaris-eabi || echo arm-none-eabi} | |
# | |
# The command for calling the compiler. | |
# | |
CC=${PREFIX}-gcc | |
# | |
# The location of the C compiler | |
# ARMGCC_ROOT is used by some makefiles that need to know where the compiler | |
# is installed. It is not used further for normal stellarisware apps | |
# | |
ARMGCC_ROOT:=${shell dirname '${shell sh -c "which ${CC}"}'}/.. | |
# | |
# Determine the compiler CPU/FPU options based on the processor variant. | |
# | |
ifndef VARIANT | |
CPU=-mcpu=cortex-m3 | |
FPU= | |
else | |
ifeq (${VARIANT}, cm3) | |
CPU=-mcpu=cortex-m3 | |
FPU= | |
else | |
ifeq (${VARIANT}, cm4f) | |
CPU=-mcpu=cortex-m4 | |
FPU=-mfpu=fpv4-sp-d16 -mfloat-abi=softfp | |
else | |
$(error Unknown processor variant ${VARIANT}!) | |
endif | |
endif | |
endif | |
# | |
# The flags passed to the assembler. | |
# | |
AFLAGS=-mthumb \ | |
${CPU} \ | |
${FPU} \ | |
-MD | |
# | |
# The flags passed to the compiler. | |
# | |
CFLAGS=-mthumb \ | |
${CPU} \ | |
${FPU} \ | |
-Os \ | |
-ffunction-sections \ | |
-fdata-sections \ | |
-MD \ | |
-std=c99 \ | |
-Wall \ | |
-pedantic \ | |
-DPART_${PART} \ | |
-c | |
# | |
# The command for calling the library archiver. | |
# | |
AR=${PREFIX}-ar | |
# | |
# The command for calling the linker. | |
# | |
LD=${PREFIX}-ld | |
# | |
# The flags passed to the linker. | |
# | |
LDFLAGS=--gc-sections | |
# | |
# Get the location of libgcc.a from the GCC front-end. | |
# | |
LIBGCC=${shell ${CC} ${CFLAGS} -print-libgcc-file-name} | |
# | |
# Get the location of libc.a from the GCC front-end. | |
# | |
LIBC=${shell ${CC} ${CFLAGS} -print-file-name=libc.a} | |
# | |
# Get the location of libm.a from the GCC front-end. | |
# | |
LIBM=${shell ${CC} ${CFLAGS} -print-file-name=libm.a} | |
# | |
# The command for extracting images from the linked executables. | |
# | |
OBJCOPY=${PREFIX}-objcopy | |
# | |
# Tell the compiler to include debugging information if the DEBUG environment | |
# variable is set. | |
# | |
ifdef DEBUG | |
CFLAGS+=-g -D DEBUG | |
endif | |
# | |
# Add the tool specific CFLAGS. | |
# | |
CFLAGS+=${CFLAGSgcc} | |
# | |
# Add the include file paths to AFLAGS and CFLAGS. | |
# | |
AFLAGS+=${patsubst %,-I%,${subst :, ,${IPATH}}} | |
CFLAGS+=${patsubst %,-I%,${subst :, ,${IPATH}}} | |
# | |
# The rule for building the object file from each C source file. | |
# | |
${COMPILER}${SUFFIX}/%.o: %.c | |
@if [ 'x${VERBOSE}' = x ]; \ | |
then \ | |
echo " CC ${<}"; \ | |
else \ | |
echo ${CC} ${CFLAGS} -D${COMPILER} -o ${@} ${<}; \ | |
fi | |
@${CC} ${CFLAGS} -D${COMPILER} -o ${@} ${<} | |
ifneq ($(findstring CYGWIN, ${os}), ) | |
@sed -i -r 's/ ([A-Za-z]):/ \/cygdrive\/\1/g' ${@:.o=.d} | |
endif | |
# | |
# The rule for building the object file from each assembly source file. | |
# | |
${COMPILER}${SUFFIX}/%.o: %.S | |
@if [ 'x${VERBOSE}' = x ]; \ | |
then \ | |
echo " AS ${<}"; \ | |
else \ | |
echo ${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ | |
fi | |
@${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<} | |
ifneq ($(findstring CYGWIN, ${os}), ) | |
@sed -i -r 's/ ([A-Za-z]):/ \/cygdrive\/\1/g' ${@:.o=.d} | |
endif | |
# | |
# The rule for creating an object library. | |
# | |
${COMPILER}${SUFFIX}/%.a: | |
@if [ 'x${VERBOSE}' = x ]; \ | |
then \ | |
echo " AR ${@}"; \ | |
else \ | |
echo ${AR} -cr ${@} ${^}; \ | |
fi | |
@${AR} -cr ${@} ${^} | |
# | |
# The rule for linking the application. | |
# | |
${COMPILER}${SUFFIX}/%.axf: | |
@if [ 'x${SCATTERgcc_${notdir ${@:.axf=}}}' = x ]; \ | |
then \ | |
ldname="${ROOT}/gcc/standalone.ld"; \ | |
else \ | |
ldname="${SCATTERgcc_${notdir ${@:.axf=}}}"; \ | |
fi; \ | |
if [ 'x${VERBOSE}' = x ]; \ | |
then \ | |
echo " LD ${@} ${LNK_SCP}"; \ | |
else \ | |
echo ${LD} -T $${ldname} \ | |
--entry ${ENTRY_${notdir ${@:.axf=}}} \ | |
${LDFLAGSgcc_${notdir ${@:.axf=}}} \ | |
${LDFLAGS} -o ${@} $(filter %.o %.a, ${^}) \ | |
'${LIBM}' '${LIBC}' '${LIBGCC}'; \ | |
fi; \ | |
${LD} -T $${ldname} \ | |
--entry ${ENTRY_${notdir ${@:.axf=}}} \ | |
${LDFLAGSgcc_${notdir ${@:.axf=}}} \ | |
${LDFLAGS} -o ${@} $(filter %.o %.a, ${^}) \ | |
'${LIBM}' '${LIBC}' '${LIBGCC}' | |
@${OBJCOPY} -O binary ${@} ${@:.axf=.bin} | |
endif | |