Makefile 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. TARGET := threadx_module_sample
  2. # Configuration parameters
  3. RISCV_ARCH ?= rv32imafdc
  4. RISCV_ABI ?= ilp32d
  5. COMMON_FLAGS := -Os -g -fPIC -mno-plt -fno-builtin
  6. NUCLEI_SDK_ROOT := ../../../..
  7. THREADX_ROOT := $(NUCLEI_SDK_ROOT)/OS/ThreadX
  8. SRCDIRS = . $(THREADX_ROOT)/common_modules/module_lib/src $(THREADX_ROOT)/ports/nuclei/module_lib/src
  9. INCDIRS = . $(THREADX_ROOT)/common_modules/inc $(THREADX_ROOT)/common/inc $(THREADX_ROOT)/ports/nuclei
  10. LINKER_SCRIPT := sample_threadx_module.ld
  11. # Build System Based on Makefile
  12. COMPILE_PREFIX ?= riscv64-unknown-elf-
  13. CC := $(COMPILE_PREFIX)gcc
  14. CXX := $(COMPILE_PREFIX)g++
  15. # CC := $(COMPILE_PREFIX)clang
  16. # CXX := $(COMPILE_PREFIX)clang++
  17. OBJDUMP := $(COMPILE_PREFIX)objdump
  18. OBJCOPY := $(COMPILE_PREFIX)objcopy
  19. GDB := $(COMPILE_PREFIX)gdb
  20. AR := $(COMPILE_PREFIX)ar
  21. SIZE := $(COMPILE_PREFIX)size
  22. OPENOCD := openocd
  23. RM=rm -rf
  24. RMD=rm -rf
  25. ECHO=echo
  26. CP=cp -rf
  27. MKD=mkdir -p
  28. Q=
  29. PS=/
  30. TRACE_CREATE_DIR = @$(ECHO) "Creating Directory : " $(@D)
  31. TRACE_COMPILE = @$(ECHO) "Compiling : " $<
  32. TRACE_ASSEMBLE = @$(ECHO) "Assembling : " $<
  33. TRACE_LINK = @$(ECHO) "Linking : " $@
  34. TRACE_ARCHIVE = @$(ECHO) "Archiving : " $@
  35. MKDEP_OPT = -MMD -MT $@ -MF $@.d
  36. C_INCLUDE_OPT = $(foreach dir,$(sort $(INCDIRS) $(C_INCDIRS)),-I$(dir))
  37. CXX_INCLUDE_OPT = $(foreach dir,$(sort $(INCDIRS) $(CXX_INCDIRS)),-I$(dir))
  38. ASM_INCLUDE_OPT = $(foreach dir,$(sort $(INCDIRS) $(ASM_INCDIRS)),-I$(dir))
  39. COMMON_FLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=medany -fno-common
  40. CFLAGS += $(COMMON_FLAGS) $(C_INCLUDE_OPT) $(MKDEP_OPT)
  41. CXXFLAGS += $(COMMON_FLAGS) $(CXX_INCLUDE_OPT) $(MKDEP_OPT)
  42. ASMFLAGS += $(COMMON_FLAGS) $(ASM_INCLUDE_OPT) $(MKDEP_OPT)
  43. LIB_OPT = $(addprefix -L, $(sort $(LIBDIRS)))
  44. LDFLAGS += -T $(LINKER_SCRIPT) -e _txm_module_thread_shell_entry -nostartfiles -nodefaultlibs \
  45. -Wl,-Map=$(TARGET).map $(LIB_OPT) $(LDLIBS)
  46. ## Small Functions ##
  47. get_csrcs = $(foreach subdir, $(1), $(wildcard $(subdir)/*.c $(subdir)/*.C))
  48. get_asmsrcs = $(foreach subdir, $(1), $(wildcard $(subdir)/*.s $(subdir)/*.S))
  49. get_cxxsrcs = $(foreach subdir, $(1), $(wildcard $(subdir)/*.cpp $(subdir)/*.CPP))
  50. check_item_exist = $(strip $(if $(filter 1, $(words $(1))),$(filter $(1), $(sort $(2))),))
  51. TARGET_ELF = $(TARGET).elf
  52. ALL_CSRCS = $(sort $(C_SRCS) $(call get_csrcs, $(SRCDIRS) $(C_SRCDIRS)))
  53. ALL_CXXSRCS = $(sort $(CXX_SRCS) $(call get_cxxsrcs, $(SRCDIRS) $(CXX_SRCDIRS)))
  54. ALL_ASMSRCS = $(sort $(ASM_SRCS) $(call get_asmsrcs, $(SRCDIRS) $(ASM_SRCDIRS)))
  55. ALL_ASM_OBJS := $(ALL_ASMSRCS:=.o)
  56. ALL_C_OBJS := $(ALL_CSRCS:=.o)
  57. ALL_CXX_OBJS := $(ALL_CXXSRCS:=.o)
  58. ALL_OBJS += $(ALL_ASM_OBJS) $(ALL_C_OBJS) $(ALL_CXX_OBJS)
  59. ALL_DEPS := $(ALL_OBJS:=.d)
  60. CLEAN_OBJS += $(TARGET).elf $(TARGET).map $(TARGET).bin $(TARGET).dump $(TARGET).hex $(TARGET).verilog $(ALL_OBJS) $(ALL_DEPS) openocd.log
  61. REAL_CLEAN_OBJS = $(subst /,$(PS), $(CLEAN_OBJS))
  62. ifeq ($(OS),Windows_NT)
  63. SHELL:=$(ComSpec)
  64. endif
  65. # Default goal, placed before dependency includes
  66. all: info $(TARGET).elf
  67. # include dependency files of application
  68. ifneq ($(MAKECMDGOALS),clean)
  69. -include $(ALL_DEPS)
  70. endif
  71. .PHONY: all info help bin dasm upload run_openocd run_gdb clean debug library
  72. info:
  73. @$(ECHO) Current Configuration: RISCV_ARCH=$(RISCV_ARCH) RISCV_ABI=$(RISCV_ABI)
  74. $(TARGET).elf: $(ALL_OBJS)
  75. $(TRACE_LINK)
  76. $(Q)$(CC) $(CFLAGS) $(ALL_OBJS) -o $@ $(LDFLAGS)
  77. $(Q)$(SIZE) $@
  78. $(ALL_ASM_OBJS): %.o: % $(COMMON_PREREQS)
  79. $(TRACE_ASSEMBLE)
  80. $(Q)$(CC) $(ASMFLAGS) -c -o $@ $<
  81. $(ALL_C_OBJS): %.o: % $(COMMON_PREREQS)
  82. $(TRACE_COMPILE)
  83. $(Q)$(CC) $(CFLAGS) -c -o $@ $<
  84. $(ALL_CXX_OBJS): %.o: % $(COMMON_PREREQS)
  85. $(TRACE_COMPILE)
  86. $(Q)$(CXX) $(CXXFLAGS) -c -o $@ $<
  87. dasm: $(TARGET).elf
  88. $(OBJDUMP) -S -D $< > $(TARGET).dump
  89. $(OBJDUMP) -S -d $< > $(TARGET).dasm
  90. $(OBJCOPY) $< -O ihex $(TARGET).hex
  91. bin: $(TARGET).elf
  92. $(OBJCOPY) --dump-section .preamble=tmp_preamble.bin $<
  93. $(OBJCOPY) -j .text -j .got -j .rodata $< -O binary tmp_content.bin
  94. ifeq ($(OS),Windows_NT)
  95. # Use windows copy to merge two binary
  96. copy /BY tmp_preamble.bin + tmp_content.bin $(TARGET).bin
  97. else
  98. # Use linux cat to merge two binary
  99. cat tmp_preamble.bin > $(TARGET).bin
  100. cat tmp_content.bin >> $(TARGET).bin
  101. endif
  102. clean:
  103. -@$(ECHO) "Clean all build objects"
  104. -$(Q)$(RM) $(REAL_CLEAN_OBJS)