recipe.mk 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. ################################################################################
  2. # \file recipe.mk
  3. # \version 1.0
  4. #
  5. # \brief
  6. # Set up a set of defines, includes, software components, linker script,
  7. # Pre and Post build steps and call a macro to create a specific ELF file.
  8. #
  9. ################################################################################
  10. # \copyright
  11. # Copyright 2018-2019 Cypress Semiconductor Corporation
  12. # SPDX-License-Identifier: Apache-2.0
  13. #
  14. # Licensed under the Apache License, Version 2.0 (the "License");
  15. # you may not use this file except in compliance with the License.
  16. # You may obtain a copy of the License at
  17. #
  18. # http://www.apache.org/licenses/LICENSE-2.0
  19. #
  20. # Unless required by applicable law or agreed to in writing, software
  21. # distributed under the License is distributed on an "AS IS" BASIS,
  22. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  23. # See the License for the specific language governing permissions and
  24. # limitations under the License.
  25. ################################################################################
  26. ifeq ($(WHICHFILE),true)
  27. $(info Processing $(lastword $(MAKEFILE_LIST)))
  28. endif
  29. #
  30. # linker script construction
  31. #
  32. ifeq ($(LINKER_SCRIPT),)
  33. LINKER_SCRIPT=$(CY_TARGET_DIR)/linker/TOOLCHAIN_$(TOOLCHAIN)/$(CY_LINKER_SCRIPT_NAME)_$(CY_LINKERSCRIPT_SUFFIX).$(CY_TOOLCHAIN_SUFFIX_LS)
  34. endif
  35. ifeq ($(shell if [ -f $(LINKER_SCRIPT) ]; then echo 1; else echo 0; fi;),0)
  36. $(error The specified linker script could not be found at $(LINKER_SCRIPT))
  37. endif
  38. ifeq ($(TOOLCHAIN),A_Clang)
  39. include $(LINKER_SCRIPT)
  40. else
  41. CY_RECIPE_LSFLAG=$(CY_TOOLCHAIN_LSFLAGS)$(LINKER_SCRIPT)
  42. endif
  43. #
  44. # Flags construction
  45. #
  46. CY_RECIPE_CFLAGS?=\
  47. $(CFLAGS)\
  48. $(CY_TOOLCHAIN_CFLAGS)
  49. CY_RECIPE_CXXFLAGS?=\
  50. $(CXXFLAGS)\
  51. $(CY_TOOLCHAIN_CXXFLAGS)
  52. CY_RECIPE_ASFLAGS?=\
  53. $(ASFLAGS)\
  54. $(CY_TOOLCHAIN_ASFLAGS)
  55. CY_RECIPE_ARFLAGS?=\
  56. $(CY_TOOLCHAIN_ARFLAGS)
  57. CY_RECIPE_LDFLAGS?=\
  58. $(LDFLAGS)\
  59. $(CY_TOOLCHAIN_LDFLAGS)\
  60. $(CY_RECIPE_LSFLAG)
  61. #
  62. # Defines construction
  63. #
  64. ifneq ($(DEFINES),)
  65. CY_RECIPE_USER_DEFINES=$(addprefix -D,$(DEFINES))
  66. endif
  67. ifneq ($(LIBNAME),)
  68. CY_RECIPE_USER_NAME=-DCY_LIBNAME_$(subst -,_,$(LIBNAME))
  69. else
  70. CY_RECIPE_USER_NAME=-DCY_APPNAME_$(subst -,_,$(APPNAME))
  71. endif
  72. CY_RECIPE_DEFINES=\
  73. $(CY_RECIPE_USER_DEFINES)\
  74. $(CY_RECIPE_USER_NAME)\
  75. -D$(subst -,_,$(DEVICE))\
  76. -DCY_TARGET_DEVICE=$(subst -,_,$(DEVICE))\
  77. -DTARGET_$(subst -,_,$(TARGET))\
  78. -DCY_TARGET_BOARD=$(subst -,_,$(TARGET))\
  79. $(foreach feature,$(CY_COMPONENT_LIST),-DCOMPONENT_$(subst -,_,$(feature)))\
  80. $(CY_TOOLCHAIN_DEBUG_FLAG)\
  81. $(CY_TOOLCHAIN_DEFINES)
  82. #
  83. # Includes construction
  84. #
  85. CY_RECIPE_INCLUDES=\
  86. $(addprefix -I,$(INCLUDES))\
  87. $(addprefix -I,$(CY_SEARCH_APP_INCLUDES))\
  88. $(addprefix -I,$(CY_TOOLCHAIN_INCLUDES))
  89. #
  90. # Sources construction
  91. #
  92. CY_RECIPE_SOURCE=$(CY_SEARCH_APP_SOURCE)
  93. #
  94. # Libraries construction
  95. #
  96. CY_RECIPE_LIBS=$(LDLIBS) $(CY_SEARCH_APP_LIBS)
  97. #
  98. # Generate source step
  99. #
  100. ifneq ($(CY_SEARCH_RESOURCE_FILES),)
  101. CY_RECIPE_RESOURCE_FILES=$(CY_SEARCH_RESOURCE_FILES)
  102. CY_RECIPE_GENERATED_FLAG=TRUE
  103. # Define the generated source file. Use := for better performance
  104. CY_RECIPE_GENERATED:=$(addprefix $(CY_GENERATED_DIR)/,$(addsuffix .$(CY_TOOLCHAIN_SUFFIX_C),\
  105. $(basename $(notdir $(subst .,_,$(CY_SEARCH_RESOURCE_FILES))))))
  106. CY_RECIPE_GENSRC=\
  107. bash --norc --noprofile\
  108. $(CY_INTERNAL_BASELIB_PATH)/make/scripts/genresources.bash\
  109. $(CY_INTERNAL_BASELIB_PATH)/make/scripts\
  110. $(CY_GENERATED_DIR)/resources.cyrsc\
  111. $(CY_INTERNAL_APP_PATH)\
  112. $(CY_GENERATED_DIR)\
  113. "MEM"
  114. endif
  115. #
  116. # Prebuild step
  117. #
  118. CY_RECIPE_PREBUILD?=
  119. #
  120. # Postbuild step
  121. #
  122. ifeq ($(LIBNAME),)
  123. ifeq ($(TOOLCHAIN),A_Clang)
  124. CY_RECIPE_POSTBUILD?=\
  125. $(CY_TOOLCHAIN_M2BIN)\
  126. --verbose --vect $(VECT_BASE_CM4) --text $(TEXT_BASE_CM4) --data $(RAM_BASE_CM4) --size $(TEXT_SIZE_CM4)\
  127. $(CY_CONFIG_DIR)/$(APPNAME).mach_o\
  128. $(CY_CONFIG_DIR)/$(APPNAME).bin
  129. else ifeq ($(TOOLCHAIN),ARM)
  130. ifeq ($(CY_COMPILER_PATH),)
  131. CY_RECIPE_POSTBUILD?=$(CY_COMPILER_ARM_DIR)/bin/fromelf --output $(CY_CONFIG_DIR)/$(APPNAME).hex --i32combined $(CY_CONFIG_DIR)/$(APPNAME).elf
  132. else
  133. CY_RECIPE_POSTBUILD?=$(CY_COMPILER_PATH)/bin/fromelf --output $(CY_CONFIG_DIR)/$(APPNAME).hex --i32combined $(CY_CONFIG_DIR)/$(APPNAME).elf
  134. endif
  135. else ifeq ($(TOOLCHAIN),IAR)
  136. CY_RECIPE_POSTBUILD?=$(CY_COMPILER_GCC_ARM_DIR)/bin/arm-none-eabi-objcopy -O ihex $(CY_CONFIG_DIR)/$(APPNAME).elf $(CY_CONFIG_DIR)/$(APPNAME).hex
  137. else ifeq ($(TOOLCHAIN),GCC_ARM)
  138. ifeq ($(CY_COMPILER_PATH),)
  139. CY_RECIPE_POSTBUILD?=$(CY_COMPILER_GCC_ARM_DIR)/bin/arm-none-eabi-objcopy -O ihex $(CY_CONFIG_DIR)/$(APPNAME).elf $(CY_CONFIG_DIR)/$(APPNAME).hex
  140. else
  141. CY_RECIPE_POSTBUILD?=$(CY_COMPILER_PATH)/bin/arm-none-eabi-objcopy -O ihex $(CY_CONFIG_DIR)/$(APPNAME).elf $(CY_CONFIG_DIR)/$(APPNAME).hex
  142. endif
  143. endif
  144. endif
  145. ################################################################################
  146. # Memory Consumption
  147. ################################################################################
  148. ifeq ($(TOOLCHAIN),A_Clang)
  149. CY_GEN_READELF=
  150. CY_MEMORY_CALC=
  151. else
  152. CY_GEN_READELF=$(CY_COMPILER_DIR)/bin/arm-none-eabi-readelf -Sl $(CY_CONFIG_DIR)/$(APPNAME).elf > $(CY_CONFIG_DIR)/$(APPNAME).readelf
  153. CY_MEM_CALC=\
  154. bash --norc --noprofile\
  155. $(CY_INTERNAL_BASELIB_PATH)/make/scripts/memcalc.bash\
  156. $(CY_CONFIG_DIR)/$(APPNAME).readelf\
  157. $(CY_MEMORY_FLASH)\
  158. $(CY_MEMORY_SRAM)\
  159. $(CY_START_FLASH)\
  160. $(CY_START_SRAM)
  161. endif
  162. memcalc: app
  163. ifneq ($(LIBNAME),)
  164. else
  165. @echo Calculating memory consumption: $(DEVICE) $(TOOLCHAIN) $(CY_TOOLCHAIN_OPTIMIZATION)
  166. @echo
  167. $(CY_NOISE)$(CY_GEN_READELF)
  168. $(CY_NOISE)$(CY_MEM_CALC)
  169. endif
  170. #
  171. # Identify the phony targets
  172. #
  173. .PHONY: memcalc