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 *.c; do
echo "C_source+=$file"
done
shopt -s nullglob
for file in *.c; do
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
'
No comments:
Post a Comment