ifndef NEURAL_MODELLING_DIRS
$(error NEURAL_MODELLING_DIRS is not set. Please define NEURAL_MODELLING_DIRS (possibly by running "source setup" in the neural_modelling folder within the sPyNNaker source folder))
endif
print-% : ; @echo $* = $($*)
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
CURRENT_DIR := $(dir $(MAKEFILE_PATH))
EXTRA_SRC_DIR := $(abspath $(CURRENT_DIR))
APP_OUTPUT_DIR := $(abspath $(CURRENT_DIR)../../python_models/model_binaries/)/
CFLAGS += -I$(NEURAL_MODELLING_DIRS)/src
# include $(NEURAL_MODELLING_DIRS)/src/Makefile.common
MAKEFILE_PATH := $(abspath $(NEURAL_MODELLING_DIRS)/src/Makefile.common)
CURRENT_DIR := $(dir $(MAKEFILE_PATH))
SOURCE_DIR := $(abspath $(CURRENT_DIR))
SOURCE_DIRS += $(SOURCE_DIR)
ifndef APP_OUTPUT_DIR
APP_OUTPUT_DIR := $(abspath $(CURRENT_DIR)../../spynnaker/pyNN/model_binaries/)/
endif
# include $(SPINN_DIRS)/make_lib/Makefile.SpiNNFrontEndCommon
# If SPINN_DIRS is not defined, this is an error!
ifndef SPINN_DIRS
$(error SPINN_DIRS is not set. Please define SPINN_DIRS (possibly by running "source setup" in the spinnaker package folder))
endif
ifndef SOURCE_DIRS
$(error SOURCE_DIRS is not set. Please define SOURCE_DIRS)
endif
ifndef APP_OUTPUT_DIR
$(error APP_OUTPUT_DIRS is not set. Please define APP_OUTPUT_DIRS)
endif
ifndef BUILD_DIR
$(error BUILD_DIR is not set. Please define BUILD_DIR)
endif
define define-build-code
$$(BUILD_DIR)%.o: $1/%.c
-mkdir -p $$(dir $$@)
$$(CC) $$(CFLAGS) -D__FILE__=\"$$(notdir $$*.c)\" -o $$@ $$<
endef
# Convert the objs into the correct format to work here
OBJS := $(abspath $(SOURCES))
$(foreach dir, $(SOURCE_DIRS), $(eval OBJS := $(OBJS:$(abspath $(dir))/%.c=$(BUILD_DIR)%.o)))
$(foreach dir, $(SOURCE_DIRS), $(eval $(call define-build-code,$(dir))))
OBJECTS += $(OBJS)
LIBRARIES += -lspinn_frontend_common -lspinn_common -lm
ifndef DEBUG
DEBUG = PRODUCTION_CODE
endif
# Run md5sum on application name and extract first 8 bytes
SHELL = bash
APPLICATION_NAME_HASH = $(shell echo -n "$(APP)" | md5sum | cut -c 1-8)
CFLAGS += -Wall -Wextra -D$(DEBUG) -Ofast -DAPPLICATION_NAME_HASH=0x$(APPLICATION_NAME_HASH)
# include $(SPINN_DIRS)/Makefile.common
# Common includes for making SpiNNaker binaries
ifndef GNU
GNU := 1
endif
ifndef LIB
LIB := 0
endif
# If SPINN_DIRS is not defined, this is an error!
ifndef SPINN_DIRS
$(error SPINN_DIRS is not set. Please define SPINN_DIRS (possibly by running "source setup" in the spinnaker tools folder))
endif
SPINN_LIB_DIR = $(SPINN_DIRS)/lib
SPINN_INC_DIR = $(SPINN_DIRS)/include
SPINN_TOOLS_DIR = $(SPINN_DIRS)/tools
SPINN_MAKE_LIB_DIR = $(SPINN_DIRS)/make_lib
# ------------------------------------------------------------------------------
# Tools
ifeq ($(GNU),1)
# GNU Compiler (gcc) settings
GP := arm-none-eabi
AS := $(GP)-as --defsym GNU=1 -mthumb-interwork -march=armv5te
ifeq ($(LIB), 1)
CC := $(GP)-gcc -c -Os -mthumb-interwork -march=armv5te -std=gnu99 -I $(SPINN_INC_DIR)
CFLAGS += -fdata-sections -ffunction-sections
LD := $(GP)-ld -i
else
CC := $(GP)-gcc -mthumb-interwork -march=armv5te -std=gnu99 -I $(SPINN_INC_DIR) -c
LD := $(GP)-gcc -T$(SPINN_TOOLS_DIR)/sark.lnk -Wl,-e,cpu_reset -Wl,-static -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,--use-blx -nostartfiles -static
LFLAGS += -L $(SPINN_LIB_DIR)
endif
CC_THUMB := $(CC) -mthumb -DTHUMB
AR := $(GP)-ar -rcs
OC := $(GP)-objcopy
OD := $(GP)-objdump -dxt
NM := $(GP)-nm
SPINN_LIBS += $(SPINN_LIB_DIR)/libspin1_api.a
else
# ARM Compiler settings
AS := armasm --keep --cpu=5te --apcs /interwork
CC := armcc -c --c99 --cpu=5te -Ospace --apcs /interwork --min_array_alignment=4 -I $(SPINN_INC_DIR)
CC_THUMB := $(CC) --thumb -DTHUMB
ifeq ($(LIB), 1)
CFLAGS += --split_sections
LD := armlink --partial
else
LD = armlink --scatter=$(SPINN_TOOLS_DIR)/sark.sct --remove --entry cpu_reset
endif
AR := armar -rsc
OC := fromelf
OD := fromelf -cds --output
NM := nm
SPINN_LIBS += $(SPINN_LIB_DIR)/spin1_api.a
endif
RM := rm -f
CAT := cat
LS := ls -l
MKDIR := mkdir -p
CP := cp
# Primary target is an APLX file - built from the ELF
# 1) Create a binary file which is the concatenation of RO and RW sections
# 2) Make an APLX header from the ELF file with "mkaplx" and concatenate
# that with the binary to make the APLX file
# 3) Remove temporary files and "ls" the APLX file
$(APP_OUTPUT_DIR)%.aplx: $(BUILD_DIR)%.elf
$(MKDIR) $(APP_OUTPUT_DIR)
ifeq ($(GNU),1)
$(OC) -O binary -j RO_DATA $< $(BUILD_DIR)RO_DATA.bin
$(OC) -O binary -j RW_DATA $< $(BUILD_DIR)RW_DATA.bin
$(SPINN_TOOLS_DIR)/mkbin $(BUILD_DIR)RO_DATA.bin $(BUILD_DIR)RW_DATA.bin > $(BUILD_DIR)$*.bin
else
$(OC) --bin --output $*.bin $<
endif
$(SPINN_TOOLS_DIR)/mkaplx -nm $(NM) $< | $(CAT) - $(BUILD_DIR)$*.bin > $@
$(RM) $(BUILD_DIR)$*.bin $(BUILD_DIR)RO_DATA.bin $(BUILD_DIR)RW_DATA.bin
$(LS) $@
# Build the ELF file
# 1) Make a "sark_build.c" file containing app. name and build time
# with "mkbuild" and compile it
# 2) Link application object(s), build file and library to make the ELF
# 3) Tidy up temporaries and create a list file
$(BUILD_DIR)%.elf: $(OBJECTS) $(BUILD_DIR)neuron/fp_math.o $(SCRIPT) $(SPINN_LIBS)
$(MKDIR) $(BUILD_DIR)
$(SPINN_TOOLS_DIR)/mkbuild $* > $(BUILD_DIR)sark_build.c
$(CC) -o $(BUILD_DIR)sark_build.o $(BUILD_DIR)sark_build.c
$(LD) $(LFLAGS) $(OBJECTS) $(BUILD_DIR)neuron/fp_math.o $(BUILD_DIR)sark_build.o $(LIBRARIES) $(SPINN_LIBS) -o $@
$(RM) $(BUILD_DIR)sark_build.c $(BUILD_DIR)sark_build.o
$(OD) > $(BUILD_DIR)$*.txt $@
$(BUILD_DIR)%.o: %.c
$(MKDIR) $(BUILD_DIR)
$(CC) $(CFLAGS) -o $@ $<
# include $(SPINN_DIRS)/make_lib/Makefile.SpiNNFrontEndCommon (continued)
all: $(APP_OUTPUT_DIR)$(APP).aplx
# Tidy and cleaning dependencies
clean:
$(RM) $(OBJECTS) $(BUILD_DIR)$(APP).elf $(BUILD_DIR)$(APP).txt $(APP_OUTPUT_DIR)$(APP).aplx