Puzzle / Build /

makefile

  1. BUILD_SCRIPT_VERSION := 1.0.7
  2.  
  3. all : app_build
  4.  
  5. clean : app_clean
  6.  
  7. version : make_version
  8.  
  9.  
  10. BSLASH := \\#
  11. BSLASH2SLASH = $(subst $(BSLASH),/,$(1))
  12. REMOVE_TAIL = $(patsubst %/,%,$(1))
  13.  
  14. PROJ_ROOT := $(call BSLASH2SLASH,$(PROJPATH))
  15.  
  16. -include $(PROJ_ROOT)/project_def.prop
  17. -include basedef.mk
  18. -include tooldef.mk
  19. -include flags.mk
  20. -include prepost.mk
  21.  
  22. APPTYPE := $(type)
  23.  
  24. OBJ_OUTPUT := $(call BSLASH2SLASH,$(OUTPUT_DIR)/objs)
  25.  
  26. OS_NAME = $(shell $(UNAME))
  27.  
  28. #LOWER_APPNAME := $(shell echo translit($(APPNAME),[A-Z],[a-z])|$(M4))
  29. LOWER_APPNAME := $(shell echo $(APPNAME)|$(TR) [A-Z] [a-z])
  30.  
  31. ifeq ($(strip $(APPTYPE)),app)
  32. APPFILE := $(OUTPUT_DIR)/$(LOWER_APPNAME)
  33. endif
  34. ifeq ($(strip $(APPTYPE)),staticLib)
  35. APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).a
  36. endif
  37. ifeq ($(strip $(APPTYPE)),sharedLib)
  38. APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).so
  39. endif
  40.  
  41. ifneq ($(strip $(PLATFORM_INCS)),)
  42. PLATFORM_INCS_FILE := $(OBJ_OUTPUT)/platform_incs_file.inc
  43. endif
  44.  
  45. FIND_FILES = $(shell $(FIND) $(PROJ_ROOT)/$(dir $(1)) -type f -name $(notdir $(1)) -printf '$(dir $(1))%P ')
  46.  
  47. NORMAL_SRCS := $(filter-out %*.c %*.cpp,$(USER_SRCS))
  48. WIDLCARD_SRCS := $(filter %*.c %*.cpp,$(USER_SRCS))
  49. ALL_SRCS := $(NORMAL_SRCS) $(foreach var,$(WIDLCARD_SRCS),$(call FIND_FILES,$(var)))
  50.  
  51. C_SRCS := $(filter %.c,$(ALL_SRCS))
  52. CPP_SRCS := $(filter %.cpp,$(ALL_SRCS))
  53.  
  54. USER_EDCS := $(subst $(BSLASH),/,$(USER_EDCS))
  55. NORMAL_EDCS := $(filter-out %*.edc,$(USER_EDCS))
  56. WIDLCARD_EDCS := $(filter %*.edc,$(USER_EDCS))
  57. EDCS := $(NORMAL_EDCS) $(foreach var,$(WIDLCARD_EDCS),$(call FIND_FILES,$(var)))
  58.  
  59. NORMAL_POS := $(filter-out %*.po,$(USER_POS))
  60. WIDLCARD_POS := $(filter %*.po,$(USER_POS))
  61. POS := $(NORMAL_POS) $(foreach var,$(WIDLCARD_POS),$(call FIND_FILES,$(var)))
  62.  
  63. LIBPATHS := $(addprefix -L$(PROJ_ROOT)/,$(USER_LIB_DIRS)) \
  64. $(addprefix -L,$(USER_LIB_DIRS_ABS))
  65. LIBS += $(addprefix -l,$(USER_LIBS))
  66. UOBJS := $(addprefix $(PROJ_ROOT)/,$(USER_OBJS)) \
  67. $(USER_OBJS_ABS)
  68.  
  69. M_OPT = -MMD -MP -MF"$(@:%.o=%.d)"
  70.  
  71. FUNC_C2O = $(patsubst %.c,$(OBJ_OUTPUT)/%.o,$(1))
  72. FUNC_CPP2O = $(patsubst %.cpp,$(OBJ_OUTPUT)/%.o,$(1))
  73. FUNC_EDC2EDJ = $(patsubst %.edc,$(OUTPUT_DIR)/%.edj,$(1))
  74. FUNC_PO2MO = $(patsubst %.po,$(OUTPUT_DIR)/res/locale/%/LC_MESSAGES/$(LOWER_APPNAME).mo,$(notdir $(1)))
  75.  
  76.  
  77. C_OBJS := $(call FUNC_C2O,$(C_SRCS))
  78. CPP_OBJS := $(call FUNC_CPP2O,$(CPP_SRCS))
  79. OBJS := $(C_OBJS) $(CPP_OBJS)
  80. EDJ_FILES := $(call FUNC_EDC2EDJ,$(EDCS))
  81. MO_FILES := $(call FUNC_PO2MO,$(POS))
  82. DEPS := $(OBJS:.o=.d)
  83.  
  84.  
  85. ifneq ($(strip $(DEPS)),)
  86. -include $(DEPS)
  87. endif
  88.  
  89. ifeq ($(strip $(APPTYPE)),app)
  90. $(APPFILE) : $(OBJS) $(UOBJS)
  91. @echo ' Building target: $@'
  92. @echo ' Invoking: C/C++ Linker'
  93. @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
  94. $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) -Xlinker --as-needed $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -pie -lpthread -Xlinker -rpath="/home/developer/sdk_tools/lib" --sysroot="$(SYSROOT)" -Xlinker --version-script="$(PROJ_PATH)/.exportMap" -L"$(SBI_SYSROOT)/usr/lib" $(RS_LIBRARIES) -Xlinker -rpath="/opt/usr/apps/$(APPID)/lib" -Werror-implicit-function-declaration
  95. @echo ' Finished building target: $@'
  96. endif
  97. ifeq ($(strip $(APPTYPE)),staticLib)
  98. $(APPFILE) : $(OBJS) $(UOBJS)
  99. @echo ' Building target: $@'
  100. @echo ' Invoking: Archive utility'
  101. @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
  102. $(AR) -r "$(APPFILE)" $(OBJS) $(UOBJS) $(AR_FLAGS)
  103. @echo ' Finished building target: $@'
  104. endif
  105. ifeq ($(strip $(APPTYPE)),sharedLib)
  106. $(APPFILE) : $(OBJS) $(UOBJS)
  107. @echo ' Building target: $@'
  108. @echo ' Invoking: C/C++ Linker'
  109. @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
  110. $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) -Xlinker --as-needed $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -shared -lpthread --sysroot="$(SYSROOT)" -L"$(SYSROOT)/usr/lib" $(RS_LIBRARIES)
  111. @echo ' Finished building target: $@'
  112. endif
  113.  
  114.  
  115. ifneq ($(strip $(C_SRCS)),)
  116. CDEFS += $(addprefix -D,$(USER_DEFS))
  117. CDEFS += $(addprefix -U,$(USER_UNDEFS))
  118.  
  119. INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_INC_DIRS)) \
  120. $(addprefix -I,$(USER_INC_DIRS_ABS)) \
  121. $(addprefix -include$(PROJ_ROOT)/,$(USER_INC_FILES)) \
  122. $(addprefix -include,$(USER_INC_FILES_ABS))
  123.  
  124. $(C_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.c $(PLATFORM_INCS_FILE)
  125. @echo ' Building file: $<'
  126. @echo ' Invoking: C Compiler'
  127. @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
  128. ifeq ($(strip $(APPTYPE)),sharedLib)
  129. $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
  130. else
  131. $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
  132. endif
  133. @echo ' Finished building: $<'
  134. endif
  135.  
  136. ifneq ($(strip $(CPP_SRCS)),)
  137. CPPDEFS += $(addprefix -D,$(USER_CPP_DEFS))
  138. CPPDEFS += $(addprefix -U,$(USER_CPP_UNDEFS))
  139.  
  140. CPP_INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_CPP_INC_DIRS)) \
  141. $(addprefix -I,$(USER_CPP_INC_DIRS_ABS)) \
  142. $(addprefix -include$(PROJ_ROOT)/,$(USER_CPP_INC_FILES)) \
  143. $(addprefix -include,$(USER_CPP_INC_FILES_ABS))
  144. $(CPP_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.cpp $(PLATFORM_INCS_FILE)
  145. @echo ' Building file: $<'
  146. @echo ' Invoking: C++ Compiler'
  147. @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
  148. ifeq ($(strip $(APPTYPE)),sharedLib)
  149. $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
  150. else
  151. $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
  152. endif
  153. @echo ' Finished building: $<'
  154. endif
  155.  
  156.  
  157. $(OBJ_OUTPUT) :
  158. @echo ' Building directory: $@'
  159. @$(MKDIR) $(MKDIR_OP) $(OBJ_OUTPUT)
  160.  
  161. preproc : $(OBJ_OUTPUT)
  162. ifneq ($(strip $(PREBUILD_COMMAND)),)
  163. ifneq ($(strip $(PREBUILD_DESC)),)
  164. @echo $(PREBUILD_DESC)
  165. endif
  166. @echo $(shell $(PREBUILD_COMMAND))
  167. endif
  168.  
  169.  
  170. postproc :
  171. ifneq ($(strip $(POSTBUILD_COMMAND)),)
  172. ifneq ($(strip $(POSTBUILD_DESC)),)
  173. @echo $(POSTBUILD_DESC)
  174. endif
  175. @echo $(shell $(POSTBUILD_COMMAND))
  176. endif
  177.  
  178. ifneq ($(strip $(PLATFORM_INCS)),)
  179. $(PLATFORM_INCS_FILE) : $(OBJ_OUTPUT)
  180. @echo ' Building inc file: $@'
  181. ifneq ($(findstring Linux,$(OS_NAME)),)
  182. @echo $(PLATFORM_INCS) > $@
  183. else
  184. ifneq ($(findstring 3.82,$(MAKE_VERSION)),)
  185. $(file > $@,$(PLATFORM_INCS))
  186. else
  187. @echo $(PLATFORM_INCS) > $@
  188. endif
  189. endif
  190. endif
  191.  
  192. ALL_EDJ_FILES :=
  193.  
  194. define EDJ_PROC
  195. ALL_EDCS := $$(subst $(BSLASH),/,$$($(2)))
  196. NORMAL_EDCS := $$(filter-out %*.edc,$$(ALL_EDCS))
  197. WIDLCARD_EDCS := $$(filter %*.edc,$$(ALL_EDCS))
  198. EDCS := $$(NORMAL_EDCS) $$(foreach var_edc,$$(WIDLCARD_EDCS),$$(call FIND_FILES,$$(var_edc)))
  199.  
  200. ifneq ($$(strip $$(EDCS)),)
  201. EDJ_FILES := $$(call FUNC_EDC2EDJ,$$(EDCS))
  202.  
  203. ALL_EDJ_FILES += $$(EDJ_FILES)
  204.  
  205. EDC_$(1)_COMPILER_FLAGS := -id "$$(SDK_TOOLPATH)/enventor/share/enventor/images"
  206. EDC_$(1)_COMPILER_FLAGS += -sd "$$(SDK_TOOLPATH)/enventor/share/enventor/sounds"
  207. EDC_$(1)_COMPILER_FLAGS += -fd "$$(SDK_TOOLPATH)/enventor/share/enventor/fonts"
  208.  
  209. ifneq ($$(strip $(3)),)
  210. EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id $$(PROJ_PATH)/,$$($(3)))
  211. endif
  212. ifneq ($$(strip $(4)),)
  213. EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id ,$$($(4)))
  214. endif
  215. ifneq ($$(strip $(5)),)
  216. EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd $$(PROJ_PATH)/,$$($(5)))
  217. endif
  218. ifneq ($$(strip $(6)),)
  219. EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd ,$$($(6)))
  220. endif
  221. ifneq ($$(strip $(7)),)
  222. EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd $$(PROJ_PATH)/,$$($(7)))
  223. endif
  224. ifneq ($$(strip $(8)),)
  225. EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd ,$$($(8)))
  226. endif
  227.  
  228. $$(EDJ_FILES) : $$(OUTPUT_DIR)/%.edj : $$(PROJ_ROOT)/%.edc
  229. @echo ' Building file: $$<'
  230. @echo ' Invoking: EDC Resource Compiler'
  231. @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
  232. $$(EDJE_CC) $$(EDC_$(1)_COMPILER_FLAGS) $$(CDEFS) "$$<" "$$@"
  233. @echo ' Finished building: $$<'
  234. endif
  235. endef
  236.  
  237. # Global EDCs
  238. ifneq ($(strip $(USER_EDCS)),)
  239. $(eval $(call EDJ_PROC,,USER_EDCS,USER_EDCS_IMAGE_DIRS,USER_EDCS_IMAGE_DIRS_ABS,USER_EDCS_SOUND_DIRS,USER_EDCS_SOUND_DIRS_ABS,USER_EDCS_FONT_DIRS,USER_EDCS_FONT_DIRS_ABS))
  240. endif
  241.  
  242. # Individual EDCs
  243. ifneq ($(strip $(USER_EXT_EDC_KEYS)),)
  244. $(foreach var,$(USER_EXT_EDC_KEYS),$(eval $(call EDJ_PROC,$(var),USER_EXT_$(var)_EDCS,USER_EXT_$(var)_EDCS_IMAGE_DIRS,USER_EXT_$(var)_EDCS_IMAGE_DIRS_ABS,USER_EXT_$(var)_EDCS_SOUND_DIRS,USER_EXT_$(var)_EDCS_SOUND_DIRS_ABS,USER_EXT_$(var)_EDCS_FONT_DIRS,USER_EXT_$(var)_EDCS_FONT_DIRS_ABS)))
  245. endif
  246.  
  247.  
  248. ifneq ($(strip $(POS)),)
  249. define MO_RULE
  250. $(call FUNC_PO2MO,$(1)) : $(PROJ_ROOT)/$(1)
  251. @echo ' Building file: $$<'
  252. @echo ' Invoking: msgfmt String Formatter'
  253. @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
  254. $$(MSGFMT) -o $$@ $$<
  255. @echo ' Finished building: $$<'
  256. endef
  257.  
  258. $(foreach var,$(POS),$(eval $(call MO_RULE,$(var))))
  259. endif
  260.  
  261.  
  262. secondary-outputs : $(ALL_EDJ_FILES) $(MO_FILES)
  263.  
  264. -include appendix.mk
  265.  
  266.  
  267. app_build : preproc $(APPFILE) secondary-outputs postproc
  268.  
  269. app_clean :
  270. rm -f "$(APPFILE)"
  271. rm -rf "$(OUTPUT_DIR)"
  272.  
  273. make_version :
  274. @echo $(BUILD_SCRIPT_VERSION)