167 lines
4.7 KiB
Makefile
Executable File
167 lines
4.7 KiB
Makefile
Executable File
CROSS_COMPILE ?= riscv64-unknown-elf-
|
|
O ?= $(shell pwd)/out
|
|
ARCH ?= riscv
|
|
|
|
CONFIG_INC := $(O)/include/autoconf.h
|
|
CONFIG_MAKE := $(O)/.makefile
|
|
CONFIG_FILE := $(O)/.config
|
|
export CONFIG_FILE CONFIG_INC
|
|
|
|
sinclude $(CONFIG_FILE)
|
|
|
|
TOPDIR := $(shell pwd)
|
|
export TOPDIR
|
|
CC := $(CROSS_COMPILE)gcc
|
|
AR := $(CROSS_COMPILE)ar
|
|
LD := $(CROSS_COMPILE)ld
|
|
OBJCOPY := $(CROSS_COMPILE)objcopy
|
|
SIZE := $(CROSS_COMPILE)size
|
|
STRIP := $(CROSS_COMPILE)strip
|
|
OBJDUMP := $(CROSS_COMPILE)objdump
|
|
RM := $(shell if [ -x "/bin/rm" ]; then echo /bin/rm; else type -P rm; fi)
|
|
LS := $(shell if [ -x "/bin/ls" ]; then echo /bin/ls; else type -P ls; fi)
|
|
MCU := mcu
|
|
RM := $(RM) -f
|
|
|
|
export CC AR LD OBJCOPY RM TOPDIR MCU SIZE STRIP LS
|
|
|
|
include $(TOPDIR)/scripts/Makefile.define
|
|
|
|
V ?= 0
|
|
|
|
ifeq ($(V),1)
|
|
Q :=
|
|
QUIET :=
|
|
else
|
|
Q := @
|
|
QUIET := -s
|
|
endif
|
|
|
|
MKFLAGS := $(QUIET) -f $(TOPDIR)/scripts/Makefile.build
|
|
CLFLAGS := $(QUIET) -f $(TOPDIR)/scripts/Makefile.clean
|
|
|
|
export MKFLAGS CLFLAGS Q QUIET
|
|
|
|
MKDEP := .mkdep
|
|
export MKDEP
|
|
|
|
ARFLAGS += rcs
|
|
LDFLAGS +=
|
|
|
|
CFLAGS += -fno-builtin -fno-common -ffreestanding -nostdinc \
|
|
-I$(shell pwd)/include -I$(O)/include -I$(TOPDIR) -pipe -g -gdwarf-4 -Wall -Werror \
|
|
-DCONFIG_$(strip $(call upper, $(ARCH)))_ARCH
|
|
|
|
GC_ENABLE ?= y
|
|
CFLAGS += $(if $(GC_ENABLE),-fdata-sections -ffunction-sections)
|
|
CFLAGS += $(shell echo $(CONFIG_CFLAGS))
|
|
LDFLAGS += $(shell echo $(CONFIG_LDFLAGS))
|
|
|
|
ARCH_DIR := $(ARCH)/
|
|
|
|
CFLAGS += -I$(TOPDIR)/$(ARCH_DIR)include
|
|
|
|
ASFLAGS += $(CFLAGS) -D__ASSEMBLY__
|
|
|
|
export ARFLAGS LDFLAGS CFLAGS ASFLAGS
|
|
|
|
LIB_DIRS := init/ libs/ drivers/ common/
|
|
|
|
ifdef CONFIG_MEDIA_SUPPORT
|
|
MEDIA = $(if $(wildcard $(TOPDIR)/media/Makefile),y,)
|
|
endif
|
|
|
|
LIB_DIRS-stage2 += $(call is_enabled, MEDIA,media/,)
|
|
CFLAGS += $(call is_enabled, MEDIA,-I$(TOPDIR)/media/include,)
|
|
|
|
ifeq ($(strip $(CONFIG_UT_ENABLE)),y)
|
|
LIB_DIRS-stage2 += test/
|
|
endif
|
|
|
|
LIBS := $(foreach LIB,$(LIB_DIRS),$(LIB)lib$(LIB:/=).a)
|
|
LIBS-stage2 := $(foreach LIB,$(LIB_DIRS-stage2),$(LIB)lib$(LIB:/=).a)
|
|
|
|
################################################################################
|
|
sinclude $(CONFIG_MAKE)
|
|
|
|
PHONYS += help
|
|
help:
|
|
@echo "Usage: make [config]"
|
|
@echo " make clean"
|
|
@echo " make distclean"
|
|
@echo " make help"
|
|
@echo " make"
|
|
@echo " support configs:"
|
|
@for ix in $(notdir $(wildcard $(TOPDIR)/configs/*)); do ( \
|
|
echo " $${ix}"; \
|
|
) done
|
|
@echo;
|
|
|
|
PHONYS += $(MCU).bin
|
|
$(MCU).bin: $(MCU).elf
|
|
$(call show_cmd,OBJCOPY,$@)
|
|
$(Q)$(OBJCOPY) -R .comment --gap-fill=0xff -O binary $(O)/$< $(O)/$@
|
|
$(call show_cmd,MCU,$@)
|
|
$(Q)$(OBJDUMP) -D $(O)/$(MCU).elf > $(O)/mcu.asm
|
|
@echo "Config File: $(CONFIG_PLATFORM)_defconfig"
|
|
@echo "Entry Point: $(CONFIG_TEXT_BASE)"
|
|
@MSG=$$(cd $(O); $(LS) -gG --time-style=long-iso $@); \
|
|
echo "Image Size: $$(echo $${MSG} | awk '{print $$3}') Bytes"; \
|
|
echo "Create: $$(echo $${MSG} | awk '{print $$4" "$$5}')"
|
|
@echo "Output Path: $(O)"
|
|
@echo " Image $(@) is ready"
|
|
|
|
PHONYS += $(MCU).bin
|
|
$(MCU).elf: $(LIBS) $(LIBS-stage2)
|
|
$(Q)$(MAKE) $(MKFLAGS) SRCDIR="$(ARCH_DIR)" LIBS="$(LIBS)" LIBS-stage2="$(LIBS-stage2)" O="$(O)/" $(@)
|
|
|
|
PHONYS += $(LIBS) $(LIBS-stage2)
|
|
$(LIBS): $(O)/$(MKDEP) force
|
|
@touch init/main.c
|
|
$(Q)$(MAKE) $(MKFLAGS) -C $(TOPDIR)/$(@D)/ SRCDIR="$(@D)/" O="$(O)/" $(@F)
|
|
|
|
$(LIBS-stage2): $(O)/$(MKDEP) force
|
|
$(Q)$(MAKE) $(MKFLAGS) -C $(TOPDIR)/$(@D)/ SRCDIR="$(@D)/" O="$(O)/" $(@F)
|
|
|
|
|
|
%: $(TOPDIR)/configs/%
|
|
$(call show_cmd,GEN,$(notdir $(CONFIG_MAKE)))
|
|
$(call checkdir,$(dir $(CONFIG_MAKE)))
|
|
$(Q)(echo "# auto produce, don't modify this ") > $(CONFIG_MAKE)
|
|
$(Q)(echo "all: $(MCU).bin";) >> $(CONFIG_MAKE)
|
|
$(call show_cmd,GEN,$(notdir $(CONFIG_FILE)))
|
|
$(call checkdir,$(dir $(CONFIG_FILE)))
|
|
$(Q)cp "$<" "$(CONFIG_FILE)"
|
|
$(call show_cmd,GEN,$(notdir $(CONFIG_INC)))
|
|
$(call checkdir,$(dir $(CONFIG_INC)))
|
|
$(Q)(echo "/* auto produce, don't modify this */") > $(CONFIG_INC)
|
|
$(Q)set -e; cat $(CONFIG_FILE) | sed -n -f $(TOPDIR)/scripts/env2inc.sed >> $(CONFIG_INC)
|
|
|
|
force:;
|
|
|
|
$(O)/$(MKDEP): $(TOPDIR)/Makefile
|
|
@touch $@
|
|
|
|
PHONYS += clean
|
|
clean: $(addsuffix .clean,$(LIBS) $(ARCH_DIR))
|
|
$(Q)$(RM) -f $(O)/{$(MCU).bin,$(MCU).elf,$(MCU).map,$(MKDEP)}
|
|
|
|
$(addsuffix .clean,$(LIBS) $(ARCH_DIR)):
|
|
$(call show_cmd,ENTRY,$(TOPDIR)/$(@D))
|
|
$(Q)$(MAKE) $(CLFLAGS) SRCDIR="$(@D)/" O="$(O)/" clean
|
|
|
|
PHONYS += distclean
|
|
distclean:
|
|
$(Q)$(RM) -rf $(O)
|
|
$(Q)$(RM) -rf cscope.files cscope.in.out cscope.out cscope.po.out tags
|
|
|
|
PHONYS += cscope
|
|
cscope:
|
|
$(Q)find -name "*.S" -o -name "*.c" -o -name "*.h" -o -name "*.s" >cscope.files
|
|
$(Q)cscope -bkq -i ./cscope.files
|
|
$(Q)ctags -R
|
|
|
|
################################################################################
|
|
.PHONY: $(PHONYS)
|
|
################################################################################
|