Tuesday, January 22, 2019

Matlab Coder from Windows to *unix

One of the strange things about a platform is that people tend to support "the platform". If you ever get a look at a MATLAB Coder Makefile, you'll immediately see things like PERL is included due to the lack of grep on Windows.

I asked Mathworks if they could export both a Windows and *unix Makefile, but it's not supported: https://www.mathworks.com/matlabcentral/answers/440297-coder-create-a-makefile-for-linux-from-windows

The following script won't work for everyone, but it is a good start. Run "script.sh > Makefile" in the top directory of the Coder output and you'll compile to a static library.
Surprisingly (don't know why I am), Coder did a really good job of making C code that compiled on BSD-Lite, Solaris and AIX. I'm sure it'll work on Linux.

#!/bin/bash

## change OUTPUT to be the proper name
echo '
#-------------------------------------------------------------------------------
#       User-modifiable options
#-------------------------------------------------------------------------------

OUTPUT=rtprocessing
PREFIXINSTALL=/opt/local
ANSI_OPTS = -ansi -pedantic -Wno-long-long -fwrapv

#-------------------------------------------------------------------------------
#       User-modifiable options
#------------------------------------------------------------------------------=


UNIXTIME=$(shell date +%s)
WRTSIGNAL = ./signals/
WRTPARSERS = ./parsers/

# Compile for all memories available on the board (this sets $(MEMORIES))
# moved down to tools.

# Output directories
BIN = bin
OBJ = obj
SRC = src
'

echo '
#-------------------------------------------------------------------------------
#       Tools
#-------------------------------------------------------------------------------

# This is to generate SVN information into the binary.  0 is default.
SVNREV := 0

# Tool suffix when cross-compiling
#CROSS_COMPILE = arm-elf-
#CROSS_COMPILE =arm-none-eabi-
# Compilation tools
AR = $(CROSS_COMPILE)ar
CC = $(CROSS_COMPILE)clang
SIZE = $(CROSS_COMPILE)size
OBJCOPY = $(CROSS_COMPILE)objcopy
SVNREV := $(shell svnversion -n . | sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/" | grep "[0-9]" )
#degs compile target
MEMORIES = flash


INCLUDES += -I.. -I. -I$(WRTPARSERS)
CFLAGS += $(OPTIMIZATION) $(INCLUDES)
ARFLAGS  = ruvs
CFLAGS  += -c $(ANSI_OPTS) -O0

#-------------------------------------------------------------------------------
#       Files
#-------------------------------------------------------------------------------


#VPATH is important for file location, which is basically the "INCLUDES"
VPATH += $(WRTSIGNAL) 
VPATH += $(WRTPARSERS)
VPATH += ./io
VPATH += ./examples

#C_OBJECTS = main.o
'

shopt -s nullglob
for file in *.cdo
    echo "C_source+=$file"
done

shopt -s nullglob
for file in *.cdo
    basefilename=$(echo "$file" | sed -e "s/c$//")
    #objectname = "$basefilename""o"
    #echo "$objectname"
    objectname="$basefilename""o" #create the .o list
    echo "C_OBJECTS+=$objectname"
done

echo '
OUTPUTDIR := $(BIN)/$(OUTPUT)
LIBOUTPUTDIR := $(BIN)/lib$(OUTPUT).a


all: clean $(BIN) $(OBJ) $(SRC) $(MEMORIES) 


$(BIN) $(OBJ) $(SRC):
    mkdir $@

define RULES
C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))
ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))

$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1))
    $(AR) $(ARFLAGS) $(LIBOUTPUTDIR) $$^

$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN)
    $(CC) $(CFLAGS) -D$(1) -c -o $$@ $$<

$$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN)
    $(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$<


endef

$(foreach MEMORY, $(MEMORIES), $(eval $(call RULES,$(MEMORY))))
    
    
clean:
    -rm -f $(SRC)/*.s $(SRC)/*.i $(OBJ)/* $(BIN)/*
    -rm -f *.s
    -rm -f *.i
    -rm -f *.bc
    -rm -f a.out $(SRC)/*.out $(SRC)/*.out $(OBJ)/*.out $(BIN)/*.out $(BIN)/*.out $(WRTSIGNAL)/*.out $(WRTPARSERS)/*.out


'




Sunday, January 13, 2019

BASH script to update all SVN archives

I have a base root for my SVN repositories, such as:
./svn
./svn/project1
./svn/project2
In order to update everything, I made a script that will execute from any SVN repository and update all of the unrelated repos.

#!/bin/bash
#Before anything else, set the PATH_SCRIPT variable
    pushd `dirname $0` > /dev/nullPATH_SCRIPT=`pwd -P`popd > /dev/null
    PROGNAME=${0##*/}; PROGVERSION=0.1.0 
##
## This program attempts to do a SVN update on all of the directories off an SVN_ROOT

SVN_ROOT=$(svn info | awk -F'/Root Path: (.*)/ { print $2 }' | xargs)
SVN_ROOT=$(dirname $SVN_ROOT)
echo "$SVN_ROOT"

for svndir in $SVN_ROOT/* ; do
    BRANCH=`svn info ${svndir} 2> /dev/null | grep "^URL:" | cut -d" " -f2 `
     if [ -z "${BRANCH}" ]
    then
        #echo "Error: directory ${svndir} exists and is not part of a working copy."
        echo "skipping: ${svndir}"
    else
        #echo "$svndir"
        svn update $svndir
    fi
done