Makefile 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #************************************************************
  2. # RT-Thread RTOS makefile base on Andes N1068A core
  3. #
  4. # Mengxin Technology Co., Ltd.
  5. # Archer Chang <archer.zhang@wh-mx.com>
  6. # 2017.07.25 16:00
  7. #
  8. #************************************************************
  9. CROSS_COMPILE ?= nds32le-elf-
  10. SIZE_OUTPUTS = .PHONY.size
  11. CC := $(CROSS_COMPILE)gcc
  12. OBJCOPY := $(CROSS_COMPILE)objcopy
  13. AR := $(CROSS_COMPILE)ar
  14. AS := $(CROSS_COMPILE)as
  15. ifeq ($(DEBUG),1)
  16. OPTIM := -O0 -g2
  17. else
  18. OPTIM := -O2 -g0
  19. endif
  20. ROOT_PATH := .
  21. RTOS_PATH := $(ROOT_PATH)/../..
  22. ARCH_PATH := $(RTOS_PATH)/libcpu
  23. KERNEL_PATH := $(RTOS_PATH)/src
  24. COMPONENTS_PATH := $(RTOS_PATH)/components
  25. COMPONENTS_INIT_PATH := $(COMPONENTS_PATH)/init
  26. COMPONENTS_DRV_PATH := $(COMPONENTS_PATH)/drivers
  27. COMPONENTS_DRVSRC_PATH := $(COMPONENTS_DRV_PATH)/src
  28. COMPONENTS_DRVINC_PATH := $(COMPONENTS_DRV_PATH)/include
  29. COMPONENTS_DRVINC_DRV_PATH := $(COMPONENTS_DRVINC_PATH)/drivers
  30. BSP_PATH := $(RTOS_PATH)/bsp
  31. CLI_PATH := $(COMPONENTS_PATH)/finsh
  32. PLATFORM_PATH := $(BSP_PATH)/AE210P
  33. ARCH_SEL_PATH := $(ARCH_PATH)/nds32
  34. CONFIG_PATH := $(PLATFORM_PATH)
  35. BOARD_PATH := $(PLATFORM_PATH)/board
  36. #LIBC_PATH := $(PLATFORM_PATH)/libc
  37. LDSCRIPT := $(BOARD_PATH)/ae210p.ld
  38. CONFIG_H := $(CONFIG_PATH)/config.h
  39. PLATFORM_DEF := -DAE210P
  40. ARCH_INCLUDE_PATH := $(ARCH_PATH)/nds32
  41. HW_HAL_SRC := $(BOARD_PATH)/ae210p.c \
  42. $(PLATFORM_PATH)/board.c \
  43. $(ARCH_SEL_PATH)/cpuport.c \
  44. $(PLATFORM_PATH)/startup.c \
  45. $(PLATFORM_PATH)/application.c
  46. DRIVERS_PATH := $(PLATFORM_PATH)/driver
  47. OS_DEF := -DCONFIG_OS_RTTHREAD
  48. INCLUDE_PATH := \
  49. -I$(RTOS_PATH) \
  50. -I$(ARCH_INCLUDE_PATH) \
  51. -I$(RTOS_PATH)/include \
  52. -I${KERNEL_PATH} \
  53. -I$(CONFIG_PATH) \
  54. -I$(PLATFORM_PATH) \
  55. -I$(BOARD_PATH) \
  56. -I$(DRIVERS_PATH) \
  57. -I$(CLI_PATH) \
  58. -I$(COMPONENTS_DRVINC_PATH) \
  59. -I$(COMPONENTS_DRVINC_DRV_PATH) \
  60. -I$(COMPONENTS_INIT_PATH)
  61. SMALL_HEAP_DEF :=
  62. #Check GCC version
  63. VERSION := $(shell $(CC) --version | grep ^$(CC) | sed 's/^.* //g')
  64. GCC_VERSION := $(shell echo $(VERSION)| sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/' )
  65. # GCC version before 4.8.2 doesn't support -mcmodel
  66. ifneq ($(shell expr `echo $(GCC_VERSION)` \< 40802 ),1)
  67. CMODEL := -mcmodel=large
  68. endif
  69. CFLAGS := \
  70. $(INCLUDE_PATH) \
  71. -Wall \
  72. $(PLATFORM_DEF) \
  73. $(OS_DEF) \
  74. $(SMALL_HEAP_DEF) \
  75. -fno-builtin -fomit-frame-pointer -funroll-loops \
  76. -fno-strict-aliasing -ffunction-sections \
  77. $(CMODEL) \
  78. $(OPTIM) \
  79. $(OSC_DEF) \
  80. $(CFLAGS_EXT)
  81. LD_FLAGS := $(OPTIM) -fno-builtin -nostartfiles -static -Wl,--gc-sections $(CMODEL)
  82. AFLAGS := -fno-builtin
  83. # Add `-fno-delete-null-pointer-checks` flag if the compiler supports it.
  84. # GCC assumes that programs cannot safely dereference null pointers,
  85. # and that no code or data element resides there.
  86. # However, 0x0 is the vector table memory location, so the test must not be removed.
  87. ifeq ($(shell $(CC) -fno-delete-null-pointer-checks -E - 2>/dev/null >/dev/null </dev/null ; echo $$?),0)
  88. CFLAGS += -fno-delete-null-pointer-checks
  89. LD_FLAGS += -fno-delete-null-pointer-checks
  90. endif
  91. # Maybe necessary
  92. NO_IFC = y
  93. NO_EX9 = y
  94. ifeq ($(shell echo | $(CC) -E -dM - | grep __NDS32_EXT_IFC__ > /dev/null && echo IFC),IFC)
  95. ifeq ($(NO_IFC),y)
  96. CFLAGS += -mno-ifc -DCONFIG_NO_NDS32_EXT_IFC
  97. LD_FLAGS += -Wl,--mno-ifc
  98. endif
  99. else
  100. ifneq ($(NO_IFC),)
  101. $(error this toolchain do not support IFC extension)
  102. endif
  103. endif
  104. ifeq ($(shell echo | $(CC) -E -dM - | grep __NDS32_EXT_EX9__ > /dev/null && echo EX9),EX9)
  105. ifeq ($(NO_EX9),y)
  106. CFLAGS += -mno-ex9 -DCONFIG_NO_NDS32_EXT_EX9
  107. LD_FLAGS += -Wl,--mno-ex9
  108. endif
  109. else
  110. ifneq ($(NO_EX9),)
  111. $(error this toolchain do not support EX9 extension)
  112. endif
  113. endif
  114. ifeq ($(CACHE),1)
  115. CFLAGS += -DCONFIG_CACHE_SUPPORT
  116. endif
  117. # add INTC check
  118. ifeq ($(EXT_INTC),1)
  119. CFLAGS += -DCONFIG_EXT_INTC
  120. endif
  121. # HWZOL check
  122. ifeq ($(HWZOL),1)
  123. ifeq ($(shell echo | $(CC) -E -dM -mext-zol - | grep '\<__NDS32_EXT_ZOL__\>' > /dev/null && echo "ZOL"), ZOL)
  124. CFLAGS += -DCONFIG_HWZOL
  125. LD_FLAGS += -mext-zol
  126. else
  127. $(error this toolchain do not support ZOL extension)
  128. endif
  129. endif
  130. RTOS_SRC := \
  131. $(KERNEL_PATH)/clock.c \
  132. $(KERNEL_PATH)/device.c \
  133. $(KERNEL_PATH)/idle.c \
  134. $(KERNEL_PATH)/ipc.c \
  135. $(KERNEL_PATH)/irq.c \
  136. $(KERNEL_PATH)/kservice.c \
  137. $(KERNEL_PATH)/mem.c \
  138. $(KERNEL_PATH)/mempool.c \
  139. $(KERNEL_PATH)/scheduler.c \
  140. $(KERNEL_PATH)/thread.c \
  141. $(KERNEL_PATH)/timer.c \
  142. $(KERNEL_PATH)/object.c \
  143. NDS32_SRC := \
  144. $(PLATFORM_PATH)/reset.c \
  145. $(PLATFORM_PATH)/cache.c \
  146. $(HW_HAL_SRC) \
  147. BOOT_SRC := \
  148. $(PLATFORM_PATH)/start.S \
  149. $(ARCH_SEL_PATH)/context_gcc.S
  150. CLI_SRC :=
  151. ifeq ($(USING_CLI),1)
  152. CLI_SRC += $(KERNEL_PATH)/components.c \
  153. $(COMPONENTS_DRVSRC_PATH)/ringbuffer.c \
  154. $(COMPONENTS_DRVSRC_PATH)/completion.c \
  155. $(COMPONENTS_DRVSRC_PATH)/dataqueue.c \
  156. $(CLI_PATH)/cmd.c \
  157. $(CLI_PATH)/finsh_compiler.c \
  158. $(CLI_PATH)/finsh_error.c \
  159. $(CLI_PATH)/finsh_heap.c \
  160. $(CLI_PATH)/finsh_init.c \
  161. $(CLI_PATH)/finsh_node.c \
  162. $(CLI_PATH)/finsh_ops.c \
  163. $(CLI_PATH)/finsh_parser.c \
  164. $(CLI_PATH)/finsh_token.c \
  165. $(CLI_PATH)/finsh_var.c \
  166. $(CLI_PATH)/finsh_vm.c \
  167. $(CLI_PATH)/msh.c \
  168. $(CLI_PATH)/msh_cmd.c \
  169. $(CLI_PATH)/shell.c \
  170. $(CLI_PATH)/symbol.c
  171. endif
  172. #DRIVER_SRC := \
  173. ${UART_DRIVER_SRC} \
  174. ${LCD_DRIVER_SRC} \
  175. ${SD_DRIVER_SRC} \
  176. ${TOUCHSCREEN_DRIVER_SRC} \
  177. ${AC97_DRIVER_SRC} \
  178. ${DMA_DRIVER_SRC} \
  179. ${HAL_DRIVER_SRC} \
  180. DRIVER_SRC := \
  181. $(PLATFORM_PATH)/driver/uart/uart.c \
  182. $(PLATFORM_PATH)/driver/gpio/gpio.c \
  183. $(BOARD_PATH)/uart_dev.c \
  184. $(COMPONENTS_DRV_PATH)/serial/serial.c
  185. # $(PLATFORM_PATH)/driver/dma/dmad.c
  186. #LIBC_SRC := \
  187. # $(LIBC_PATH)/stdio/fgets.c \
  188. # $(LIBC_PATH)/stdio/fputs.c \
  189. # $(LIBC_PATH)/stdio/fprintf.c \
  190. # $(LIBC_PATH)/stdio/do_printf.c \
  191. # $(LIBC_PATH)/stdio/printf.c \
  192. # $(LIBC_PATH)/string/memcpy.c \
  193. # $(LIBC_PATH)/string/memmove.c \
  194. # $(LIBC_PATH)/string/memset.c \
  195. # $(LIBC_PATH)/string/strcat.c \
  196. # $(LIBC_PATH)/string/strcasecmp.c \
  197. # $(LIBC_PATH)/string/strcmp.c \
  198. # $(LIBC_PATH)/string/strcpy.c \
  199. # $(LIBC_PATH)/string/strdup.c \
  200. # $(LIBC_PATH)/string/strlen.c \
  201. # $(LIBC_PATH)/string/strstr.c \
  202. # $(LIBC_PATH)/string/strupr.c \
  203. # $(LIBC_PATH)/string/wchar.c \
  204. # $(LIBC_PATH)/stdlib/qsort.c
  205. #LIBC_FILE_SRC := \
  206. # $(LIBC_PATH)/stdio/file.c \
  207. #********************************************
  208. # Applications
  209. #********************************************
  210. APP_SRCS :=
  211. #################################################################
  212. # #
  213. # Source code to each application #
  214. # #
  215. #################################################################
  216. SRCS := \
  217. ${NDS32_SRC} \
  218. ${RTOS_SRC} \
  219. ${DRIVER_SRC} \
  220. ${CLI_SRC} \
  221. ${APP_SRCS} #\
  222. # ${LIBC_SRC}
  223. ALL_C_SRCS := ${SRCS}
  224. ALL_AS_SRCS += ${BOOT_SRC}
  225. # % can match to all the strings
  226. ALL_C_OBJS := $(patsubst %.S,%.o,$(patsubst %.c,%.o,${ALL_C_SRCS}))
  227. ALL_AS_OBJS := $(patsubst %.S,%.o,${ALL_AS_SRCS})
  228. OBJS = ${ALL_C_OBJS} ${ALL_AS_OBJS}
  229. .PHONY: all clean distclean
  230. all: ${APP}.elf ${APP}.bin $(SIZE_OUTPUTS)
  231. if test ! -d ./build; then \
  232. mkdir ./build; \
  233. fi
  234. mv ${APP}.elf ${APP}.bin ./build
  235. clean:
  236. $(RM) $(OBJS)
  237. $(RM) ./build/${APP}.elf ./build/${APP}.bin
  238. distclean: clean
  239. $(RM) -rf build/
  240. .SUFFIXES : .o .c .S
  241. .c.o : $(CONFIG_H)
  242. $(CC) -include $(CONFIG_H) -c $(CFLAGS) $< -o $@
  243. .S.o : $(CONFIG_H)
  244. $(CC) -include $(CONFIG_H) -c $(CFLAGS) $(AFLAGS) $< -o $@
  245. ${APP}.elf: $(CONFIG_H) ${KCONFIG_CONFIG} ${ALL_C_OBJS} ${ALL_AS_OBJS}
  246. @echo ' '
  247. $(CC) -T$(LDSCRIPT) ${ALL_C_OBJS} ${ALL_AS_OBJS} $(LD_FLAGS) $(LFLAGS_EXT) -o $@
  248. @echo ' '
  249. ${APP}.bin: ${APP}.elf
  250. # @echo ' '
  251. $(OBJCOPY) ${APP}.elf -O binary ${APP}.bin
  252. @echo ' '
  253. .PHONY.size:
  254. # @echo ' '
  255. $(CROSS_COMPILE)size ${APP}.elf | tee .PHONY.size
  256. @echo ' '
  257. .PHONY: all clean distclean .PHONY.size