Files
aorzelli.ge.infn.it 85bd78bcb2
2014-07-31 09:43:14 +00:00

347 lines
11 KiB
Makefile

####################################################################
# Makefile #
####################################################################
.SUFFIXES: # ignore builtin rules
.PHONY: all debug release
####################################################################
# Definitions #
####################################################################
PROJECTNAME :=clbv2app
# Possbile targets:
# TARGET=CLBV2_PROTO - CLB v2 proto
# TARGET=CLBV2_2 - CLB v2.2 proto
# TARGET=CLBV2_PRES1 - CLB v2.2.1 proto
# TARGET=KC705_SFP - KC705 with ethernet over SPF (no white rabbit)
# TARGET=KC705_SPLL - KC705 with ethernet over softPLL
# TARGET=KC705_UART - KC705 with UART ethernet bridge (no white rabbit)
OBJ_DIR := obj
EXE_DIR := exe
LST_DIR := lst
UNAME := $(shell uname)
####################################################################
# Definitions of toolchain. #
# You might need to do changes to match your system setup #
# For now, there is configuration for Linux and Other is Windows #
####################################################################
UPLOAD_IMP = upload.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
# This generates the new Java MSG Types when a new command is added
H_MSGTYPES_FILE := ../cfg/cfg_msg.h
J_MSGTYPES_SRC_DIR := ../../../standard/CLBv2_Remote/src
J_MSGTPYES_FILE := $(J_MSGTYPES_SRC_DIR)/org/km3net/clbv2/remote/MsgTypes.java
ifeq ($(TARGET),KC705_SPLL)
FW_SYN_PATH := ../../../../fw/CLBv2_Design/clb/syn/kc705
WR_ELFFILE := wrc_mac.elf
CFLAGS += -DKC705 -DWHITERABBIT
else
ifeq ($(TARGET),KC705_SFP)
FW_SYN_PATH := ../../../../fw/CLBv2_Design/clb/syn/kc705_without_softpll
WR_ELFFILE := sfp_mac.elf
CFLAGS += -DKC705
else
ifeq ($(TARGET),CLBV2_PROTO)
FW_SYN_PATH := ../../../../fw/TestDesigns/clb_test/syn/proto
WR_ELFFILE := ../../../../../tags/workshop_demo_jan2014/sw/embedded/wrc_kintex_Mieke131213.elf
CFLAGS += -DCLBV2
else
ifeq ($(TARGET),CLBV2_2)
FW_SYN_PATH := ../../../../fw/TestDesigns/clb_test/syn/v2_2
WR_ELFFILE := ../../../../../tags/workshop_demo_jan2014/sw/embedded/wrc_kintex_Mieke131213.elf
CFLAGS += -DCLBV2
else
ifeq ($(TARGET),CLBV2_PRES1)
FW_SYN_PATH := ../../../../fw/TestDesigns/clb_test/syn/preserie1
WR_ELFFILE := ../../../../../tags/workshop_demo_jan2014/sw/embedded/wrc_kintex_Mieke131213.elf
CFLAGS += -DCLBV2
else
ifeq ($(TARGET),KC705_UART)
FW_SYN_PATH := ../../../../fw/CLBv2_Design/lm32_2nd/syn/syn_top
CFLAGS += -DKC705 -DUARTBRIDGE
else
$(error Must select target 'TARGET=[KC705_UART|KC705_SPLL|KC705_SPF|CLBV2_PROTO|CLBV2_2|CLBV2_PRES1]', was $(TARGET))
endif
endif
endif
endif
endif
endif
# For creating the resulting bit file
FW_BITFILE := $(FW_SYN_PATH)/fpga.bit
FW_BMMFILE := $(FW_SYN_PATH)/fpga_bd.bmm
# Integration of the white-rabbit LM32 ELF-file
BMM_TAG_WRPC := lm32_wrpc_memory
BMM_TAG_2LM := lm32_2nd_memory
RM = rm -rf
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)
PYTHON = python
PYTHON_VERSION := $(shell $(QUOTE)$(PYTHON) --version$(QUOTE) 2>&1)
GCCVERSION = $(shell $(CC) -dumpversion)
####################################################################
# Flags #
####################################################################
# -MMD : Don't generate dependencies on system header files.
# -MP : Add phony targets, useful when a h-file is removed from a project.
# -MF : Specify a file to write the dependencies to.
DEPFLAGS = -MMD -MP -MF $(@:.o=.d)
# Add -Wa,-ahld=$(LST_DIR)/$(@F:.o=.lst) to CFLAGS to produce assembly list files
CFLAGS += -Wall -fno-builtin -nodefaultlibs -nostdinc -nodefaultlibs -nostdlib $(DEPFLAGS)
ASMFLAGS += -Wall
LDFLAGS += -Tromram.ld -nostartfiles -nodefaultlibs -nostdlib -Wl,-Map=$(LST_DIR)/$(PROJECTNAME).map -Wl,--gc-sections
LIBS = -Wl,--start-group -lgcc -Wl,--end-group
INCLUDEPATHS += \
-I../cfg \
-I../src/common \
-I../src/platform \
-I../src/app \
-I../src/ministack
####################################################################
# Files #
####################################################################
C_SRC += \
../src/common/stdio.c \
../src/common/stdlib.c \
../src/common/string.c \
../src/common/coll/queue.c \
../src/common/coll/varqueue.c \
../src/common/util/convert.c \
../src/common/util/databuffer.c \
../src/common/util/shell.c \
../src/common/util/log.c \
../src/platform/lm32soc/lm32.c \
../src/platform/kernel/sys.c \
../src/platform/kernel/err.c \
../src/platform/kernel/scheduler.c \
../src/platform/kernel/tm.c \
../src/platform/kernel/timer.c \
../src/platform/drv/wb/sdb.c \
../src/platform/drv/wb/suart.c \
../src/platform/drv/wb/hydro.c \
../src/platform/drv/wb/susm.c \
../src/platform/drv/wb/gpio.c \
../src/platform/drv/wb/i2c.c \
../src/platform/drv/wb/spi.c \
../src/platform/drv/wb/ipmux.c \
../src/platform/drv/wb/wrx.c \
../src/platform/drv/i2c/ahrs.c \
../src/platform/drv/i2c/sht21.c \
../src/platform/drv/i2c/ltc2499.c \
../src/platform/drv/i2c/ltc2631.c \
../src/platform/drv/i2c/dpbasic.c \
../src/platform/drv/i2c/octocpld.c \
../src/platform/drv/i2c/promis.c \
../src/platform/modules/octopus.c \
../src/platform/modules/nestor.c \
../src/platform/net/srp.c \
../src/platform/net/mcf.c \
../src/platform/net/msg.c \
../src/platform/net/network.c \
../src/ministack/ms.c \
../src/ministack/ms_eth.c \
../src/ministack/ms_arp.c \
../src/ministack/ms_ip.c \
../src/ministack/ms_icmp.c \
../src/ministack/ms_udp.c \
../src/ministack/ms_bootp.c \
../src/app/remote/msg_dbg.c \
../src/app/remote/msg_sys.c \
../src/app/remote/msg_clb.c \
../src/app/subsys/sub_sys.c \
../src/app/subsys/sub_net.c \
../src/app/subsys/sub_opt.c \
../src/app/subsys/sub_ins.c \
../src/app/subsys/sub_acs.c \
../src/app/shell/shell_soc.c \
../src/app/shell/shell_hydro.c \
../src/app/shell/shell_susm.c \
../src/app/shell/shell_sht21.c \
../src/app/shell/shell_ahrs.c \
../src/app/shell/shell_dbg.c \
../src/app/shell/shell_ipmux.c \
../src/app/shell/shell_net.c \
../src/app/app.c \
../src/app/reset.c \
../src/app/conn_test.c \
../src/app/clbstate.c \
../src/app/susm/app_susm.c \
../src/app/susm/duart.c
ifndef WR_ELFFILE
C_SRC += \
../src/platform/net/uartbridge.c
endif
S_SRC += \
../src/platform/lm32soc/crt0rom.S
####################################################################
# Rules #
####################################################################
C_FILES = $(notdir $(C_SRC) )
CPP_FILES = $(notdir $(CPP_SRC) )
S_FILES = $(notdir $(S_SRC) )
#make list of source paths, sort also removes duplicates
C_PATHS = $(sort $(dir $(C_SRC) ) )
CPP_PATHS = $(sort $(dir $(CPP_SRC) ) )
S_PATHS = $(sort $(dir $(S_SRC) ) )
C_OBJS = $(addprefix $(OBJ_DIR)/, $(C_FILES:.c=.o))
CPP_OBJS = $(addprefix $(OBJ_DIR)/, $(CPP_FILES:.cpp=.o))
S_OBJS = $(addprefix $(OBJ_DIR)/, $(S_FILES:.S=.o))
C_DEPS = $(addprefix $(OBJ_DIR)/, $(C_FILES:.c=.d))
CPP_DEPS = $(addprefix $(OBJ_DIR)/, $(CPP_FILES:.cpp=.d))
vpath %.c $(C_PATHS)
vpath %.cpp $(CPP_PATHS)
vpath %.S $(S_PATHS)
# Default build is debug build
all: release
debug: CFLAGS += -DDEBUG -O0 -g3
debug: $(OBJ_DIR) $(LST_DIR) $(EXE_DIR) $(EXE_DIR)/$(PROJECTNAME).bit
release: CFLAGS += -DNDEBUG -Os
release: $(OBJ_DIR) $(LST_DIR) $(EXE_DIR) $(EXE_DIR)/$(PROJECTNAME).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."
# Create objects from C SRC files
$(OBJ_DIR)/%.o: %.c
@echo "Building file: $<"
$(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o $@ "$<"
$(OBJ_DIR)/%.o: %.cpp
@echo "Building file: $<"
$(CC) $(CFLAGS) $(INCLUDEPATHS) -fexceptions -c -o $@ "$<"
# Assemble .s files
$(OBJ_DIR)/%.o: %.S
@echo "Assembling $<"
$(CC) $(ASMFLAGS) $(INCLUDEPATHS) -c -o $@ "$<"
# 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) ../tools/msg2java.py $(H_MSGTYPES_FILE) $(J_MSGTYPES_SRC_DIR)
else
@echo "Warning, Python is not found, Java Message Types not generated"
endif
# Link
$(EXE_DIR)/$(PROJECTNAME).elf: $(C_OBJS) $(CPP_OBJS) $(S_OBJS) $(J_MSGTPYES_FILE)
@echo "Linking target: $@"
ifdef PYTHON_VERSION
$(PYTHON) ../tools/buildno.py build.txt clbv2
else
@echo "Warning, Python is not found, build number not modified"
endif
$(CC) $(LDFLAGS) build.txt.ld $(S_OBJS) $(C_OBJS) $(CPP_OBJS) $(LIBS) -o $(EXE_DIR)/$(PROJECTNAME).elf
$(DUMP) --disassemble -S $(EXE_DIR)/$(PROJECTNAME).elf >$(LST_DIR)/$(PROJECTNAME).s
$(DUMP) -t -h $(EXE_DIR)/$(PROJECTNAME).elf > $(LST_DIR)/$(PROJECTNAME).dump
ifdef PYTHON_VERSION
python parseobjdump.py $(LST_DIR)/$(PROJECTNAME).dump
endif
# Create binary file
$(EXE_DIR)/$(PROJECTNAME).bit: $(EXE_DIR)/$(PROJECTNAME).elf $(FW_BITFILE) $(FW_BMMFILE)
@echo "Creating binary file"
ifdef WR_ELFFILE
$(D2M) -bm $(FW_BMMFILE) \
-bd $(WR_ELFFILE) tag $(BMM_TAG_WRPC) \
-bd $(EXE_DIR)/$(PROJECTNAME).elf tag $(BMM_TAG_2LM) \
-bt $(FW_BITFILE) -o b $(EXE_DIR)/$(PROJECTNAME).bit
else
$(D2M) -bm $(FW_BMMFILE) -bd $(EXE_DIR)/$(PROJECTNAME).elf -bt $(FW_BITFILE) -o b $(EXE_DIR)/$(PROJECTNAME).bit
endif
upload: $(EXE_DIR)/$(PROJECTNAME).bit
@echo "Uploading"
$(IMPACT) -batch $(UPLOAD_IMP)
clean:
$(RM) $(OBJ_DIR) $(LST_DIR) $(EXE_DIR)
test:
@echo "OSTYPE = $(UNAME) $(CC) $(UPLOAD_IMP)"
# include auto-generated dependency files (explicit rules)
ifneq (clean,$(findstring clean, $(MAKECMDGOALS)))
-include $(C_DEPS)
endif