Makefile 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. ############################################################################
  2. # apps/Makefile
  3. #
  4. # Licensed to the Apache Software Foundation (ASF) under one or more
  5. # contributor license agreements. See the NOTICE file distributed with
  6. # this work for additional information regarding copyright ownership. The
  7. # ASF licenses this file to you under the Apache License, Version 2.0 (the
  8. # "License"); you may not use this file except in compliance with the
  9. # License. You may obtain a copy of the License at
  10. #
  11. # http://www.apache.org/licenses/LICENSE-2.0
  12. #
  13. # Unless required by applicable law or agreed to in writing, software
  14. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  16. # License for the specific language governing permissions and limitations
  17. # under the License.
  18. #
  19. ############################################################################
  20. export APPDIR = $(CURDIR)
  21. include $(APPDIR)/Make.defs
  22. # Symbol table for loadable apps.
  23. SYMTABSRC = symtab_apps.c
  24. SYMTABOBJ = $(SYMTABSRC:.c=$(OBJEXT))
  25. # Build targets
  26. # We first remove libapps.a before letting the other rules add objects to it
  27. # so that we ensure libapps.a does not contain objects from prior build
  28. all:
  29. $(RM) $(BIN)
  30. $(MAKE) $(BIN)
  31. .PHONY: import install dirlinks export .depdirs preconfig depend clean distclean
  32. .PHONY: context clean_context context_all register register_all
  33. .PRECIOUS: $(BIN)
  34. $(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),all)))
  35. $(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),install)))
  36. $(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),context)))
  37. $(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),register)))
  38. $(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),depend)))
  39. $(foreach SDIR, $(CLEANDIRS), $(eval $(call SDIR_template,$(SDIR),clean)))
  40. $(foreach SDIR, $(CLEANDIRS), $(eval $(call SDIR_template,$(SDIR),distclean)))
  41. $(MKDEP): $(TOPDIR)/tools/mkdeps.c
  42. $(HOSTCC) $(HOSTINCLUDES) $(HOSTCFLAGS) $< -o $@
  43. $(INCDIR): $(TOPDIR)/tools/incdir.c
  44. $(HOSTCC) $(HOSTINCLUDES) $(HOSTCFLAGS) $< -o $@
  45. IMPORT_TOOLS = $(MKDEP) $(INCDIR)
  46. # In the KERNEL build, we must build and install all of the modules. No
  47. # symbol table is needed
  48. ifeq ($(CONFIG_BUILD_KERNEL),y)
  49. install: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_install)
  50. .import: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
  51. $(Q) $(MAKE) install
  52. import: $(IMPORT_TOOLS)
  53. $(Q) $(MAKE) context TOPDIR="$(APPDIR)$(DELIM)import"
  54. $(Q) $(MAKE) register TOPDIR="$(APPDIR)$(DELIM)import"
  55. $(Q) $(MAKE) depend TOPDIR="$(APPDIR)$(DELIM)import"
  56. $(Q) $(MAKE) .import TOPDIR="$(APPDIR)$(DELIM)import"
  57. else
  58. # In FLAT and protected modes, the modules have already been created. A
  59. # symbol table is required.
  60. ifeq ($(CONFIG_BUILD_LOADABLE),)
  61. $(BIN): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
  62. $(Q) for app in ${CONFIGURED_APPS}; do \
  63. $(MAKE) -C "$${app}" archive ; \
  64. done
  65. else
  66. $(SYMTABSRC): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
  67. $(Q) for app in ${CONFIGURED_APPS}; do \
  68. $(MAKE) -C "$${app}" archive ; \
  69. done
  70. $(Q) $(MAKE) install
  71. $(Q) $(APPDIR)$(DELIM)tools$(DELIM)mksymtab.sh $(BINDIR) >$@.tmp
  72. $(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@)
  73. $(SYMTABOBJ): %$(OBJEXT): %.c
  74. $(call COMPILE, -fno-lto $<, $@)
  75. $(BIN): $(SYMTABOBJ)
  76. ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
  77. $(call ARCHIVE_ADD, "${shell cygpath -w $(BIN)}", $^)
  78. else
  79. $(call ARCHIVE_ADD, $(BIN), $^)
  80. endif
  81. endif # !CONFIG_BUILD_LOADABLE
  82. install: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_install)
  83. # Link nuttx
  84. HEAD_OBJ += $(wildcard $(APPDIR)$(DELIM)import$(DELIM)startup$(DELIM)*$(OBJEXT))
  85. HEAD_OBJ += $(wildcard $(APPDIR)$(DELIM)builtin$(DELIM)*$(OBJEXT))
  86. .import: $(BIN) install
  87. $(Q) echo "LD: nuttx"
  88. $(Q) $(LD) --entry=__start $(LDFLAGS) $(LDLIBPATH) $(EXTRA_LIBPATHS) \
  89. -L$(APPDIR)$(DELIM)import$(DELIM)scripts -T$(LDNAME) \
  90. -o nuttx$(EXEEXT) $(HEAD_OBJ) $(EXTRA_OBJS) $(LDSTARTGROUP) \
  91. $(BIN) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
  92. ifeq ($(CONFIG_INTELHEX_BINARY),y)
  93. $(Q) echo "CP: nuttx.hex"
  94. $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex nuttx$(EXEEXT) nuttx.hex
  95. endif
  96. ifeq ($(CONFIG_RAW_BINARY),y)
  97. $(Q) echo "CP: nuttx.bin"
  98. $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary nuttx$(EXEEXT) nuttx.bin
  99. endif
  100. $(call POSTBUILD, $(APPDIR))
  101. import: $(IMPORT_TOOLS)
  102. $(Q) $(MAKE) context TOPDIR="$(APPDIR)$(DELIM)import"
  103. $(Q) $(MAKE) register TOPDIR="$(APPDIR)$(DELIM)import"
  104. $(Q) $(MAKE) depend TOPDIR="$(APPDIR)$(DELIM)import"
  105. $(Q) $(MAKE) .import TOPDIR="$(APPDIR)$(DELIM)import"
  106. endif # CONFIG_BUILD_KERNEL
  107. dirlinks:
  108. $(Q) $(MAKE) -C platform dirlinks
  109. context_all: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_context)
  110. register_all: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_register)
  111. context:
  112. $(Q) $(MAKE) context_all
  113. $(Q) $(MAKE) register_all
  114. Kconfig:
  115. $(foreach SDIR, $(CONFIGDIRS), $(call MAKE_template,$(SDIR),preconfig))
  116. $(Q) $(MKKCONFIG)
  117. preconfig: Kconfig
  118. export:
  119. ifneq ($(EXPORTDIR),)
  120. ifneq ($(BUILTIN_REGISTRY),)
  121. $(Q) mkdir -p "${EXPORTDIR}"/registry || exit 1; \
  122. for f in "${BUILTIN_REGISTRY}"/*.bdat "${BUILTIN_REGISTRY}"/*.pdat ; do \
  123. [ -f "$${f}" ] && cp -f "$${f}" "${EXPORTDIR}"/registry ; \
  124. done
  125. endif
  126. endif
  127. .depdirs: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_depend)
  128. .depend: Makefile .depdirs
  129. $(Q) touch $@
  130. depend: .depend
  131. clean_context:
  132. $(Q) $(MAKE) -C platform clean_context
  133. $(Q) $(MAKE) -C builtin clean_context
  134. clean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_clean)
  135. $(call DELFILE, $(SYMTABSRC))
  136. $(call DELFILE, $(SYMTABOBJ))
  137. $(call DELFILE, $(BIN))
  138. $(call DELFILE, Kconfig)
  139. $(call DELDIR, $(BINDIR))
  140. $(call CLEAN)
  141. distclean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_distclean)
  142. ifeq ($(CONFIG_WINDOWS_NATIVE),y)
  143. $(Q) ( if exist external ( \
  144. echo ********************************************************" \
  145. echo * The external directory/link must be removed manually *" \
  146. echo ********************************************************" \
  147. )
  148. else
  149. $(Q) ( if [ -e external ]; then \
  150. echo "********************************************************"; \
  151. echo "* The external directory/link must be removed manually *"; \
  152. echo "********************************************************"; \
  153. fi; \
  154. )
  155. endif
  156. $(call DELFILE, .depend)
  157. $(call DELFILE, $(SYMTABSRC))
  158. $(call DELFILE, $(SYMTABOBJ))
  159. $(call DELFILE, $(BIN))
  160. $(call DELFILE, Kconfig)
  161. $(call DELDIR, $(BINDIR))
  162. $(call CLEAN)