blob: 3c3e02912716727ef9cfaafa9fec9006ffbed8f2 [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
##############################################################
## Generic rules set for compiling SW for different targets ##
## ##
## Documentation: doc/sw_build_flow.md ##
## ##
##############################################################
# rules
.SECONDEXPANSION:
ifeq ($(STANDALONE_SW), 1)
all: gen_dir standalone
else
all: gen_dir $(IMG_OUTPUTS)
endif
gen_dir:
mkdir -p ${SW_BUILD_DIR}
mkdir -p ${LIB_BUILD_DIR}
env > ${SW_BUILD_DIR}/env_vars
standalone: $(SW_DEPS)
$(STANDALONE_CMD)
$(LIB_TARGET): $(GEN_HEADER_OUTPUTS) $(LIB_PPOS) $(LIB_OBJS)
$(AR) $(ARFLAGS) $@ $(LIB_OBJS)
lib: $(LIB_TARGET)
# Note: this IMG_NAME requires the srecord package to be installed.
# XXX: This could be replaced by objcopy onc is merged.
# https://sourceware.org/bugzilla/show_bug.cgi?id=19921
# XXX: Currently the start address 0x1000 is hardcoded. It could/should be
# read from the elf file, but is lost in the bin file.
# Switching to objcopy will resolve that as well.
%.vmem: %.bin
srec_cat $^ -binary -offset 0x0 -byte-swap 4 -o $@ -vmem
%.bin: %.elf
$(OBJCOPY) -O binary $^ $@
%.dis: %.elf
$(OBJDUMP) -SD $^ > $@
# link & generate elf
%.elf %.map: $(SW_DEPS) $(SW_PPOS) $(SW_OBJS) $(LINKER_SCRIPT)
$(CC) $(CFLAGS) $(LINK_OPTS) -o $@
# compile sw sources
# TOOD: figure out a way to 'templatise' .o/.ppo ruleset for each dir containing srcs
$(SW_BUILD_DIR)/%.o: $(SW_DIR)/$$*.c
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.o: $(SW_DIR)/$$*.S
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.ppo: $(SW_DIR)/$$*.c
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.ppo: $(SW_DIR)/$$*.S
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.o: $(LIB_DIR)/$$*.c
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.o: $(LIB_DIR)/$$*.S
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.ppo: $(LIB_DIR)/$$*.c
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.ppo: $(LIB_DIR)/$$*.S
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.o: $(EXT_COMMON_DIR)/$$*.c
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.o: $(EXT_COMMON_DIR)/$$*.S
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.ppo: $(EXT_COMMON_DIR)/$$*.c
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(SW_BUILD_DIR)/%.ppo: $(EXT_COMMON_DIR)/$$*.S
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
# compile lib sources
$(LIB_BUILD_DIR)/%.o: $(LIB_DIR)/$$*.c
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(LIB_BUILD_DIR)/%.o: $(LIB_DIR)/$$*.S
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(LIB_BUILD_DIR)/%.ppo: $(LIB_DIR)/$$*.c
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(LIB_BUILD_DIR)/%.ppo: $(LIB_DIR)/$$*.S
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(LIB_BUILD_DIR)/%.o: $(EXT_COMMON_DIR)/$$*.c
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(LIB_BUILD_DIR)/%.o: $(EXT_COMMON_DIR)/$$*.S
$(CC) $(CFLAGS) -MMD -c $(INCS) -o $@ $<
$(LIB_BUILD_DIR)/%.ppo: $(EXT_COMMON_DIR)/$$*.c
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
$(LIB_BUILD_DIR)/%.ppo: $(EXT_COMMON_DIR)/$$*.S
$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
# regtool
$(LIB_BUILD_DIR)/%_regs.h: $(SW_ROOT_DIR)/../hw/ip/$$*/data/$$*.hjson
$(REGTOOL) -D -o $@ $<
$(LIB_BUILD_DIR)/%_regs.h: $(SW_ROOT_DIR)/../hw/ip/$$*/data/$$*_regs.hjson
$(REGTOOL) -D -o $@ $<
# chip_info
$(LIB_BUILD_DIR)/sw/device/boot_rom/chip_info.h: $(INFOTOOL)
$(INFOTOOL) -o $(LIB_BUILD_DIR)/sw/device/boot_rom
-include $(DEPS)
# clean sources
clean:
-$(RM) -r $(LIB_OBJS) $(LIB_PPOS) $(SW_OBJS) $(SW_PPOS) $(DEPS) \
$(GEN_HEADER_OUTPUTS) $(IMG_OUTPUTS) $(LIB_TARGET) ${SW_BUILD_DIR}/env_vars
distclean: clean
.PHONY: gen_dir lib clean distclean standalone