|
|
#!/bin/bash
|
|
|
#/*------------------------------------------------------------------------------
|
|
|
#-- This file is a part of the libuc, microcontroler library
|
|
|
#-- Copyright (C) 2011, Alexis Jeandet
|
|
|
#--
|
|
|
#-- This program is free software; you can redistribute it and/or modify
|
|
|
#-- it under the terms of the GNU General Public License as published by
|
|
|
#-- the Free Software Foundation; either version 3 of the License, or
|
|
|
#-- (at your option) any later version.
|
|
|
#--
|
|
|
#-- This program is distributed in the hope that it will be useful,
|
|
|
#-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
#-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
#-- GNU General Public License for more details.
|
|
|
#--
|
|
|
#-- You should have received a copy of the GNU General Public License
|
|
|
#-- along with this program; if not, write to the Free Software
|
|
|
#-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
#-------------------------------------------------------------------------------
|
|
|
#-- Author : Alexis Jeandet
|
|
|
#-- Mail : alexis.jeandet@gmail.com
|
|
|
#-------------------------------------------------------------------------------*/
|
|
|
OBJDIR="obj"
|
|
|
BINDIR="bin"
|
|
|
INC_LIBS_DEPS=""
|
|
|
BIN_LIBS_DEPS=""
|
|
|
|
|
|
function generateObjrules {
|
|
|
SRCS=`getFilesList $PROJECTFILE SOURCES | sed 's/SOURCES//' | sed 's/+=//'`
|
|
|
if [ "$1" == "Makefile" ] ; then
|
|
|
SRCS=`getFilesList $PROJECTFILE SOURCES | sed 's/SOURCES//' | sed 's/+=//'`
|
|
|
else
|
|
|
TEMP=`getFilesList $PROJECTFILE $1.SOURCES`
|
|
|
if [ -z "$TEMP" ] ; then
|
|
|
SRCS=`getFilesList $PROJECTFILE '*'.SOURCES | sed 's/*\.SOURCES//' | sed 's/+=//'`
|
|
|
else
|
|
|
SRCS=`getFilesList $PROJECTFILE $1.SOURCES | sed "s/$1"'\.SOURCES//' | sed 's/+=//'`
|
|
|
fi
|
|
|
fi
|
|
|
for src in $SRCS
|
|
|
do
|
|
|
obj=`echo $src| sed 's/\.c/\.o/g' | sed 's/\.s/\.o/g'`
|
|
|
echo "$OBJDIR/$obj: $src "'$(OBJDIR)
|
|
|
$(LIBUC_CC) -O3 -I $(INCLUDES) -c $(CFLAGS) $< -o $@
|
|
|
'
|
|
|
done
|
|
|
}
|
|
|
|
|
|
function generateObjlist {
|
|
|
if [ "$1" == "Makefile" ] ; then
|
|
|
OBJS=`getFilesList $PROJECTFILE SOURCES | sed 's/SOURCES//' | sed 's/+=//'| sed 's/\.c/\.o/g' | sed 's/\.s/\.o/g'`
|
|
|
else
|
|
|
TEMP=`getFilesList $PROJECTFILE $1.SOURCES`
|
|
|
if [ -z "$TEMP" ] ; then
|
|
|
OBJS=`getFilesList $PROJECTFILE '*'.SOURCES | sed 's/*\.SOURCES//' | sed 's/+=//'| sed 's/\.c/\.o/g' | sed 's/\.s/\.o/g'`
|
|
|
else
|
|
|
OBJS=`getFilesList $PROJECTFILE $1.SOURCES | sed "s/$1"'\.SOURCES//' | sed 's/+=//'| sed 's/\.c/\.o/g' | sed 's/\.s/\.o/g'`
|
|
|
fi
|
|
|
fi
|
|
|
for obj in $OBJS
|
|
|
do
|
|
|
echo "$OBJDIR/$obj \\"
|
|
|
done
|
|
|
}
|
|
|
|
|
|
|
|
|
function applib-run {
|
|
|
if [ $1 == "lib" ] ; then
|
|
|
tmplt="lib"
|
|
|
else
|
|
|
tmplt="bin"
|
|
|
fi
|
|
|
Targets $PROJECTFILE
|
|
|
|
|
|
if [ -z "$TARGETS" ] ; then
|
|
|
TARGETS="Makefile"
|
|
|
else
|
|
|
echo "Multi target"
|
|
|
fi
|
|
|
for ITEMS in $TARGETS
|
|
|
do
|
|
|
if [ "$ITEMS" == "Makefile" ] ; then
|
|
|
MAKEFILE="Makefile"
|
|
|
ITEMS=""
|
|
|
else
|
|
|
MAKEFILE="$ITEMS.mk"
|
|
|
fi
|
|
|
echo 'PROJECTDIR = `pwd`'> $MAKEFILE
|
|
|
echo "LIBUC = $libuc2" >> $MAKEFILE
|
|
|
Target $PROJECTFILE $ITEMS
|
|
|
Arch $PROJECTFILE $ITEMS
|
|
|
Cpumodel $PROJECTFILE $ITEMS
|
|
|
Bspname $PROJECTFILE $ITEMS
|
|
|
Objdir $PROJECTFILE
|
|
|
Bindir $PROJECTFILE
|
|
|
Libs_Inc $PROJECTFILE $ITEMS
|
|
|
Libs_Link $PROJECTFILE $ITEMS
|
|
|
HeadersInstallPath $PROJECTFILE $ITEMS
|
|
|
TargetInstallPath $PROJECTFILE $ITEMS
|
|
|
getBSP $PROJECTFILE $ITEMS
|
|
|
ExtractCFLAGS $PROJECTFILE $ITEMS
|
|
|
ExtractLDFLAGS $PROJECTFILE $ITEMS
|
|
|
ExtractODFLAGS $PROJECTFILE $ITEMS
|
|
|
echo "Current BSP is $BSP"
|
|
|
echo $SRCFILES >> $MAKEFILE
|
|
|
if [ "$MAKEFILE" == "Makefile" ] ; then
|
|
|
getFilesList $PROJECTFILE HEADERS >> Makefile
|
|
|
getFilesList $PROJECTFILE SOURCES | sed 's/SOURCES/SOURCES/' >> Makefile
|
|
|
else
|
|
|
TEMP=`getFilesList $PROJECTFILE $ITEMS.HEADERS`
|
|
|
if [ -z "$TEMP" ] ; then
|
|
|
getFilesList $PROJECTFILE '*'.HEADERS | sed 's/*\.'// >> $MAKEFILE
|
|
|
else
|
|
|
getFilesList $PROJECTFILE $ITEMS.HEADERS | sed s/$ITEMS'\.'// >> $MAKEFILE
|
|
|
fi
|
|
|
TEMP=`getFilesList $PROJECTFILE $ITEMS.SOURCES`
|
|
|
if [ -z "$TEMP" ] ; then
|
|
|
getFilesList $PROJECTFILE '*'.SOURCES | sed 's/*\.'SOURCES/SOURCES/ >> $MAKEFILE
|
|
|
else
|
|
|
getFilesList $PROJECTFILE $ITEMS.SOURCES | sed s/$ITEMS'\.'SOURCES/SOURCES/ >> $MAKEFILE
|
|
|
fi
|
|
|
fi
|
|
|
if [ "$TARGET" == "libbsp" ] ; then
|
|
|
mkdir -p $libuc2/bsp/cfg/$BSPNAME
|
|
|
echo "CPUMODEL = $CPUMODEL" > $libuc2/bsp/cfg/$BSPNAME/bsp.mk
|
|
|
echo "ARCH = $ARCH" >> $libuc2/bsp/cfg/$BSPNAME/bsp.mk
|
|
|
fi
|
|
|
|
|
|
echo "========================================================================="
|
|
|
echo " M A K E F I L E G E N E R A T I O N "
|
|
|
echo "-------------------------------------------------------------------------"
|
|
|
echo " Template = library "
|
|
|
echo " Architecture = $ARCH "
|
|
|
echo " Output file = $TARGET "
|
|
|
echo "========================================================================="
|
|
|
echo ""
|
|
|
echo " Start Writing Makefile ..."
|
|
|
echo "OBJDIR = $OBJDIR" >> $MAKEFILE
|
|
|
echo "BINDIR = $BINDIR" >> $MAKEFILE
|
|
|
echo "OBJECTFILES = `generateObjlist $MAKEFILE`">> $MAKEFILE
|
|
|
echo " " >> $MAKEFILE
|
|
|
echo "ARCH = $ARCH" >> $MAKEFILE
|
|
|
echo "CPUMODEL = $CPUMODEL" >> $MAKEFILE
|
|
|
echo "ARCHFOLDER = "'$(LIBUC)'"/rules/$ARCH" >> $MAKEFILE
|
|
|
echo "TARGET=$TARGET">> $MAKEFILE
|
|
|
echo "LIBUC_INCLUDES=$INCLUDES">> $MAKEFILE
|
|
|
echo "LIBUC_LIBRARIES=$LIBRARIES">> $MAKEFILE
|
|
|
echo "TARGETINSTALLPATH=$TARGETINSTALLPATH">> $MAKEFILE
|
|
|
echo "HEADERSINSTALLPATH=$HEADERSINSTALLPATH">> $MAKEFILE
|
|
|
echo "BSP=$BSP">> $MAKEFILE
|
|
|
echo '
|
|
|
#---------------------------------------------------------------------------------
|
|
|
# LIBRARY DEFINITIONS
|
|
|
#---------------------------------------------------------------------------------
|
|
|
|
|
|
LIBUC_LIBS_DIR = $(LIBUC)/lib/bin/$(ARCH)
|
|
|
LIBUC_INC_DIR = $(LIBUC)/lib/includes
|
|
|
LIBUC_CFG_DIR = $(LIBUC)/lib/cfg
|
|
|
include $(LIBUC)/rules/common/libsrules.mk
|
|
|
|
|
|
#---------------------------------------------------------------------------------
|
|
|
# BOARD SUPORT PACKAGES
|
|
|
#---------------------------------------------------------------------------------
|
|
|
LIBUC_BSP_DIR=$(LIBUC)/bsp
|
|
|
LIBUC_BSP_BIN_DIR= $(LIBUC_BSP_DIR)/bin
|
|
|
LIBUC_BSP_INC_DIR= $(LIBUC_BSP_DIR)/includes
|
|
|
LIBUC_BSP_CFG_DIR= $(LIBUC_BSP_DIR)/cfg
|
|
|
LIBUC_BSP = -L $(LIBUC_BSP_BIN_DIR)/$(BSP) -static -lbsp
|
|
|
LIBUC_BSP_INC = -I $(LIBUC_BSP_INC_DIR)/$(BSP)
|
|
|
' >> $MAKEFILE
|
|
|
if [ "$tmplt" == "bin" ] ; then
|
|
|
echo 'include $(LIBUC_BSP_CFG_DIR)/$(BSP)/bsp.mk' >> $MAKEFILE
|
|
|
fi
|
|
|
echo 'include $(ARCHFOLDER)/rules.mk' >> $MAKEFILE
|
|
|
echo 'INCLUDES += -I ./ -I $(LIBUC_INC_DIR) $(LIBUC_INCLUDES) $(LIBUC_BSP_INC)' >> $MAKEFILE
|
|
|
echo "$CFLAGS" >> $MAKEFILE
|
|
|
echo "$LDFLAGS" >> $MAKEFILE
|
|
|
echo "$ODFLAGS" >> $MAKEFILE
|
|
|
echo '' >> $MAKEFILE
|
|
|
echo "all:$tmplt" >> $MAKEFILE
|
|
|
echo " @echo Code compiled" >> $MAKEFILE
|
|
|
echo '' >> $MAKEFILE
|
|
|
echo '.SUFFIXES: .o .c .s
|
|
|
|
|
|
.c.o:
|
|
|
$(LIBUC_CC) -O3 -I $(INCLUDES) -c $(CFLAGS) $< -o $@
|
|
|
|
|
|
.s.o:
|
|
|
$(LIBUC_CC) -O3 -I $(INCLUDES) -c $(CFLAGS) $< -o $@
|
|
|
|
|
|
bin: $(BINDIR)/$(TARGET).elf $(BINDIR)/$(TARGET).bin $(BINDIR)/$(TARGET).hex
|
|
|
@echo "compile bin"
|
|
|
|
|
|
lib: $(BINDIR)/$(TARGET).a
|
|
|
@echo "compile lib"
|
|
|
|
|
|
|
|
|
$(BINDIR)/$(TARGET).a: $(OBJECTFILES)
|
|
|
mkdir -p $(BINDIR)
|
|
|
$(LIBUC_AR) rcs $@ $(OBJECTFILES)
|
|
|
|
|
|
$(OBJDIR):
|
|
|
mkdir -p $(OBJDIR)
|
|
|
|
|
|
%.elf: $(LINKER_SCRIPT) $(APPOBJECTFILES) $(OBJECTFILES)
|
|
|
mkdir -p $(BINDIR)
|
|
|
$(LIBUC_CC) $(LIBUC_LDFLAGS) $(LIBUC_CFLAGS) -T $^ -o $@ $(LIBUC_BSP) $(LIBUC_LIBRARIES)
|
|
|
$(LIBUC_OBJDUMP) $(LIBUC_ODFLAGS) $@ > $(@:.elf=.dump)
|
|
|
$(LIBUC_SIZE) $@
|
|
|
|
|
|
|
|
|
%.bin: %.elf $(BIN_LIBS_DEPS)
|
|
|
$(LIBUC_OBJCOPY) $(LIBUC_CPFLAGS) -O binary $< $*.bin
|
|
|
@echo "BIN_LIBS_DEPS"
|
|
|
@echo $(BIN_LIBS_DEPS)
|
|
|
|
|
|
|
|
|
%.hex: %.elf
|
|
|
$(LIBUC_OBJCOPY) $(LIBUC_CPFLAGS) -O ihex $< $*.hex
|
|
|
|
|
|
$(TARGETINSTALLPATH)/$(TARGET).a: $(BINDIR)/$(TARGET).a
|
|
|
mkdir -p $(TARGETINSTALLPATH)
|
|
|
cp $(BINDIR)/$(TARGET).a $(TARGETINSTALLPATH)/$(TARGET).a
|
|
|
|
|
|
libinstall: $(TARGETINSTALLPATH)/$(TARGET).a
|
|
|
@if [ -z $(HEADERSINSTALLPATH) ] ; then echo "No headers to install" ; else mkdir -p $(HEADERSINSTALLPATH) ; fi
|
|
|
@if [ -z "$(HEADERS)" ] ; then echo "No headers to install" ; else echo "cp -f $(HEADERS) $(HEADERSINSTALLPATH)/" ; cp -f $(HEADERS) $(HEADERSINSTALLPATH)/ ; fi
|
|
|
|
|
|
clean:
|
|
|
rm -f *.o *.d *.bin *.hex *.dump *.map *.a *.elf
|
|
|
rm -f $(OBJECTFILES)
|
|
|
rm -f $(BINDIR)/*.bin
|
|
|
rm -f $(BINDIR)/*.hex
|
|
|
rm -f $(BINDIR)/*.dump
|
|
|
rm -f $(BINDIR)/*.map
|
|
|
rm -f $(BINDIR)/*.a
|
|
|
rm -f $(BINDIR)/*.elf
|
|
|
rm -f $(DEVSOURCESND)
|
|
|
rm -f $(ASMDEVSOURCESND)
|
|
|
|
|
|
distclean: clean libclean
|
|
|
rm -f $(TARGETINSTALLPATH)/*.bin
|
|
|
rm -f $(TARGETINSTALLPATH)/*.a
|
|
|
rm -f Makefile
|
|
|
' >> $MAKEFILE
|
|
|
|
|
|
generateObjrules $MAKEFILE >> $MAKEFILE
|
|
|
echo 'install:'"$tmplt"'install
|
|
|
|
|
|
' >> $MAKEFILE
|
|
|
echo 'libclean:' >> $MAKEFILE
|
|
|
echo ' rm -f $(TARGETINSTALLPATH)/$(TARGET).a' >> $MAKEFILE
|
|
|
echo " Makefile writing finished"
|
|
|
echo ""
|
|
|
echo "========================================================================="
|
|
|
echo ""
|
|
|
done
|
|
|
if [ "$TARGETS" == "Makefile" ] ; then
|
|
|
MAKEFILE="Makefile"
|
|
|
else
|
|
|
for mktargt in "all" "install" " clean" "distclean"
|
|
|
do
|
|
|
echo "" >> Makefile
|
|
|
echo "$mktargt:" >> Makefile
|
|
|
for ITEMS in $TARGETS
|
|
|
do
|
|
|
echo " make $mktargt -f $MAKEFILE" >> Makefile
|
|
|
done
|
|
|
echo "" >> Makefile
|
|
|
done
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|