Files
2020-08-04 09:47:46 +00:00

333 lines
9.8 KiB
Makefile

# Path setup
OBJ_DIR := obj
EXE_DIR := exe
DEP_DIR := dep
LST_DIR := lst
QUOTE := "
ROOT_PATH := ../..
EMB_PATH := $(ROOT_PATH)/..
SW_PATH := $(ROOT_PATH)/../..
PRJ_PATH := $(ROOT_PATH)/../../..
SRC_DIR := $(ROOT_PATH)/src
TOOL_DIR := $(ROOT_PATH)/tools
FW_DIR := $(PRJ_PATH)/fw
UNAME := $(shell uname)
UPLOAD_IMP := upload.imp
UPDATE_IMP := update.imp
ifneq ($(UNAME), Linux)
GCC_LM32_SUFFIX := .exe
endif
ifndef GCC_LM32_PREFIX
GCC_LM32_PREFIX := lm32-elf-
endif
ifdef GCC_LM32_BIN
GCC_LM32_BIN_P := $(subst \,/,$(GCC_LM32_BIN))/
endif
ifdef ISE_BIN_DIR
ISE_BIN_DIR_P := $(ISE_BIN_DIR)/
endif
ifdef MAC_BROADCAST
WRC_MAC := $(EMB_PATH)/WRPC/wrc_broadcast.elf
else
WRC_MAC := $(EMB_PATH)/WRPC/wrc_mac.elf
endif
# These defines are used for generating the new Java MSG Types when a new command is added
H_MSGTYPES_FILE := $(ROOT_PATH)/cfg/cfg_msg.h
J_MSGTYPES_SRC_DIR := $(SW_PATH)/standard/CLBv2_Remote/src
J_MSGTPYES_FILE := $(J_MSGTYPES_SRC_DIR)/org/km3net/clbv2/remote/MsgTypes.java
# These defines are used for generating the process variables
VARS_FILE := $(ROOT_PATH)/vars/variables.csv
C_VARS_ROOT_DIR := $(SRC_DIR)/app
C_VARS_SRC_DIR := pv
C_VARS_SRC_BASE_NAME := vars
J_VARS_ROOT_DIR := $(SW_PATH)/standard/CLBv2_Remote/src
J_VARS_CLASS := org.km3net.clbv2.remote.pv.ProcVar
ifneq ($(MAKECMDGOALS),clean)
ifeq ($(TARGET),KC705_SPLL)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/kc705
WR_ELFFILE := $(WRC_MAC).elf
CFLAGS := -DKC705 -DWHITERABBIT
BIN_SUFFIX := kc705spll
else
ifeq ($(TARGET),KC705_SFP)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/kc705_without_softpll
WR_ELFFILE := sfp_mac.elf
BIN_SUFFIX := kc705sfp
CFLAGS += -DKC705
else
ifeq ($(TARGET),CLBV2_PROTO)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/proto
WR_ELFFILE := $(WRC_MAC)
BIN_SUFFIX := proto
CFLAGS := -DCLBV2 -DWHITERABBIT
else
ifeq ($(TARGET),CLBV2_2)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/v2_2
WR_ELFFILE := $(WRC_MAC)
BIN_SUFFIX := v22
CFLAGS := -DCLBV2 -DWHITERABBIT
else
ifeq ($(TARGET),CLBV2_2_1)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/v2_2_1
WR_ELFFILE := $(WRC_MAC)
BIN_SUFFIX := v221
CFLAGS := -DCLBV2 -DWHITERABBIT
else
ifeq ($(TARGET),CLBV2_PRES1)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/preserie1
WR_ELFFILE := $(WRC_MAC)
CFLAGS := -DCLBV2 -DWHITERABBIT
BIN_SUFFIX := v2pre1
else
ifeq ($(TARGET),CLBV2X_PROTO)
# Nikhef internal. will not work outside my environment (Vincent)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/proto_xc325t
#FW_SYN_PATH := ../../../../../proto_xc325t
WR_ELFFILE := $(WRC_MAC)
CFLAGS := -DCLBV2 -DCLBV2X -DWHITERABBIT
else
ifeq ($(TARGET),CLBV2_2_1_CUSTOM)
FW_SYN_PATH := $(FW_DIR)/CLBv2_Design/clb/syn/custom
WR_ELFFILE := $(WRC_MAC)
BIN_SUFFIX := v221
CFLAGS := -DCLBV2 -DWHITERABBIT
else
$(error Must select target 'TARGET=[KC705_UART|KC705_SPLL|KC705_SFP|CLBV2_PROTO|CLBV2_2|CLBV2_2_1|CLBV2_PRES1]', was $(TARGET))
endif
endif
endif
endif
endif
endif
endif
endif
endif
ifdef MAC_BROADCAST
BIN_NAME := $(PROJECTNAME)_$(BIN_SUFFIX)_bc
else
BIN_NAME := $(PROJECTNAME)_$(BIN_SUFFIX)
endif
# For creating the resulting bit file
ifdef JENKINS
FW_BITFILE := $(FW_SYN_PATH)/bash/fpga.bit
FW_BMMFILE := $(FW_SYN_PATH)/bash/fpga_bd.bmm
else
FW_BITFILE := $(FW_SYN_PATH)/fpga.bit
FW_BMMFILE := $(FW_SYN_PATH)/fpga_bd.bmm
endif
# Integration of the white-rabbit LM32 ELF-file
BMM_TAG_WRPC := lm32_wrpc_memory
BMM_TAG_2LM := lm32_2nd_memory
RM := rm -rf
MV := mv
CP := cp
CC := $(QUOTE)$(GCC_LM32_BIN_P)$(GCC_LM32_PREFIX)gcc$(GCC_LM32_SUFFIX)$(QUOTE)
LD := $(QUOTE)$(GCC_LM32_BIN_P)$(GCC_LM32_PREFIX)ld$(QUOTE)
AR := $(QUOTE)$(GCC_LM32_BIN_P)$(GCC_LM32_PREFIX)ar$(QUOTE)
OBJCOPY := $(QUOTE)$(GCC_LM32_BIN_P)$(GCC_LM32_PREFIX)objcopy$(QUOTE)
DUMP := $(QUOTE)$(GCC_LM32_BIN_P)$(GCC_LM32_PREFIX)objdump$(QUOTE)
D2M := $(QUOTE)$(ISE_BIN_DIR_P)data2mem$(QUOTE)
IMPACT := $(QUOTE)$(ISE_BIN_DIR_P)impact$(QUOTE)
ifneq ($(UNAME), Linux)
PYTHON := python
else
PYTHON := python2.7
endif
PYTHON_VERSION := $(shell $(QUOTE)$(PYTHON)$(QUOTE) --version 2>&1)
GCCVERSION := $(shell $(CC) -dumpversion)
CFLAGS := $(CFLAGS) -DIMAGETYPE=$(IMAGETYPE) $(DEFINES) -c -std=gnu99 -mbarrel-shift-enabled -mmultiply-enabled -msign-extend-enabled \
-Os -g3 -ffunction-sections -Wall -fno-builtin -nostdlib -nostdinc
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
ifdef DEBUG
CFLAGS := -DDEBUG $(CFLAGS)
endif
ASMFLAGS := -Wall -c
LDFLAGS := -T../romram.ld -Wl,-Map=$(LST_DIR)/$(PROJECTNAME).map -Wl,--gc-sections -nostartfiles -nostdinc
LIBS := -Wl,--start-group -lc -Wl,--end-group
INC_ARGS:= $(addprefix -I$(SRC_DIR)/,$(INCLUDE))
C_PATHS := $(addprefix $(SRC_DIR)/,$(C_SRC))
S_PATHS := $(addprefix $(SRC_DIR)/,$(S_SRC))
C_FILES := $(notdir $(C_PATHS) )
S_FILES := $(notdir $(S_PATHS) )
C_OBJS := $(addprefix $(OBJ_DIR)/, $(C_FILES:.c=.o))
S_OBJS := $(addprefix $(OBJ_DIR)/, $(S_FILES:.S=.o))
C_DEPS := $(addprefix $(DEP_DIR)/, $(C_FILES:.c=.d))
SECTIONS :=-j .boot -j .text -j .rodata -j .data -j .crc32
vpath %.c $(sort $(dir $(C_PATHS) ) )
vpath %.S $(sort $(dir $(S_PATHS) ) )
# Default build is debug build
all: $(DEP_DIR) $(OBJ_DIR) $(LST_DIR) $(EXE_DIR) $(EXE_DIR)/$(BIN_NAME).bit
# Create directories
$(OBJ_DIR):
mkdir $(OBJ_DIR)
@echo "Created build directory."
$(EXE_DIR):
mkdir $(EXE_DIR)
@echo "Created executable directory."
$(LST_DIR):
mkdir $(LST_DIR)
@echo "Created list directory."
$(DEP_DIR):
mkdir $(DEP_DIR)
@echo "Created dependency directory."
# Create objects from C SRC files
$(OBJ_DIR)/%.o: %.c
$(OBJ_DIR)/%.o: %.c $(DEP_DIR)/%.d | $(DEP_DIR)
@echo "Building file: $<"
$(CC) $(DEPFLAGS) $(INC_ARGS) $(CFLAGS) "$<" -o $@
# Assemble .s files
$(OBJ_DIR)/%.o: %.S
@echo "Assembling $<"
$(CC) $(DEPFLAGS) $(INC_ARGS) $(ASMFLAGS) "$<" -o $@
$(C_DEPS):
# Extract all message types in MCF from the C header file,
# and generate a Java class with these constants
$(J_MSGTPYES_FILE): $(H_MSGTYPES_FILE)
@echo "Exporting message types to Remote Control API"
ifdef PYTHON_VERSION
$(PYTHON) $(TOOL_DIR)/msg2java.py $(H_MSGTYPES_FILE) $(J_MSGTYPES_SRC_DIR)
else
@echo "Warning, Python is not found, Java Message Types not generated"
endif
# Generate a Python and Java variable definitons.
../../src/app/pv/vars.c ../../src/app/pv/vars.h: $(VARS_FILE)
@echo "Exporting variables "
ifdef PYTHON_VERSION
$(PYTHON) $(TOOL_DIR)/makevars.py $(VARS_FILE) \
$(C_VARS_ROOT_DIR) $(C_VARS_SRC_DIR) $(C_VARS_SRC_BASE_NAME) \
$(J_VARS_ROOT_DIR) $(J_VARS_CLASS) \
$(ROOT_PATH)/doc/variables.html
else
@echo "Warning, Python is not found, Java variables not generated"
endif
# Link
$(EXE_DIR)/$(BIN_NAME).elf: $(C_OBJS) $(CPP_OBJS) $(S_OBJS) $(J_MSGTPYES_FILE) ../romram.ld
@echo "Linking target: $@"
ifdef PYTHON_VERSION
$(PYTHON) $(TOOL_DIR)/buildno.py build.txt clbv2
else
@echo "Warning, Python is not found, build number not modified"
endif
$(CC) $(LDFLAGS) build.txt.ld -Wl,--defsym=CRC_VALUE=0 $(S_OBJS) $(C_OBJS) $(CPP_OBJS) $(LIBS) -o $(EXE_DIR)/tmp.elf
$(OBJCOPY) $(EXE_DIR)/tmp.elf $(SECTIONS) -O binary $(EXE_DIR)/tmp.bin
$(CC) $(LDFLAGS) build.txt.ld -Wl,--defsym=CRC_VALUE=`python ../../tools/crc32.py $(EXE_DIR)/tmp.bin 0:-4` $(S_OBJS) $(C_OBJS) $(CPP_OBJS) $(LIBS) -o $(EXE_DIR)/$(BIN_NAME).elf
$(OBJCOPY) $(EXE_DIR)/$(BIN_NAME).elf $(SECTIONS) -O binary $(EXE_DIR)/$(BIN_NAME).elf.bin
$(DUMP) -S --disassemble $(EXE_DIR)/$(BIN_NAME).elf >$(LST_DIR)/$(BIN_NAME).s
$(DUMP) -t -h $(EXE_DIR)/$(BIN_NAME).elf > $(LST_DIR)/$(BIN_NAME).dump
ifdef PYTHON_VERSION
python $(TOOL_DIR)/parseobjdump.py $(LST_DIR)/$(BIN_NAME).dump ROM=0x1CA00 RAM=0x3580
endif
# Create binary file
$(EXE_DIR)/$(BIN_NAME).bit: $(EXE_DIR)/$(BIN_NAME).elf $(FW_BITFILE) $(FW_BMMFILE) $(WRC_MAC)
@echo "Creating binary file"
@echo "Using MAC: $(WRC_MAC)"
ifdef WR_ELFFILE
$(D2M) -bm $(FW_BMMFILE) \
-bd $(WR_ELFFILE) tag $(BMM_TAG_WRPC) \
-bd $(EXE_DIR)/$(BIN_NAME).elf tag $(BMM_TAG_2LM) \
-bt $(FW_BITFILE) -o b $(EXE_DIR)/$(BIN_NAME).bit
else
$(D2M) -bm $(FW_BMMFILE) -bd $(EXE_DIR)/$(BIN_NAME).elf -bt $(FW_BITFILE) -o b $(EXE_DIR)/$(BIN_NAME).bit
endif
upload: $(EXE_DIR)/$(BIN_NAME).bit
@echo "Uploading"
$(CP) -u $(EXE_DIR)/$(BIN_NAME).bit $(EXE_DIR)/tmp.bit
$(IMPACT) -batch ../$(UPLOAD_IMP)
$(RM) $(EXE_DIR)/tmp.bit
update: $(EXE_DIR)/$(BIN_NAME).bit
@echo "Generating update images"
ifdef PYTHON_VERSION
$(CP) -u $(EXE_DIR)/$(BIN_NAME).bit $(EXE_DIR)/tmp.bit
$(IMPACT) -batch ../bin_$(UPDATE_IMP)
$(IMPACT) -batch ../mcs_$(UPDATE_IMP)
$(RM) $(EXE_DIR)/tmp.bit
$(MV) $(EXE_DIR)/tmp.bin $(EXE_DIR)/$(BIN_NAME).bin
$(MV) $(EXE_DIR)/tmp.mcs $(EXE_DIR)/$(BIN_NAME).mcs
python $(TOOL_DIR)/buildtoimg.py build.txt $(EXE_DIR)/$(BIN_NAME).bit $(IMAGETYPE) $(EXE_DIR)/$(BIN_NAME).bin
else
@echo "Warning, Python not found. Can not make runtime image
endif
clean:
$(RM) $(OBJ_DIR) $(LST_DIR) $(EXE_DIR)
$(RM) $(C_VARS_ROOT_DIR)/$(C_VARS_SRC_DIR)/$(C_VARS_SRC_BASE_NAME).c
$(RM) $(C_VARS_ROOT_DIR)/$(C_VARS_SRC_DIR)/$(C_VARS_SRC_BASE_NAME).h
test:
@echo $(GCC_LM32_PREFIX)
include $(wildcard $(C_DEPS))
# include auto-generated dependency files (explicit rules)
ifneq (clean,$(findstring clean, $(MAKECMDGOALS)))
-include $(C_DEPS)
endif