Makefile.win 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. ############################################################################
  2. # tools/Makefile.win
  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 SHELL=cmd
  21. export TOPDIR := ${shell echo %CD%}
  22. include $(TOPDIR)\Make.defs
  23. -include $(TOPDIR)\.version
  24. # In case .version file does not exist
  25. CONFIG_VERSION_STRING ?= "0.0.0"
  26. CONFIG_VERSION_MAJOR ?= 0
  27. CONFIG_VERSION_MINOR ?= 0
  28. CONFIG_VERSION_PATCH ?= 0
  29. CONFIG_VERSION_BUILD ?= "0"
  30. # Process architecture and board-specific directories
  31. ARCH_DIR = arch\$(CONFIG_ARCH)
  32. ARCH_SRC = $(ARCH_DIR)\src
  33. ARCH_INC = $(ARCH_DIR)\include
  34. # CONFIG_APPS_DIR can be over-ridden from the command line or in the .config file.
  35. # The default value of CONFIG_APPS_DIR is ..\apps. Ultimately, the application
  36. # will be built if APPDIR is defined. APPDIR will be defined if a directory containing
  37. # a Makefile is found at the path provided by CONFIG_APPS_DIR
  38. ifeq ($(CONFIG_APPS_DIR),)
  39. CONFIG_APPS_DIR = ..\apps
  40. endif
  41. APPDIR := $(realpath ${shell if exist "$(CONFIG_APPS_DIR)\Makefile" echo $(CONFIG_APPS_DIR)})
  42. # External code support
  43. # If external/ contains a Kconfig, we define the EXTERNALDIR variable to 'external'
  44. # so that main Kconfig can find it. Otherwise, we redirect it to a dummy Kconfig
  45. # This is due to kconfig inability to do conditional inclusion.
  46. EXTERNALDIR := $(shell if [ -r $(TOPDIR)\external\Kconfig ]; then echo 'external'; else echo 'dummy'; fi)
  47. # CONTEXTDIRS include directories that have special, one-time pre-build
  48. # requirements. Normally this includes things like auto-generation of
  49. # configuration specific files or creation of configurable symbolic links
  50. # CLEANDIRS are the directories that the clean target will executed in.
  51. # These are all directories that we know about.
  52. # CCLEANDIRS are directories that the clean_context target will execute in.
  53. # The clean_context target "undoes" the actions of the context target.
  54. # Only directories known to require cleaning are included.
  55. # KERNDEPDIRS are the directories in which we will build target dependencies.
  56. # If NuttX and applications are built separately (CONFIG_BUILD_PROTECTED or
  57. # CONFIG_BUILD_KERNEL), then this holds only the directories containing
  58. # kernel files.
  59. # USERDEPDIRS. If NuttX and applications are built separately (CONFIG_BUILD_PROTECTED),
  60. # then this holds only the directories containing user files. If
  61. # CONFIG_BUILD_KERNEL is selected, then applications are not build at all.
  62. include tools\Directories.mk
  63. #
  64. # Extra objects used in the final link.
  65. #
  66. # Pass 1 Incremental (relative) link objects should be put into the
  67. # processor-specific source directory (where other link objects will
  68. # be created). If the pass1 object is an archive, it could go anywhere.
  69. ifeq ($(CONFIG_BUILD_2PASS),y)
  70. EXTRA_OBJS += $(CONFIG_PASS1_OBJECT)
  71. endif
  72. # Library build selections
  73. #
  74. # NUTTXLIBS is the list of NuttX libraries that is passed to the
  75. # processor-specific Makefile to build the final NuttX target.
  76. # USERLIBS is the list of libraries used to build the final user-space
  77. # application
  78. # EXPORTLIBS is the list of libraries that should be exported by
  79. # 'make export' is
  80. ifeq ($(CONFIG_BUILD_PROTECTED),y)
  81. include tools\ProtectedLibs.mk
  82. else ifeq ($(CONFIG_BUILD_KERNEL),y)
  83. include tools\KernelLibs.mk
  84. else
  85. include tools\FlatLibs.mk
  86. endif
  87. # LINKLIBS derives from NUTTXLIBS and is simply the same list with the
  88. # subdirectory removed
  89. LINKLIBS = $(patsubst staging\\%,%,$(NUTTXLIBS))
  90. # Export tool definitions
  91. MKEXPORT = tools\mkexport.bat
  92. MKEXPORT_ARGS = -t "$(TOPDIR)"
  93. ifneq ($(CONFIG_BUILD_FLAT),y)
  94. MKEXPORT_ARGS += -u
  95. endif
  96. ifneq ($(APPDIR),)
  97. ifneq ($(shell [ -e $(APPDIR)/Makefile ] && echo yes),)
  98. MKEXPORT_ARGS += -a "$(APPDIR)"
  99. MKEXPORT_ARGS += -m "$(MAKE)"
  100. endif
  101. endif
  102. ifeq ($(V),2)
  103. MKEXPORT_ARGS += -d
  104. endif
  105. # This is the name of the final target (relative to the top level directory)
  106. BIN = nuttx$(EXEEXT)
  107. all: $(BIN)
  108. .PHONY: dirlinks context clean_context configenv config oldconfig menuconfig nconfig export subdir_clean clean subdir_distclean distclean apps_clean apps_distclean
  109. .PHONY: pass1 pass1dep
  110. .PHONY: pass2 pass2dep
  111. # Target used to copy include\nuttx\math.h. If CONFIG_ARCH_MATH_H is
  112. # defined, then there is an architecture specific math.h header file
  113. # that will be included indirectly from include\math.h. But first, we
  114. # have to copy math.h from include\nuttx\. to include\. Logic within
  115. # include\nuttx\math.h will hand the redirection to the architecture-
  116. # specific math.h header file.
  117. #
  118. # If the CONFIG_LIBM is defined, the Rhombus libm will be built at libc\math.
  119. # Definitions and prototypes for the Rhombus libm are also contained in
  120. # include\nuttx\math.h and so the file must also be copied in that case.
  121. #
  122. # If neither CONFIG_ARCH_MATH_H nor CONFIG_LIBM is defined, then no math.h
  123. # header file will be provided. You would want that behavior if (1) you
  124. # don't use libm, or (2) you want to use the math.h and libm provided
  125. # within your toolchain.
  126. ifeq ($(CONFIG_ARCH_MATH_H),y)
  127. NEED_MATH_H = y
  128. else ifeq ($(CONFIG_LIBM),y)
  129. NEED_MATH_H = y
  130. endif
  131. ifeq ($(NEED_MATH_H),y)
  132. include\math.h: include\nuttx\math.h .clean_context
  133. $(Q) cp -f include\nuttx\math.h include\math.h
  134. else
  135. include\math.h:
  136. endif
  137. # The float.h header file defines the properties of your floating point
  138. # implementation. It would always be best to use your toolchain's float.h
  139. # header file but if none is available, a default float.h header file will
  140. # provided if this option is selected. However there is no assurance that
  141. # the settings in this float.h are actually correct for your platform!
  142. ifeq ($(CONFIG_ARCH_FLOAT_H),y)
  143. include\float.h: include\nuttx\float.h .clean_context
  144. $(Q) cp -f include\nuttx\float.h include\float.h
  145. else
  146. include\float.h:
  147. endif
  148. # Target used to copy include\nuttx\stdarg.h. If CONFIG_ARCH_STDARG_H is
  149. # defined, then there is an architecture specific stdarg.h header file
  150. # that will be included indirectly from include\stdarg.h. But first, we
  151. # have to copy stdarg.h from include\nuttx\. to include\.
  152. ifeq ($(CONFIG_ARCH_STDARG_H),y)
  153. include\stdarg.h: include\nuttx\stdarg.h .clean_context
  154. $(Q) cp -f include\nuttx\stdarg.h include\stdarg.h
  155. else
  156. include\stdarg.h:
  157. endif
  158. # Target used to copy include\nuttx\setjmp.h. If CONFIG_ARCH_SETJMP_H is
  159. # defined, then there is an architecture specific setjmp.h header file
  160. # that will be included indirectly from include\setjmp.h. But first, we
  161. # have to copy setjmp.h from include\nuttx\. to include\.
  162. ifeq ($(CONFIG_ARCH_SETJMP_H),y)
  163. include\setjmp.h: include\nuttx\setjmp.h .clean_context
  164. $(Q) cp -f include\nuttx\setjmp.h include\setjmp.h
  165. else
  166. include\setjmp.h:
  167. endif
  168. # Targets used to build include\nuttx\version.h. Creation of version.h is
  169. # part of the overall NuttX configuration sequence. Notice that the
  170. # tools\mkversion tool is built and used to create include\nuttx\version.h
  171. tools\mkversion$(HOSTEXEEXT):
  172. $(Q) $(MAKE) -C tools -f Makefile.host mkversion$(HOSTEXEEXT)
  173. $(TOPDIR)\.version:
  174. $(Q) echo CONFIG_VERSION_STRING="0" > .version
  175. $(Q) echo CONFIG_VERSION_MAJOR=0 >> .version
  176. $(Q) echo CONFIG_VERSION_MINOR=0 >> .version
  177. $(Q) echo CONFIG_VERSION_PATCH=0 >> .version
  178. $(Q) echo CONFIG_VERSION_BUILD="0" >> .version
  179. include\nuttx\version.h: $(TOPDIR)\.version tools\mkversion$(HOSTEXEEXT) .clean_context
  180. $(Q) tools\mkversion$(HOSTEXEEXT) $(TOPDIR) > include\nuttx\version.h
  181. # Targets used to build include\nuttx\config.h. Creation of config.h is
  182. # part of the overall NuttX configuration sequence. Notice that the
  183. # tools\mkconfig tool is built and used to create include\nuttx\config.h
  184. tools\mkconfig$(HOSTEXEEXT):
  185. $(Q) $(MAKE) -C tools -f Makefile.host mkconfig$(HOSTEXEEXT)
  186. include\nuttx\config.h: $(TOPDIR)\.config tools\mkconfig$(HOSTEXEEXT) .clean_context
  187. $(Q) tools\mkconfig$(HOSTEXEEXT) $(TOPDIR) > include\nuttx\config.h
  188. # Targets used to create dependencies
  189. tools\mkdeps$(HOSTEXEEXT):
  190. $(Q) $(MAKE) -C tools -f Makefile.host mkdeps$(HOSTEXEEXT)
  191. # dirlinks, and helpers
  192. #
  193. # Directories links. Most of establishing the NuttX configuration involves
  194. # setting up symbolic links with 'generic' directory names to specific,
  195. # configured directories.
  196. # Link the arch\<arch-name>\include directory to include\arch
  197. include\arch: .clean_context
  198. @echo LN: include\arch to $(ARCH_DIR)\include
  199. $(Q) $(DIRLINK) $(TOPDIR)\$(ARCH_DIR)\include include\arch
  200. $(Q) touch $@
  201. # Link the boards\<arch>\<chip>\<board>\include directory to include\arch\board
  202. include\arch\board: include\arch
  203. @echo LN: include\arch\board to $(BOARD_DIR)\include
  204. $(Q) $(DIRLINK) $(BOARD_DIR)\include include\arch\board
  205. $(Q) touch $@
  206. ifneq ($(BOARD_COMMON_DIR),)
  207. # Link the boards\<arch>\<chip>\common dir to arch\<arch-name>\src\board
  208. # Link the boards\<arch>\<chip>\<board>\src dir to arch\<arch-name>\src\board\board
  209. $(ARCH_SRC)\board: .clean_context
  210. @echo "LN: $(ARCH_SRC)\board to $(BOARD_COMMON_DIR)"
  211. $(Q) $(DIRLINK) $(BOARD_COMMON_DIR) $(ARCH_SRC)\board
  212. @echo "LN: $(ARCH_SRC)\board\board to $(BOARD_DIR)\src"
  213. $(Q) $(DIRLINK) $(BOARD_DIR)\src $(ARCH_SRC)\board\board
  214. $(Q) touch $@
  215. else
  216. # Link the boards\<arch>\<chip>\<board>\src dir to arch\<arch-name>\src\board
  217. $(ARCH_SRC)\board: .clean_context
  218. @echo LN: $(ARCH_SRC)\board to $(BOARD_DIR)\src
  219. $(Q) $(DIRLINK) $(BOARD_DIR)\src $(ARCH_SRC)\board
  220. $(Q) touch $@
  221. endif
  222. # Link the boards\<arch>\<chip>\drivers dir to drivers\platform
  223. drivers\platform: .clean_context
  224. @echo LN: $(TOPDIR)\drivers\platform to $(BOARD_DRIVERS_DIR)
  225. $(Q) $(DIRLINK) $(BOARD_DRIVERS_DIR) $(TOPDIR)\drivers\platform
  226. $(Q) touch $@
  227. # Link arch\<arch-name>\src\<chip-name> to arch\<arch-name>\src\chip
  228. $(ARCH_SRC)\chip: .clean_context
  229. ifeq ($(CONFIG_ARCH_CHIP_CUSTOM),y)
  230. @echo LN: $(ARCH_SRC)\chip to $(CHIP_DIR)
  231. $(Q) $(DIRLINK) $(CHIP_DIR) $(ARCH_SRC)\chip
  232. else ifneq ($(CONFIG_ARCH_CHIP),)
  233. @echo LN: $(ARCH_SRC)\chip to $(ARCH_SRC)\$(CONFIG_ARCH_CHIP)
  234. $(Q) $(DIRLINK) $(TOPDIR)\$(ARCH_SRC)\$(CONFIG_ARCH_CHIP) $(ARCH_SRC)\chip
  235. endif
  236. $(Q) cp -f $(CHIP_KCONFIG) $(TOPDIR)\arch\dummy\Kconfig
  237. $(Q) touch $@
  238. # Link arch\<arch-name>\include\<chip-name> to arch\<arch-name>\include\chip
  239. include\arch\chip: include\arch
  240. ifeq ($(CONFIG_ARCH_CHIP_CUSTOM),y)
  241. @echo LN: include\arch\chip to $(CHIP_DIR)\include
  242. $(Q) $(DIRLINK) $(CHIP_DIR)\include include\arch\chip
  243. else ifneq ($(CONFIG_ARCH_CHIP),)
  244. @echo LN: include\arch\chip to $(ARCH_INC)\$(CONFIG_ARCH_CHIP)
  245. $(Q) $(DIRLINK) $(TOPDIR)\$(ARCH_INC)\$(CONFIG_ARCH_CHIP) include\arch\chip
  246. endif
  247. $(Q) touch $@
  248. dirlinks: include\arch include\arch\board include\arch\chip $(ARCH_SRC)\board $(ARCH_SRC)\chip drivers\platform
  249. $(Q) $(MAKE) -C libs/libxx dirlinks
  250. $(Q) $(MAKE) -C boards dirlinks
  251. $(Q) $(MAKE) -C openamp dirlinks
  252. $(Q) $(MAKE) -C $(CONFIG_APPS_DIR) dirlinks
  253. # context
  254. #
  255. # The context target is invoked on each target build to assure that NuttX is
  256. # properly configured. The basic configuration steps include creation of the
  257. # the config.h and version.h header files in the include\nuttx directory and
  258. # the establishment of symbolic links to configured directories.
  259. context: include\nuttx\config.h include\nuttx\version.h include\math.h include\float.h include\stdarg.h include\setjmp.h dirlinks
  260. $(Q) mkdir -p staging
  261. $(Q) for %%G in ($(CONTEXTDIRS)) do ( $(MAKE) -C %%G context )
  262. # clean_context
  263. #
  264. # This is part of the distclean target. It removes all of the header files
  265. # and symbolic links created by the context target.
  266. clean_context:
  267. $(Q) for %%G in ($(CCLEANDIRS)) do ( if exist %%G\Makefile $(MAKE) -C %%G clean_context )
  268. $(call DELFILE, include\nuttx\config.h)
  269. $(call DELFILE, include\nuttx\version.h)
  270. $(call DELFILE, include\float.h)
  271. $(call DELFILE, include\math.h)
  272. $(call DELFILE, include\stdarg.h)
  273. $(call DELFILE, include\setjmp.h)
  274. $(call DELFILE, arch\dummy\Kconfig)
  275. $(call DIRUNLINK, include\arch\board)
  276. $(call DIRUNLINK, include\arch\chip)
  277. $(call DIRUNLINK, include\arch)
  278. $(call DIRUNLINK, $(ARCH_SRC)\board\board)
  279. $(call DIRUNLINK, $(ARCH_SRC)\board)
  280. $(call DIRUNLINK, $(ARCH_SRC)\chip)
  281. $(call DIRUNLINK, $(TOPDIR)\drivers\platform)
  282. .clean_context: .config
  283. +$(Q) $(MAKE) clean_context
  284. $(Q) touch $@
  285. # Archive targets. The target build sequence will first create a series of
  286. # libraries, one per configured source file directory. The final NuttX
  287. # execution will then be built from those libraries. The following targets
  288. # build those libraries.
  289. # pass1 and pass2
  290. #
  291. # If the 2 pass build option is selected, then this pass1 target is
  292. # configured to built before the pass2 target. This pass1 target may, as an
  293. # example, build an extra link object (CONFIG_PASS1_OBJECT) which may be an
  294. # incremental (relative) link object, but could be a static library (archive);
  295. # some modification to this Makefile would be required if CONFIG_PASS1_OBJECT
  296. # is an archive. Exactly what is performed during pass1 or what it generates
  297. # is unknown to this makefile unless CONFIG_PASS1_OBJECT is defined.
  298. pass1: $(USERLIBS)
  299. pass2: $(NUTTXLIBS)
  300. # $(BIN)
  301. #
  302. # Create the final NuttX executable in a two pass build process. In the
  303. # normal case, all pass1 and pass2 dependencies are created then pass1
  304. # and pass2 targets are built. However, in some cases, you may need to build
  305. # pass1 dependencies and pass1 first, then build pass2 dependencies and pass2.
  306. # in that case, execute 'make pass1 pass2' from the command line.
  307. $(BIN): pass1 pass2
  308. ifeq ($(CONFIG_BUILD_2PASS),y)
  309. $(Q) if [ -z "$(CONFIG_PASS1_BUILDIR)" ]; then \
  310. echo "ERROR: CONFIG_PASS1_BUILDIR not defined"; \
  311. exit 1; \
  312. fi
  313. $(Q) if [ ! -d "$(CONFIG_PASS1_BUILDIR)" ]; then \
  314. echo "ERROR: CONFIG_PASS1_BUILDIR does not exist"; \
  315. exit 1; \
  316. fi
  317. $(Q) if [ ! -f "$(CONFIG_PASS1_BUILDIR)\Makefile" ]; then \
  318. echo "ERROR: No Makefile in CONFIG_PASS1_BUILDIR"; \
  319. exit 1; \
  320. fi
  321. $(Q) $(MAKE) -C $(CONFIG_PASS1_BUILDIR) LINKLIBS="$(LINKLIBS)" USERLIBS="$(USERLIBS)" "$(CONFIG_PASS1_TARGET)"
  322. endif
  323. $(Q) $(MAKE) -C $(ARCH_SRC) EXTRA_OBJS="$(EXTRA_OBJS)" LINKLIBS="$(LINKLIBS)" EXTRAFLAGS="$(KDEFINE) $(EXTRAFLAGS)" $(BIN)
  324. $(Q) echo $(BIN) > nuttx.manifest
  325. $(Q) printf '%s\n' *.map >> nuttx.manifest
  326. ifeq ($(CONFIG_INTELHEX_BINARY),y)
  327. @echo "CP: nuttx.hex"
  328. $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex $(BIN) nuttx.hex
  329. $(Q) echo nuttx.hex >> nuttx.manifest
  330. endif
  331. ifeq ($(CONFIG_MOTOROLA_SREC),y)
  332. @echo "CP: nuttx.srec"
  333. $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O srec $(BIN) nuttx.srec
  334. $(Q) echo nuttx.srec >> nuttx.manifest
  335. endif
  336. ifeq ($(CONFIG_RAW_BINARY),y)
  337. @echo "CP: nuttx.bin"
  338. $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary $(BIN) nuttx.bin
  339. $(Q) echo nuttx.bin >> nuttx.manifest
  340. endif
  341. $(call POSTBUILD, $(TOPDIR))
  342. # download
  343. #
  344. # This is a helper target that will rebuild NuttX and download it to the target
  345. # system in one step. The operation of this target depends completely upon
  346. # implementation of the DOWNLOAD command in the user Make.defs file. It will
  347. # generate an error an error if the DOWNLOAD command is not defined.
  348. download: $(BIN)
  349. $(call DOWNLOAD, $<)
  350. # pass1dep: Create pass1 build dependencies
  351. # pass2dep: Create pass2 build dependencies
  352. pass1dep: context tools\mkdeps$(HOSTEXEEXT)
  353. $(Q) for %%G in ($(USERDEPDIRS)) do ( $(MAKE) -C %%G depend )
  354. pass2dep: context tools\mkdeps$(HOSTEXEEXT)
  355. $(Q) for %%G in ($(KERNDEPDIRS)) do ( $(MAKE) -C %%G EXTRAFLAGS="$(KDEFINE) $(EXTRAFLAGS)" depend )
  356. # Configuration targets
  357. #
  358. # These targets depend on the kconfig-frontends packages. To use these, you
  359. # must first download and install the kconfig-frontends package from this
  360. # location: https://bitbucket.org/nuttx/tools/downloads/. See
  361. # misc\tools\README.txt for additional information.
  362. config: apps_preconfig
  363. $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf Kconfig
  364. oldconfig: apps_preconfig
  365. $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf --oldconfig Kconfig
  366. olddefconfig: apps_preconfig
  367. $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf --olddefconfig Kconfig
  368. menuconfig: configenv apps_preconfig
  369. $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set EXTERNALDIR=$(EXTERNALDIR)& kconfig-mconf Kconfig
  370. nconfig: apps_preconfig
  371. $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set EXTERNALDIR=$(EXTERNALDIR)& kconfig-nconf Kconfig
  372. savedefconfig: apps_preconfig
  373. $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf --savedefconfig defconfig.tmp Kconfig
  374. $(Q) kconfig-tweak --file defconfig.tmp -u CONFIG_APPS_DIR
  375. $(Q) grep "CONFIG_ARCH=" .config >> defconfig.tmp
  376. -$(Q) grep "^CONFIG_ARCH_CHIP_" .config >> defconfig.tmp
  377. -$(Q) grep "CONFIG_ARCH_CHIP=" .config >> defconfig.tmp
  378. -$(Q) grep "CONFIG_ARCH_BOARD=" .config >> defconfig.tmp
  379. -$(Q) grep "^CONFIG_ARCH_CUSTOM" .config >> defconfig.tmp
  380. -$(Q) grep "^CONFIG_ARCH_BOARD_CUSTOM" .config >> defconfig.tmp
  381. $(Q) export LC_ALL=C; cat defconfig.tmp | sort | uniq > sortedconfig.tmp
  382. $(Q) echo "#" > warning.tmp
  383. $(Q) echo "# This file is autogenerated: PLEASE DO NOT EDIT IT." >> warning.tmp
  384. $(Q) echo "#" >> warning.tmp
  385. $(Q) echo "# You can use \"make menuconfig\" to make any modifications to the installed .config file." >> warning.tmp
  386. $(Q) echo "# You can then do \"make savedefconfig\" to generate a new defconfig file that includes your" >> warning.tmp
  387. $(Q) echo "# modifications." >> warning.tmp
  388. $(Q) echo "#" >> warning.tmp
  389. $(Q) cat warning.tmp sortedconfig.tmp > defconfig
  390. $(Q) rm -f warning.tmp
  391. $(Q) rm -f defconfig.tmp
  392. $(Q) rm -f sortedconfig.tmp
  393. # export
  394. #
  395. # The export target will package the NuttX libraries and header files into
  396. # an exportable package. Caveats: (1) These needs some extension for the KERNEL
  397. # build; it needs to receive USERLIBS and create a libuser.a). (2) The logic
  398. # in tools\mkexport.sh only supports GCC and, for example, explicitly assumes
  399. # that the archiver is 'ar'
  400. export: ${NUTTXLIBS}
  401. $(Q) $(MKEXPORT) $(MKEXPORT_ARGS) -l "$(EXPORTLIBS)"
  402. # General housekeeping targets: dependencies, cleaning, etc.
  403. #
  404. # depend: Create both PASS1 and PASS2 dependencies
  405. # clean: Removes derived object files, archives, executables, and
  406. # temporary files, but retains the configuration and context
  407. # files and directories.
  408. # distclean: Does 'clean' then also removes all configuration and context
  409. # files. This essentially restores the directory structure
  410. # to its original, unconfigured stated.
  411. depend: pass1dep pass2dep
  412. $(foreach SDIR, $(CLEANDIRS), $(eval $(call SDIR_template,$(SDIR),clean)))
  413. subdir_clean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_clean)
  414. ifeq ($(CONFIG_BUILD_2PASS),y)
  415. $(Q) $(MAKE) -C $(CONFIG_PASS1_BUILDIR) clean
  416. endif
  417. clean: subdir_clean
  418. $(call DELFILE, $(BIN))
  419. $(call DELFILE, nuttx.*)
  420. $(call DELFILE, *.map)
  421. $(call DELFILE, _SAVED_APPS_config)
  422. $(call DELFILE, nuttx-export*)
  423. $(call DELFILE, nuttx_user*)
  424. $(call DELFILE, .gdbinit)
  425. $(call DELDIR, staging)
  426. $(call DELFILE, uImage)
  427. $(call CLEAN)
  428. $(foreach SDIR, $(CLEANDIRS), $(eval $(call SDIR_template,$(SDIR),distclean)))
  429. subdir_distclean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_distclean)
  430. distclean: clean subdir_distclean clean_context
  431. ifeq ($(CONFIG_BUILD_2PASS),y)
  432. $(Q) $(MAKE) -C $(CONFIG_PASS1_BUILDIR) distclean
  433. endif
  434. $(call DELFILE, Make.defs)
  435. $(call DELFILE, defconfig)
  436. $(call DELFILE, .config)
  437. $(call DELFILE, .config.old)
  438. $(call DELFILE, .clean_context)
  439. $(Q) $(MAKE) -C tools -f Makefile.host clean
  440. # Application housekeeping targets. The APPDIR variable refers to the user
  441. # application directory. A sample apps\ directory is included with NuttX,
  442. # however, this is not treated as part of NuttX and may be replaced with a
  443. # different application directory. For the most part, the application
  444. # directory is treated like any other build directory in this script. However,
  445. # as a convenience, the following targets are included to support housekeeping
  446. # functions in the user application directory from the NuttX build directory.
  447. #
  448. # apps_preconfig: Prepare applications to be configured
  449. # apps_clean: Perform the clean operation only in the user application
  450. # directory
  451. # apps_distclean: Perform the distclean operation only in the user application
  452. # directory.
  453. apps_preconfig: dirlinks
  454. ifneq ($(APPDIR),)
  455. $(Q) $(MAKE) -C "$(APPDIR)" preconfig
  456. endif
  457. apps_clean:
  458. ifneq ($(APPDIR),)
  459. $(Q) $(MAKE) -C "$(APPDIR)" clean
  460. endif
  461. apps_distclean:
  462. ifneq ($(APPDIR),)
  463. $(Q) $(MAKE) -C "$(APPDIR)" distclean
  464. endif