Makefile 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280
  1. # Makefile for buildroot
  2. #
  3. # Copyright (C) the Buildroot developers <buildroot@buildroot.org>
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. #
  19. #--------------------------------------------------------------
  20. # Just run 'make menuconfig', configure stuff, then run 'make'.
  21. # You shouldn't need to mess with anything beyond this point...
  22. #--------------------------------------------------------------
  23. # Delete default rules. We don't use them. This saves a bit of time.
  24. .SUFFIXES:
  25. # we want bash as shell
  26. SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
  27. else if [ -x /bin/bash ]; then echo /bin/bash; \
  28. else echo sh; fi; fi)
  29. # Set O variable if not already done on the command line;
  30. # or avoid confusing packages that can use the O=<dir> syntax for out-of-tree
  31. # build by preventing it from being forwarded to sub-make calls.
  32. ifneq ("$(origin O)", "command line")
  33. O := $(CURDIR)/output
  34. endif
  35. # Check if the current Buildroot execution meets all the pre-requisites.
  36. # If they are not met, Buildroot will actually do its job in a sub-make meeting
  37. # its pre-requisites, which are:
  38. # 1- Permissive enough umask:
  39. # Wrong or too restrictive umask will prevent Buildroot and packages from
  40. # creating files and directories.
  41. # 2- Absolute canonical CWD (i.e. $(CURDIR)):
  42. # Otherwise, some packages will use CWD as-is, others will compute its
  43. # absolute canonical path. This makes harder tracking and fixing host
  44. # machine path leaks.
  45. # 3- Absolute canonical output location (i.e. $(O)):
  46. # For the same reason as the one for CWD.
  47. # Remove the trailing '/.' from $(O) as it can be added by the makefile wrapper
  48. # installed in the $(O) directory.
  49. # Also remove the trailing '/' the user can set when on the command line.
  50. override O := $(patsubst %/,%,$(patsubst %.,%,$(O)))
  51. # Make sure $(O) actually exists before calling realpath on it; this is to
  52. # avoid empty CANONICAL_O in case on non-existing entry.
  53. CANONICAL_O := $(shell mkdir -p $(O) >/dev/null 2>&1)$(realpath $(O))
  54. # gcc fails to build when the srcdir contains a '@'
  55. ifneq ($(findstring @,$(CANONICAL_O)),)
  56. $(error The build directory can not contain a '@')
  57. endif
  58. CANONICAL_CURDIR = $(realpath $(CURDIR))
  59. REQ_UMASK = 0022
  60. CUR_UMASK := $(shell umask)
  61. # Make sure O= is passed (with its absolute canonical path) everywhere the
  62. # toplevel makefile is called back.
  63. EXTRAMAKEARGS := O=$(CANONICAL_O)
  64. # Check Buildroot execution pre-requisites here.
  65. ifneq ($(CUR_UMASK):$(CURDIR):$(O),$(REQ_UMASK):$(CANONICAL_CURDIR):$(CANONICAL_O))
  66. .PHONY: _all $(MAKECMDGOALS)
  67. $(MAKECMDGOALS): _all
  68. @:
  69. _all:
  70. @umask $(REQ_UMASK) && \
  71. $(MAKE) -C $(CANONICAL_CURDIR) --no-print-directory \
  72. BR_ORIG_UMASK=$(CUR_UMASK) \
  73. $(MAKECMDGOALS) $(EXTRAMAKEARGS)
  74. else # umask / $(CURDIR) / $(O)
  75. # This is our default rule, so must come first
  76. all:
  77. .PHONY: all
  78. # Set and export the version string
  79. export BR2_VERSION := 2025.08-git
  80. # Actual time the release is cut (for reproducible builds)
  81. BR2_VERSION_EPOCH = 1749500000
  82. # Save running make version since it's clobbered by the make package
  83. RUNNING_MAKE_VERSION := $(MAKE_VERSION)
  84. # Check for minimal make version (note: this check will break at make 10.x)
  85. MIN_MAKE_VERSION = 3.81
  86. ifneq ($(firstword $(sort $(RUNNING_MAKE_VERSION) $(MIN_MAKE_VERSION))),$(MIN_MAKE_VERSION))
  87. $(error You have make '$(RUNNING_MAKE_VERSION)' installed. GNU make >= $(MIN_MAKE_VERSION) is required)
  88. endif
  89. # absolute path
  90. TOPDIR := $(CURDIR)
  91. CONFIG_CONFIG_IN = Config.in
  92. CONFIG = support/kconfig
  93. DATE := $(shell date +%Y%m%d)
  94. # Compute the full local version string so packages can use it as-is
  95. # Need to export it, so it can be got from environment in children (eg. mconf)
  96. BR2_LOCALVERSION := $(shell $(TOPDIR)/support/scripts/setlocalversion)
  97. ifeq ($(BR2_LOCALVERSION),)
  98. export BR2_VERSION_FULL := $(BR2_VERSION)
  99. else
  100. export BR2_VERSION_FULL := $(BR2_LOCALVERSION)
  101. endif
  102. # List of targets and target patterns for which .config doesn't need to be read in
  103. noconfig_targets := menuconfig nconfig gconfig xconfig config oldconfig randconfig \
  104. defconfig %_defconfig allyesconfig allnoconfig alldefconfig syncconfig release \
  105. randpackageconfig allyespackageconfig allnopackageconfig \
  106. print-version olddefconfig distclean manual manual-% check-package
  107. # Some global targets do not trigger a build, but are used to collect
  108. # metadata, or do various checks. When such targets are triggered,
  109. # some packages should not do their configuration sanity
  110. # checks. Provide them a BR_BUILDING variable set to 'y' when we're
  111. # actually building and they should do their sanity checks.
  112. #
  113. # We're building in two situations: when MAKECMDGOALS is empty
  114. # (default target is to build), or when MAKECMDGOALS contains
  115. # something else than one of the nobuild_targets.
  116. nobuild_targets := source %-source \
  117. legal-info %-legal-info external-deps _external-deps \
  118. clean distclean help show-targets graph-depends \
  119. %-graph-depends %-show-depends %-show-version \
  120. graph-build graph-size list-defconfigs \
  121. savedefconfig update-defconfig printvars show-vars
  122. ifeq ($(MAKECMDGOALS),)
  123. BR_BUILDING = y
  124. else ifneq ($(filter-out $(nobuild_targets),$(MAKECMDGOALS)),)
  125. BR_BUILDING = y
  126. endif
  127. # We call make recursively to build packages. The command-line overrides that
  128. # are passed to Buildroot don't apply to those package build systems. In
  129. # particular, we don't want to pass down the O=<dir> option for out-of-tree
  130. # builds, because the value specified on the command line will not be correct
  131. # for packages.
  132. MAKEOVERRIDES :=
  133. # Include some helper macros and variables
  134. include support/misc/utils.mk
  135. # Set variables related to in-tree or out-of-tree build.
  136. # Here, both $(O) and $(CURDIR) are absolute canonical paths.
  137. ifeq ($(O),$(CURDIR)/output)
  138. CONFIG_DIR := $(CURDIR)
  139. NEED_WRAPPER =
  140. else
  141. CONFIG_DIR := $(O)
  142. NEED_WRAPPER = y
  143. endif
  144. # bash prints the name of the directory on 'cd <dir>' if CDPATH is
  145. # set, so unset it here to not cause problems. Notice that the export
  146. # line doesn't affect the environment of $(shell ..) calls.
  147. export CDPATH :=
  148. BASE_DIR := $(CANONICAL_O)
  149. $(if $(BASE_DIR),, $(error output directory "$(O)" does not exist))
  150. # Handling of BR2_EXTERNAL.
  151. #
  152. # The value of BR2_EXTERNAL is stored in .br-external in the output directory.
  153. # The location of the external.mk makefile fragments is computed in that file.
  154. # On subsequent invocations of make, this file is read in. BR2_EXTERNAL can
  155. # still be overridden on the command line, therefore the file is re-created
  156. # every time make is run.
  157. BR2_EXTERNAL_FILE = $(BASE_DIR)/.br2-external.mk
  158. -include $(BR2_EXTERNAL_FILE)
  159. $(shell support/scripts/br2-external -d '$(BASE_DIR)' $(BR2_EXTERNAL))
  160. BR2_EXTERNAL_ERROR =
  161. include $(BR2_EXTERNAL_FILE)
  162. ifneq ($(BR2_EXTERNAL_ERROR),)
  163. $(error $(BR2_EXTERNAL_ERROR))
  164. endif
  165. # Workaround bug in make-4.3: https://savannah.gnu.org/bugs/?57676
  166. $(BASE_DIR)/.br2-external.mk:;
  167. # To make sure that the environment variable overrides the .config option,
  168. # set this before including .config.
  169. ifneq ($(BR2_DL_DIR),)
  170. DL_DIR := $(BR2_DL_DIR)
  171. endif
  172. ifneq ($(BR2_CCACHE_DIR),)
  173. BR_CACHE_DIR := $(BR2_CCACHE_DIR)
  174. endif
  175. # Need that early, before we scan packages
  176. # Avoids doing the $(or...) everytime
  177. BR_GRAPH_OUT := $(or $(BR2_GRAPH_OUT),pdf)
  178. BUILD_DIR := $(BASE_DIR)/build
  179. BINARIES_DIR := $(BASE_DIR)/images
  180. BASE_TARGET_DIR := $(BASE_DIR)/target
  181. PER_PACKAGE_DIR := $(BASE_DIR)/per-package
  182. # initial definition so that 'make clean' works for most users, even without
  183. # .config. HOST_DIR will be overwritten later when .config is included.
  184. HOST_DIR := $(BASE_DIR)/host
  185. GRAPHS_DIR := $(BASE_DIR)/graphs
  186. LEGAL_INFO_DIR = $(BASE_DIR)/legal-info
  187. REDIST_SOURCES_DIR_TARGET = $(LEGAL_INFO_DIR)/sources
  188. REDIST_SOURCES_DIR_HOST = $(LEGAL_INFO_DIR)/host-sources
  189. LICENSE_FILES_DIR_TARGET = $(LEGAL_INFO_DIR)/licenses
  190. LICENSE_FILES_DIR_HOST = $(LEGAL_INFO_DIR)/host-licenses
  191. LEGAL_MANIFEST_CSV_TARGET = $(LEGAL_INFO_DIR)/manifest.csv
  192. LEGAL_MANIFEST_CSV_HOST = $(LEGAL_INFO_DIR)/host-manifest.csv
  193. LEGAL_WARNINGS = $(LEGAL_INFO_DIR)/.warnings
  194. LEGAL_REPORT = $(LEGAL_INFO_DIR)/README
  195. BR2_CONFIG = $(CONFIG_DIR)/.config
  196. # Pull in the user's configuration file
  197. ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
  198. -include $(BR2_CONFIG)
  199. endif
  200. ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),)
  201. # Disable top-level parallel build if per-package directories is not
  202. # used. Indeed, per-package directories is necessary to guarantee
  203. # determinism and reproducibility with top-level parallel build.
  204. .NOTPARALLEL:
  205. endif
  206. # timezone and locale may affect build output
  207. ifeq ($(BR2_REPRODUCIBLE),y)
  208. export TZ = UTC
  209. export LANG = C
  210. export LC_ALL = C
  211. endif
  212. # To put more focus on warnings, be less verbose as default
  213. # Use 'make V=1' to see the full commands
  214. ifeq ("$(origin V)", "command line")
  215. KBUILD_VERBOSE = $(V)
  216. endif
  217. ifndef KBUILD_VERBOSE
  218. KBUILD_VERBOSE = 0
  219. endif
  220. ifeq ($(KBUILD_VERBOSE),1)
  221. Q =
  222. ifndef VERBOSE
  223. VERBOSE = 1
  224. endif
  225. export VERBOSE
  226. else
  227. Q = @
  228. endif
  229. # kconfig uses CONFIG_SHELL
  230. CONFIG_SHELL := $(SHELL)
  231. export SHELL CONFIG_SHELL Q KBUILD_VERBOSE
  232. ifndef HOSTAR
  233. HOSTAR := ar
  234. endif
  235. ifndef HOSTAS
  236. HOSTAS := as
  237. endif
  238. ifndef HOSTCC
  239. HOSTCC := gcc
  240. HOSTCC := $(shell which $(HOSTCC) || type -p $(HOSTCC) || echo gcc)
  241. endif
  242. ifndef HOSTCC_NOCCACHE
  243. HOSTCC_NOCCACHE := $(HOSTCC)
  244. endif
  245. ifndef HOSTCXX
  246. HOSTCXX := g++
  247. HOSTCXX := $(shell which $(HOSTCXX) || type -p $(HOSTCXX) || echo g++)
  248. endif
  249. ifndef HOSTCXX_NOCCACHE
  250. HOSTCXX_NOCCACHE := $(HOSTCXX)
  251. endif
  252. ifndef HOSTCPP
  253. HOSTCPP := cpp
  254. endif
  255. ifndef HOSTLD
  256. HOSTLD := ld
  257. endif
  258. ifndef HOSTLN
  259. HOSTLN := ln
  260. endif
  261. ifndef HOSTNM
  262. HOSTNM := nm
  263. endif
  264. ifndef HOSTOBJCOPY
  265. HOSTOBJCOPY := objcopy
  266. endif
  267. ifndef HOSTRANLIB
  268. HOSTRANLIB := ranlib
  269. endif
  270. HOSTAR := $(shell which $(HOSTAR) || type -p $(HOSTAR) || echo ar)
  271. HOSTAS := $(shell which $(HOSTAS) || type -p $(HOSTAS) || echo as)
  272. HOSTCPP := $(shell which $(HOSTCPP) || type -p $(HOSTCPP) || echo cpp)
  273. HOSTLD := $(shell which $(HOSTLD) || type -p $(HOSTLD) || echo ld)
  274. HOSTLN := $(shell which $(HOSTLN) || type -p $(HOSTLN) || echo ln)
  275. HOSTNM := $(shell which $(HOSTNM) || type -p $(HOSTNM) || echo nm)
  276. HOSTOBJCOPY := $(shell which $(HOSTOBJCOPY) || type -p $(HOSTOBJCOPY) || echo objcopy)
  277. HOSTRANLIB := $(shell which $(HOSTRANLIB) || type -p $(HOSTRANLIB) || echo ranlib)
  278. SED := $(shell which sed || type -p sed) -i -e
  279. export HOSTAR HOSTAS HOSTCC HOSTCXX HOSTLD
  280. export HOSTCC_NOCCACHE HOSTCXX_NOCCACHE
  281. # Determine the userland we are running on.
  282. #
  283. # Note that, despite its name, we are not interested in the actual
  284. # architecture name. This is mostly used to determine whether some
  285. # of the binary tools (e.g. pre-built external toolchains) can run
  286. # on the current host. So we need to know if the userland we're
  287. # running on can actually run those toolchains.
  288. #
  289. # For example, a 64-bit prebuilt toolchain will not run on a 64-bit
  290. # kernel if the userland is 32-bit (e.g. in a chroot for example).
  291. #
  292. # So, we extract the first part of the tuple the host gcc was
  293. # configured to generate code for; we assume this is our userland.
  294. #
  295. export HOSTARCH := $(shell LC_ALL=C $(HOSTCC_NOCCACHE) -v 2>&1 | \
  296. sed -e '/^Target: \([^-]*\).*/!d' \
  297. -e 's//\1/' \
  298. -e 's/i.86/x86/' \
  299. -e 's/sun4u/sparc64/' \
  300. -e 's/arm.*/arm/' \
  301. -e 's/sa110/arm/' \
  302. -e 's/ppc64/powerpc64/' \
  303. -e 's/ppc/powerpc/' \
  304. -e 's/macppc/powerpc/' \
  305. -e 's/sh.*/sh/' )
  306. # When adding a new host gcc version in Config.in,
  307. # update the HOSTCC_MAX_VERSION variable:
  308. HOSTCC_MAX_VERSION := 15
  309. HOSTCC_VERSION := $(shell V=$$($(HOSTCC_NOCCACHE) --version | \
  310. sed -n -r 's/^.* ([0-9]*)\.([0-9]*)\.([0-9]*)[ ]*.*/\1 \2/p'); \
  311. [ "$${V%% *}" -le $(HOSTCC_MAX_VERSION) ] || V=$(HOSTCC_MAX_VERSION); \
  312. printf "%s" "$${V}")
  313. # For gcc >= 5.x, we only need the major version.
  314. ifneq ($(firstword $(HOSTCC_VERSION)),4)
  315. HOSTCC_VERSION := $(firstword $(HOSTCC_VERSION))
  316. endif
  317. ifeq ($(BR2_NEEDS_HOST_UTF8_LOCALE),y)
  318. # First, we try to use the user's configured locale (as that's the
  319. # language they'd expect messages to be displayed), then we favour
  320. # a non language-specific locale like C.UTF-8 if one is available,
  321. # so we sort with the C locale to get it at the top.
  322. # This is guaranteed to not be empty, because of the check in
  323. # support/dependencies/dependencies.sh
  324. HOST_UTF8_LOCALE := $(shell \
  325. ( echo $${LC_ALL:-$${LC_MESSAGES:-$${LANG}}}; \
  326. locale -a 2>/dev/null | LC_ALL=C sort \
  327. ) \
  328. | grep -i -E 'utf-?8$$' \
  329. | head -n 1)
  330. HOST_UTF8_LOCALE_ENV := LC_ALL=$(HOST_UTF8_LOCALE)
  331. endif
  332. # Make sure pkg-config doesn't look outside the buildroot tree
  333. HOST_PKG_CONFIG_PATH := $(PKG_CONFIG_PATH)
  334. unexport PKG_CONFIG_PATH
  335. unexport PKG_CONFIG_SYSROOT_DIR
  336. unexport PKG_CONFIG_LIBDIR
  337. # Having DESTDIR set in the environment confuses the installation
  338. # steps of some packages.
  339. unexport DESTDIR
  340. # Causes breakage with packages that needs host-ruby
  341. unexport RUBYOPT
  342. # Compilation of perl-related packages will fail otherwise
  343. unexport PERL_MM_OPT
  344. include package/pkg-utils.mk
  345. include package/doc-asciidoc.mk
  346. ifeq ($(BR2_HAVE_DOT_CONFIG),y)
  347. ################################################################################
  348. #
  349. # Hide troublesome environment variables from sub processes
  350. #
  351. ################################################################################
  352. unexport AR
  353. unexport ARCH
  354. unexport CC
  355. unexport CFLAGS
  356. unexport CONFIG_SITE
  357. unexport CPP
  358. unexport CROSS_COMPILE
  359. unexport CXX
  360. unexport CXXFLAGS
  361. unexport DEVICE_TREE
  362. unexport GCC_COLORS
  363. unexport GREP_OPTIONS
  364. unexport LD
  365. unexport MACHINE
  366. unexport O
  367. unexport OS
  368. unexport PLATFORM
  369. unexport QMAKESPEC
  370. unexport RANLIB
  371. unexport TAR_OPTIONS
  372. unexport TERMINFO
  373. unexport TOPDIR
  374. GNU_HOST_NAME := $(shell support/gnuconfig/config.guess)
  375. PACKAGES :=
  376. PACKAGES_ALL :=
  377. # silent mode requested?
  378. QUIET := $(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),-q)
  379. # Strip off the annoying quoting
  380. ARCH := $(call qstrip,$(BR2_ARCH))
  381. NORMALIZED_ARCH := $(call qstrip,$(BR2_NORMALIZED_ARCH))
  382. KERNEL_ARCH := $(call qstrip,$(BR2_NORMALIZED_ARCH))
  383. ZCAT := $(call qstrip,$(BR2_ZCAT))
  384. BZCAT := $(call qstrip,$(BR2_BZCAT))
  385. XZCAT := $(call qstrip,$(BR2_XZCAT))
  386. LZCAT := $(call qstrip,$(BR2_LZCAT))
  387. ZSTDCAT := $(call qstrip,$(BR2_ZSTDCAT))
  388. TAR_OPTIONS = $(call qstrip,$(BR2_TAR_OPTIONS)) -xf
  389. ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y)
  390. HOST_DIR = $(if $(PKG),$(PER_PACKAGE_DIR)/$($(PKG)_NAME)/host,$(call qstrip,$(BR2_HOST_DIR)))
  391. TARGET_DIR = $(if $(ROOTFS),$(ROOTFS_$(ROOTFS)_TARGET_DIR),$(if $(PKG),$(PER_PACKAGE_DIR)/$($(PKG)_NAME)/target,$(BASE_TARGET_DIR)))
  392. else
  393. HOST_DIR := $(call qstrip,$(BR2_HOST_DIR))
  394. TARGET_DIR = $(if $(ROOTFS),$(ROOTFS_$(ROOTFS)_TARGET_DIR),$(BASE_TARGET_DIR))
  395. endif
  396. ifneq ($(HOST_DIR),$(BASE_DIR)/host)
  397. HOST_DIR_SYMLINK = $(BASE_DIR)/host
  398. $(HOST_DIR_SYMLINK): | $(BASE_DIR)
  399. ln -snf $(HOST_DIR) $(HOST_DIR_SYMLINK)
  400. endif
  401. STAGING_DIR_SYMLINK = $(BASE_DIR)/staging
  402. $(STAGING_DIR_SYMLINK): | $(BASE_DIR)
  403. ln -snf $(STAGING_DIR) $(STAGING_DIR_SYMLINK)
  404. # Quotes are needed for spaces and all in the original PATH content.
  405. BR_PATH = "$(HOST_DIR)/bin:$(HOST_DIR)/sbin:$(PATH)"
  406. # Location of a file giving a big fat warning that output/target
  407. # should not be used as the root filesystem.
  408. TARGET_DIR_WARNING_FILE = $(TARGET_DIR)/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM
  409. ifeq ($(BR2_CCACHE),y)
  410. CCACHE = $(HOST_DIR)/bin/ccache
  411. BR_CACHE_DIR ?= $(call qstrip,$(BR2_CCACHE_DIR))
  412. export BR_CACHE_DIR
  413. HOSTCC = $(CCACHE) $(HOSTCC_NOCCACHE)
  414. HOSTCXX = $(CCACHE) $(HOSTCXX_NOCCACHE)
  415. export BR2_USE_CCACHE ?= 1
  416. endif
  417. # Scripts in support/ or post-build scripts may need to reference
  418. # these locations, so export them so it is easier to use
  419. export BR2_CONFIG
  420. export BR2_REPRODUCIBLE
  421. export TARGET_DIR
  422. export STAGING_DIR
  423. export HOST_DIR
  424. export BINARIES_DIR
  425. export BASE_DIR
  426. ################################################################################
  427. #
  428. # You should probably leave this stuff alone unless you know
  429. # what you are doing.
  430. #
  431. ################################################################################
  432. all: world
  433. # Include legacy before the other things, because package .mk files
  434. # may rely on it.
  435. include Makefile.legacy
  436. include system/system.mk
  437. include package/Makefile.in
  438. # arch/arch.mk must be after package/Makefile.in because it may need to
  439. # complement variables defined therein, like BR_NO_CHECK_HASH_FOR.
  440. include arch/arch.mk
  441. include support/dependencies/dependencies.mk
  442. include $(sort $(wildcard toolchain/*.mk))
  443. include $(sort $(wildcard toolchain/*/*.mk))
  444. ifeq ($(BR2_REPRODUCIBLE),y)
  445. # If SOURCE_DATE_EPOCH has not been set then use the commit date, or the last
  446. # release date if the source tree is not within a Git repository.
  447. # See: https://reproducible-builds.org/specs/source-date-epoch/
  448. BR2_VERSION_GIT_EPOCH := $(shell $(GIT) log -1 --format=%at 2> /dev/null)
  449. export SOURCE_DATE_EPOCH ?= $(or $(BR2_VERSION_GIT_EPOCH),$(BR2_VERSION_EPOCH))
  450. endif
  451. # Include the package override file if one has been provided in the
  452. # configuration.
  453. PACKAGE_OVERRIDE_FILE = $(call qstrip,$(BR2_PACKAGE_OVERRIDE_FILE))
  454. ifneq ($(PACKAGE_OVERRIDE_FILE),)
  455. -include $(PACKAGE_OVERRIDE_FILE)
  456. endif
  457. include $(sort $(wildcard package/*/*.mk))
  458. include boot/common.mk
  459. include linux/linux.mk
  460. include fs/common.mk
  461. # If using a br2-external tree, the BR2_EXTERNAL_$(NAME)_PATH variables
  462. # are also present in the .config file. Since .config is included after
  463. # we defined them in the Makefile, the values for those variables are
  464. # quoted. We just include the generated Makefile fragment .br2-external.mk
  465. # a third time, which will set those variables to the un-quoted values.
  466. include $(BR2_EXTERNAL_FILE)
  467. # Nothing to include if no BR2_EXTERNAL tree in use
  468. include $(BR2_EXTERNAL_MKS)
  469. # Now we are sure we have all the packages scanned and defined. We now
  470. # check for each package in the list of enabled packages, that all its
  471. # dependencies are indeed enabled.
  472. #
  473. # Only trigger the check for default builds. If the user forces building
  474. # a package, even if not enabled in the configuration, we want to accept
  475. # it. However; we also want to be able to force checking the dependencies
  476. # if the user so desires. Forcing a dependency check is useful in the case
  477. # of test-pkg, as we want to make sure during testing, that a package has
  478. # all the dependencies selected in the config file.
  479. #
  480. ifeq ($(MAKECMDGOALS),)
  481. BR_FORCE_CHECK_DEPENDENCIES = YES
  482. endif
  483. ifeq ($(BR_FORCE_CHECK_DEPENDENCIES),YES)
  484. define CHECK_ONE_DEPENDENCY
  485. ifeq ($$($(2)_TYPE),target)
  486. ifneq ($$($$($(2)_KCONFIG_VAR)),y)
  487. $$(error $$($(2)_NAME) is in the dependency chain of $$($(1)_NAME) that \
  488. has added it to its _DEPENDENCIES variable without selecting it or \
  489. depending on it from Config.in)
  490. endif
  491. endif
  492. endef
  493. $(foreach pkg,$(call UPPERCASE,$(PACKAGES)),\
  494. $(foreach dep,$(call UPPERCASE,$($(pkg)_FINAL_ALL_DEPENDENCIES)),\
  495. $(eval $(call CHECK_ONE_DEPENDENCY,$(pkg),$(dep))$(sep))))
  496. endif
  497. $(BUILD_DIR)/buildroot-config/auto.conf: $(BR2_CONFIG)
  498. $(MAKE1) $(EXTRAMAKEARGS) HOSTCC="$(HOSTCC_NOCCACHE)" HOSTCXX="$(HOSTCXX_NOCCACHE)" syncconfig
  499. .PHONY: prepare
  500. prepare: $(BUILD_DIR)/buildroot-config/auto.conf
  501. @$(foreach s, $(call qstrip,$(BR2_ROOTFS_PRE_BUILD_SCRIPT)), \
  502. $(call MESSAGE,"Executing pre-build script $(s)"); \
  503. $(EXTRA_ENV) $(s) \
  504. $(TARGET_DIR) \
  505. $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS)) \
  506. $(call qstrip,$(BR2_ROOTFS_PRE_BUILD_SCRIPT_ARGS))$(sep))
  507. .PHONY: world
  508. world: target-post-image
  509. .PHONY: prepare-sdk
  510. prepare-sdk: world
  511. @$(call MESSAGE,"Preparing the SDK")
  512. $(INSTALL) -m 755 $(TOPDIR)/support/misc/relocate-sdk.sh $(HOST_DIR)/relocate-sdk.sh
  513. mkdir -p $(HOST_DIR)/share/buildroot
  514. echo $(HOST_DIR) > $(HOST_DIR)/share/buildroot/sdk-location
  515. BR2_SDK_PREFIX ?= $(GNU_TARGET_NAME)_sdk-buildroot
  516. .PHONY: sdk
  517. sdk: prepare-sdk $(BR2_TAR_HOST_DEPENDENCY)
  518. @$(call MESSAGE,"Generating SDK tarball")
  519. $(if $(BR2_SDK_PREFIX),,$(error BR2_SDK_PREFIX can not be empty))
  520. $(Q)mkdir -p $(BINARIES_DIR)
  521. $(TAR) czf "$(BINARIES_DIR)/$(BR2_SDK_PREFIX).tar.gz" \
  522. --owner=0 --group=0 --numeric-owner \
  523. --transform='s#^$(patsubst /%,%,$(HOST_DIR))#$(BR2_SDK_PREFIX)#' \
  524. -C / $(patsubst /%,%,$(HOST_DIR))
  525. RSYNC_VCS_EXCLUSIONS = \
  526. --exclude .svn --exclude .git --exclude .hg --exclude .bzr \
  527. --exclude CVS
  528. # When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
  529. # BR2_STRIP_EXCLUDE_FILES
  530. STRIP_FIND_COMMON_CMD = \
  531. find $(TARGET_DIR) \
  532. $(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)), \
  533. \( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) \
  534. -prune -o \
  535. ) \
  536. $(if $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)), \
  537. -not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) )
  538. # Regular stripping for everything, except libpthread, ld-*.so and
  539. # kernel modules:
  540. # - libpthread.so: a non-stripped libpthread shared library is needed for
  541. # proper debugging of pthread programs using gdb.
  542. # - ld.so: a non-stripped dynamic linker library is needed for valgrind
  543. # - kernel modules (*.ko): do not function properly when stripped like normal
  544. # applications and libraries. Normally kernel modules are already excluded
  545. # by the executable permission check, so the explicit exclusion is only
  546. # done for kernel modules with incorrect permissions.
  547. STRIP_FIND_CMD = \
  548. $(STRIP_FIND_COMMON_CMD) \
  549. -type f \( -perm /111 -o -name '*.so*' \) \
  550. -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \) \
  551. -print0
  552. # Special stripping (only debugging symbols) for libpthread and ld-*.so.
  553. STRIP_FIND_SPECIAL_LIBS_CMD = \
  554. $(STRIP_FIND_COMMON_CMD) \
  555. \( -name 'ld-*.so*' -o -name 'libpthread*.so*' \) \
  556. -print0
  557. # Generate locale data.
  558. ifeq ($(BR2_TOOLCHAIN_USES_GLIBC),y)
  559. GLIBC_GENERATE_LOCALES = $(call qstrip,$(BR2_GENERATE_LOCALE))
  560. ifneq ($(GLIBC_GENERATE_LOCALES),)
  561. PACKAGES += host-localedef
  562. define GENERATE_GLIBC_LOCALES
  563. +$(MAKE) -f support/misc/gen-glibc-locales.mk \
  564. ENDIAN=$(call LOWERCASE,$(BR2_ENDIAN)) \
  565. LOCALES="$(GLIBC_GENERATE_LOCALES)" \
  566. Q=$(Q)
  567. endef
  568. TARGET_FINALIZE_HOOKS += GENERATE_GLIBC_LOCALES
  569. endif
  570. endif
  571. ifeq ($(BR2_ENABLE_LOCALE_PURGE),y)
  572. LOCALE_WHITELIST = $(BUILD_DIR)/locales.nopurge
  573. LOCALE_NOPURGE = $(call qstrip,$(BR2_ENABLE_LOCALE_WHITELIST))
  574. # This piece of junk does the following:
  575. # First collect the whitelist in a file.
  576. # Then go over all the locale dirs and for each subdir, check if it exists
  577. # in the whitelist file. If it doesn't, kill it.
  578. # Finally, specifically for X11, regenerate locale.dir from the whitelist.
  579. define PURGE_LOCALES
  580. printf '%s\n' $(LOCALE_NOPURGE) locale-archive > $(LOCALE_WHITELIST)
  581. for dir in $(addprefix $(TARGET_DIR),/usr/share/locale /usr/share/X11/locale /usr/lib/locale); \
  582. do \
  583. if [ ! -d $$dir ]; then continue; fi; \
  584. for langdir in $$dir/*; \
  585. do \
  586. if [ -e "$${langdir}" ]; \
  587. then \
  588. grep -qx "$${langdir##*/}" $(LOCALE_WHITELIST) || rm -rf $$langdir; \
  589. fi \
  590. done; \
  591. done
  592. if [ -d $(TARGET_DIR)/usr/share/X11/locale ]; \
  593. then \
  594. for lang in $(LOCALE_NOPURGE); \
  595. do \
  596. if [ -f $(TARGET_DIR)/usr/share/X11/locale/$$lang/XLC_LOCALE ]; \
  597. then \
  598. echo "$$lang/XLC_LOCALE: $$lang"; \
  599. fi \
  600. done > $(TARGET_DIR)/usr/share/X11/locale/locale.dir; \
  601. fi
  602. endef
  603. TARGET_FINALIZE_HOOKS += PURGE_LOCALES
  604. endif
  605. $(TARGETS_ROOTFS): target-finalize
  606. # Avoid the rootfs name leaking down the dependency chain
  607. target-finalize: ROOTFS=
  608. TARGET_DIR_FILES_LISTS = $(sort $(wildcard $(BUILD_DIR)/*/.files-list.txt))
  609. HOST_DIR_FILES_LISTS = $(sort $(wildcard $(BUILD_DIR)/*/.files-list-host.txt))
  610. STAGING_DIR_FILES_LISTS = $(sort $(wildcard $(BUILD_DIR)/*/.files-list-staging.txt))
  611. .PHONY: host-finalize
  612. host-finalize: $(PACKAGES) $(HOST_DIR) $(HOST_DIR_SYMLINK)
  613. @$(call MESSAGE,"Finalizing host directory")
  614. $(call per-package-rsync,$(sort $(PACKAGES)),host,$(HOST_DIR),copy)
  615. $(Q)PARALLEL_JOBS=$(PARALLEL_JOBS) \
  616. PER_PACKAGE_DIR=$(PER_PACKAGE_DIR) \
  617. $(TOPDIR)/support/scripts/fix-rpath host
  618. $(Q)PARALLEL_JOBS=$(PARALLEL_JOBS) \
  619. PER_PACKAGE_DIR=$(PER_PACKAGE_DIR) \
  620. $(TOPDIR)/support/scripts/fix-rpath staging
  621. $(call ppd-fixup-paths,$(BASE_DIR))
  622. .PHONY: staging-finalize
  623. staging-finalize: $(STAGING_DIR_SYMLINK)
  624. .PHONY: target-finalize
  625. target-finalize: $(PACKAGES) $(TARGET_DIR) host-finalize
  626. @$(call MESSAGE,"Finalizing target directory")
  627. $(call per-package-rsync,$(sort $(PACKAGES)),target,$(TARGET_DIR),copy)
  628. $(foreach hook,$(TARGET_FINALIZE_HOOKS),$($(hook))$(sep))
  629. rm -rf $(TARGET_DIR)/usr/include $(TARGET_DIR)/usr/share/aclocal \
  630. $(TARGET_DIR)/usr/lib/pkgconfig $(TARGET_DIR)/usr/share/pkgconfig \
  631. $(TARGET_DIR)/usr/lib/cmake $(TARGET_DIR)/usr/share/cmake \
  632. $(TARGET_DIR)/usr/lib/rpm $(TARGET_DIR)/usr/doc
  633. find $(TARGET_DIR)/usr/{lib,share}/ -name '*.cmake' -print0 | xargs -0 rm -f
  634. find $(TARGET_DIR)/lib/ $(TARGET_DIR)/usr/lib/ $(TARGET_DIR)/usr/libexec/ \
  635. \( -name '*.a' -o -name '*.la' -o -name '*.prl' \) -print0 | xargs -0 rm -f
  636. ifneq ($(BR2_PACKAGE_GDB),y)
  637. rm -rf $(TARGET_DIR)/usr/share/gdb
  638. endif
  639. ifneq ($(BR2_PACKAGE_BASH),y)
  640. rm -rf $(TARGET_DIR)/usr/share/bash-completion
  641. rm -rf $(TARGET_DIR)/etc/bash_completion.d
  642. endif
  643. ifneq ($(BR2_PACKAGE_ZSH),y)
  644. rm -rf $(TARGET_DIR)/usr/share/zsh
  645. endif
  646. rm -rf $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/man
  647. rm -rf $(TARGET_DIR)/usr/info $(TARGET_DIR)/usr/share/info
  648. rm -rf $(TARGET_DIR)/usr/doc $(TARGET_DIR)/usr/share/doc
  649. rm -rf $(TARGET_DIR)/usr/share/gtk-doc
  650. rmdir $(TARGET_DIR)/usr/share 2>/dev/null || true
  651. ifneq ($(BR2_ENABLE_DEBUG):$(BR2_STRIP_strip),y:)
  652. rm -rf $(TARGET_DIR)/lib/debug $(TARGET_DIR)/usr/lib/debug
  653. endif
  654. $(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
  655. $(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 -r $(STRIPCMD) $(STRIP_STRIP_DEBUG) 2>/dev/null || true
  656. test -f $(TARGET_DIR)/etc/ld.so.conf && \
  657. { echo "ERROR: we shouldn't have a /etc/ld.so.conf file"; exit 1; } || true
  658. test -d $(TARGET_DIR)/etc/ld.so.conf.d && \
  659. { echo "ERROR: we shouldn't have a /etc/ld.so.conf.d directory"; exit 1; } || true
  660. mkdir -p $(TARGET_DIR)/etc
  661. ( \
  662. echo "NAME=Buildroot"; \
  663. echo "VERSION=$(BR2_VERSION_FULL)"; \
  664. echo "ID=buildroot"; \
  665. echo "VERSION_ID=$(BR2_VERSION)"; \
  666. echo "PRETTY_NAME=\"Buildroot $(BR2_VERSION)\"" \
  667. ) > $(TARGET_DIR)/usr/lib/os-release
  668. ln -sf ../usr/lib/os-release $(TARGET_DIR)/etc
  669. @$(call MESSAGE,"Sanitizing RPATH in target tree")
  670. PARALLEL_JOBS=$(PARALLEL_JOBS) \
  671. PER_PACKAGE_DIR=$(PER_PACKAGE_DIR) \
  672. $(TOPDIR)/support/scripts/fix-rpath target
  673. # For a merged /usr, ensure that /lib, /bin and /sbin and their /usr
  674. # counterparts are appropriately setup as symlinks ones to the others.
  675. ifeq ($(BR2_ROOTFS_MERGED_USR),y)
  676. $(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
  677. @$(call MESSAGE,"Sanity check in overlay $(d)")$(sep) \
  678. $(Q)not_merged_dirs="$$(support/scripts/check-merged-usr.sh $(d))"; \
  679. test -n "$$not_merged_dirs" && { \
  680. echo "ERROR: The overlay in $(d) is not" \
  681. "using a merged /usr for the following directories:" \
  682. $$not_merged_dirs; \
  683. exit 1; \
  684. } || true$(sep))
  685. endif # merged /usr
  686. $(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
  687. @$(call MESSAGE,"Copying overlay $(d)")$(sep) \
  688. $(Q)$(call SYSTEM_RSYNC,$(d),$(TARGET_DIR))$(sep))
  689. $(Q)$(if $(TARGET_DIR_FILES_LISTS), \
  690. cat $(TARGET_DIR_FILES_LISTS)) > $(BUILD_DIR)/packages-file-list.txt
  691. $(Q)$(if $(HOST_DIR_FILES_LISTS), \
  692. cat $(HOST_DIR_FILES_LISTS)) > $(BUILD_DIR)/packages-file-list-host.txt
  693. $(Q)$(if $(STAGING_DIR_FILES_LISTS), \
  694. cat $(STAGING_DIR_FILES_LISTS)) > $(BUILD_DIR)/packages-file-list-staging.txt
  695. $(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_BUILD_SCRIPT)), \
  696. @$(call MESSAGE,"Executing post-build script $(s)")$(sep) \
  697. $(Q)$(EXTRA_ENV) $(s) \
  698. $(TARGET_DIR) \
  699. $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS)) \
  700. $(call qstrip,$(BR2_ROOTFS_POST_BUILD_SCRIPT_ARGS))$(sep))
  701. touch $(TARGET_DIR)/usr
  702. # Note: this will run in the filesystem context, so will use a copy
  703. # of target/, not the real one, so the files are still available on
  704. # re-builds (foo-rebuild, etc...)
  705. define ROOTFS_RM_HWDB_DATA
  706. rm -rf $(TARGET_DIR)/usr/lib/udev/hwdb.d/ $(TARGET_DIR)/etc/udev/hwdb.d/
  707. endef
  708. ROOTFS_PRE_CMD_HOOKS += ROOTFS_RM_HWDB_DATA
  709. .PHONY: target-post-image
  710. target-post-image: $(TARGETS_ROOTFS) target-finalize staging-finalize
  711. @rm -f $(ROOTFS_COMMON_TAR)
  712. $(Q)mkdir -p $(BINARIES_DIR)
  713. @$(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_IMAGE_SCRIPT)), \
  714. $(call MESSAGE,"Executing post-image script $(s)"); \
  715. $(EXTRA_ENV) $(s) \
  716. $(BINARIES_DIR) \
  717. $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS)) \
  718. $(call qstrip,$(BR2_ROOTFS_POST_IMAGE_SCRIPT_ARGS))$(sep))
  719. .PHONY: source
  720. source: $(foreach p,$(PACKAGES),$(p)-all-source)
  721. .PHONY: _external-deps external-deps
  722. _external-deps: $(foreach p,$(PACKAGES),$(p)-all-external-deps)
  723. external-deps:
  724. @$(MAKE1) -Bs $(EXTRAMAKEARGS) _external-deps | sort -u
  725. .PHONY: legal-info-clean
  726. legal-info-clean:
  727. @rm -fr $(LEGAL_INFO_DIR)
  728. .PHONY: legal-info-prepare
  729. legal-info-prepare: $(LEGAL_INFO_DIR)
  730. @$(call MESSAGE,"Buildroot $(BR2_VERSION_FULL) Collecting legal info")
  731. @$(call legal-license-file,HOST,buildroot,buildroot,COPYING,COPYING,support/legal-info/buildroot.hash)
  732. @$(call legal-manifest,TARGET,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,DEPENDENCIES WITH LICENSES)
  733. @$(call legal-manifest,HOST,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,DEPENDENCIES WITH LICENSES)
  734. @$(call legal-manifest,HOST,buildroot,$(BR2_VERSION_FULL),GPL-2.0+,COPYING,not saved,not saved)
  735. @$(call legal-warning,the Buildroot source code has not been saved)
  736. @cp $(BR2_CONFIG) $(LEGAL_INFO_DIR)/buildroot.config
  737. .PHONY: legal-info
  738. legal-info: legal-info-clean legal-info-prepare $(foreach p,$(PACKAGES),$(p)-all-legal-info) \
  739. $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST)
  740. @cat support/legal-info/README.header >>$(LEGAL_REPORT)
  741. @if [ -r $(LEGAL_WARNINGS) ]; then \
  742. cat support/legal-info/README.warnings-header \
  743. $(LEGAL_WARNINGS) >>$(LEGAL_REPORT); \
  744. cat $(LEGAL_WARNINGS); fi
  745. @rm -f $(LEGAL_WARNINGS)
  746. @(cd $(LEGAL_INFO_DIR); \
  747. find * -type f -exec sha256sum {} + | LC_ALL=C sort -k2 \
  748. >.legal-info.sha256; \
  749. mv .legal-info.sha256 legal-info.sha256)
  750. @echo "Legal info produced in $(LEGAL_INFO_DIR)"
  751. .PHONY: show-targets
  752. show-targets:
  753. @echo $(sort $(PACKAGES)) $(sort $(TARGETS_ROOTFS))
  754. .PHONY: show-build-order
  755. show-build-order: $(patsubst %,%-show-build-order,$(PACKAGES))
  756. .PHONY: graph-build
  757. graph-build: $(O)/build/build-time.log
  758. @install -d $(GRAPHS_DIR)
  759. $(foreach o,name build duration,./support/scripts/graph-build-time \
  760. --type=histogram --order=$(o) --input=$(<) \
  761. --output=$(GRAPHS_DIR)/build.hist-$(o).$(BR_GRAPH_OUT) \
  762. $(if $(BR2_GRAPH_ALT),--alternate-colors)$(sep))
  763. $(foreach t,packages steps,./support/scripts/graph-build-time \
  764. --type=pie-$(t) --input=$(<) \
  765. --output=$(GRAPHS_DIR)/build.pie-$(t).$(BR_GRAPH_OUT) \
  766. $(if $(BR2_GRAPH_ALT),--alternate-colors)$(sep))
  767. ./support/scripts/graph-build-time --type=timeline --input=$(<) \
  768. --output=$(GRAPHS_DIR)/build.timeline.$(BR_GRAPH_OUT) \
  769. $(if $(BR2_GRAPH_ALT),--alternate-colors)
  770. .PHONY: graph-depends-requirements
  771. graph-depends-requirements:
  772. @dot -? >/dev/null 2>&1 || \
  773. { echo "ERROR: The 'dot' program from Graphviz is needed for graph-depends" >&2; exit 1; }
  774. .PHONY: graph-depends
  775. graph-depends: graph-depends-requirements
  776. @$(INSTALL) -d $(GRAPHS_DIR)
  777. @cd "$(CONFIG_DIR)"; \
  778. $(TOPDIR)/support/scripts/graph-depends $(BR2_GRAPH_DEPS_OPTS) \
  779. --direct -o $(GRAPHS_DIR)/$(@).dot
  780. dot $(BR2_GRAPH_DOT_OPTS) -T$(BR_GRAPH_OUT) \
  781. -o $(GRAPHS_DIR)/$(@).$(BR_GRAPH_OUT) \
  782. $(GRAPHS_DIR)/$(@).dot
  783. .PHONY: graph-size
  784. graph-size:
  785. $(Q)mkdir -p $(GRAPHS_DIR)
  786. $(Q)$(TOPDIR)/support/scripts/size-stats --builddir $(BASE_DIR) \
  787. --graph $(GRAPHS_DIR)/graph-size.$(BR_GRAPH_OUT) \
  788. --file-size-csv $(GRAPHS_DIR)/file-size-stats.csv \
  789. --package-size-csv $(GRAPHS_DIR)/package-size-stats.csv \
  790. $(BR2_GRAPH_SIZE_OPTS)
  791. .PHONY: check-dependencies
  792. check-dependencies:
  793. @cd "$(CONFIG_DIR)"; \
  794. $(TOPDIR)/support/scripts/graph-depends -C
  795. .PHONY: show-info
  796. show-info:
  797. @:
  798. $(info $(call clean-json, \
  799. { $(foreach p, \
  800. $(sort $(foreach i,$(PACKAGES) $(TARGETS_ROOTFS), \
  801. $(i) \
  802. $($(call UPPERCASE,$(i))_FINAL_RECURSIVE_DEPENDENCIES) \
  803. ) \
  804. ), \
  805. $(call json-info,$(call UPPERCASE,$(p)))$(comma) \
  806. ) } \
  807. ) \
  808. )
  809. .PHONY: pkg-stats
  810. pkg-stats:
  811. @cd "$(CONFIG_DIR)" ; \
  812. $(TOPDIR)/support/scripts/pkg-stats -c \
  813. --json $(O)/pkg-stats.json \
  814. --html $(O)/pkg-stats.html \
  815. --nvd-path $(DL_DIR)/buildroot-nvd
  816. else # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
  817. # Some subdirectories are also package names. To avoid that "make linux"
  818. # on an unconfigured tree produces "Nothing to be done", add an explicit
  819. # rule for it.
  820. # Also for 'all' we error out and ask the user to configure first.
  821. .PHONY: linux toolchain
  822. linux toolchain all: outputmakefile
  823. $(error Please configure Buildroot first (e.g. "make menuconfig"))
  824. @exit 1
  825. endif # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
  826. # configuration
  827. # ---------------------------------------------------------------------------
  828. HOSTCFLAGS = $(CFLAGS_FOR_BUILD)
  829. export HOSTCFLAGS
  830. $(BUILD_DIR)/buildroot-config/%onf:
  831. mkdir -p $(@D)/lxdialog
  832. PKG_CONFIG_PATH="$(HOST_PKG_CONFIG_PATH)" $(MAKE) CC="$(HOSTCC_NOCCACHE)" HOSTCC="$(HOSTCC_NOCCACHE)" \
  833. obj=$(@D) -C $(CONFIG) -f Makefile.br $(@F)
  834. DEFCONFIG = $(call qstrip,$(BR2_DEFCONFIG))
  835. # We don't want to fully expand BR2_DEFCONFIG here, so Kconfig will
  836. # recognize that if it's still at its default $(CONFIG_DIR)/defconfig
  837. COMMON_CONFIG_ENV = \
  838. BR2_DEFCONFIG='$(call qstrip,$(value BR2_DEFCONFIG))' \
  839. KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
  840. KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
  841. KCONFIG_TRISTATE=$(BUILD_DIR)/buildroot-config/tristate.config \
  842. BR2_CONFIG=$(BR2_CONFIG) \
  843. HOST_GCC_VERSION="$(HOSTCC_VERSION)" \
  844. BASE_DIR=$(BASE_DIR) \
  845. SKIP_LEGACY=
  846. xconfig: $(BUILD_DIR)/buildroot-config/qconf outputmakefile
  847. @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
  848. gconfig: $(BUILD_DIR)/buildroot-config/gconf outputmakefile
  849. @$(COMMON_CONFIG_ENV) srctree=$(TOPDIR) $< $(CONFIG_CONFIG_IN)
  850. menuconfig: $(BUILD_DIR)/buildroot-config/mconf outputmakefile
  851. @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
  852. nconfig: $(BUILD_DIR)/buildroot-config/nconf outputmakefile
  853. @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
  854. config: $(BUILD_DIR)/buildroot-config/conf outputmakefile
  855. @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
  856. # For the config targets that automatically select options, we pass
  857. # SKIP_LEGACY=y to disable the legacy options. However, in that case
  858. # no values are set for the legacy options so a subsequent oldconfig
  859. # will query them. Therefore, run an additional olddefconfig.
  860. randconfig allyesconfig alldefconfig allnoconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
  861. @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --$@ $(CONFIG_CONFIG_IN)
  862. @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
  863. randpackageconfig allyespackageconfig allnopackageconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
  864. @grep -v BR2_PACKAGE_ $(BR2_CONFIG) > $(CONFIG_DIR)/.config.nopkg
  865. @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y \
  866. KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
  867. $< --$(subst package,,$@) $(CONFIG_CONFIG_IN)
  868. @rm -f $(CONFIG_DIR)/.config.nopkg
  869. @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
  870. oldconfig syncconfig olddefconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
  871. @$(COMMON_CONFIG_ENV) $< --$@ $(CONFIG_CONFIG_IN)
  872. defconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
  873. @$(COMMON_CONFIG_ENV) $< --defconfig$(if $(DEFCONFIG),=$(DEFCONFIG)) $(CONFIG_CONFIG_IN)
  874. %_defconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
  875. @defconfig=$(or \
  876. $(firstword \
  877. $(foreach d, \
  878. $(call reverse,$(TOPDIR) $(BR2_EXTERNAL_DIRS)), \
  879. $(wildcard $(d)/configs/$@) \
  880. ) \
  881. ), \
  882. $(error "Can't find $@") \
  883. ); \
  884. $(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$${defconfig} \
  885. $< --defconfig=$${defconfig} $(CONFIG_CONFIG_IN)
  886. update-defconfig: savedefconfig
  887. savedefconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
  888. @$(COMMON_CONFIG_ENV) $< \
  889. --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
  890. $(CONFIG_CONFIG_IN)
  891. @$(SED) '/^BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
  892. .PHONY: defconfig savedefconfig update-defconfig
  893. ################################################################################
  894. #
  895. # Cleanup and misc junk
  896. #
  897. ################################################################################
  898. # staging and target directories do NOT list these as
  899. # dependencies anywhere else
  900. $(BASE_DIR) $(BUILD_DIR) $(BASE_TARGET_DIR) $(HOST_DIR) $(BINARIES_DIR) $(LEGAL_INFO_DIR) $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST) $(PER_PACKAGE_DIR):
  901. @mkdir -p $@
  902. # outputmakefile generates a Makefile in the output directory, if using a
  903. # separate output directory. This allows convenient use of make in the
  904. # output directory.
  905. .PHONY: outputmakefile
  906. outputmakefile:
  907. ifeq ($(NEED_WRAPPER),y)
  908. $(Q)$(TOPDIR)/support/scripts/mkmakefile $(TOPDIR) $(O)
  909. endif
  910. # printvars prints all the variables currently defined in our
  911. # Makefiles. Alternatively, if a non-empty VARS variable is passed,
  912. # only the variables matching the make pattern passed in VARS are
  913. # displayed.
  914. # show-vars does the same, but as a JSON dictionnary.
  915. #
  916. # Note: we iterate of .VARIABLES and filter each variable individually,
  917. # to workaround a bug in make 4.3; see https://savannah.gnu.org/bugs/?59093
  918. .PHONY: printvars
  919. printvars:
  920. ifndef VARS
  921. $(error Please pass a non-empty VARS to 'make printvars')
  922. endif
  923. @:
  924. $(foreach V, \
  925. $(sort $(foreach X, $(.VARIABLES), $(filter $(VARS),$(X)))), \
  926. $(if $(filter-out environment% default automatic, \
  927. $(origin $V)), \
  928. $(if $(QUOTED_VARS),\
  929. $(info $V='$(subst ','\'',$(if $(RAW_VARS),$(value $V),$($V)))'), \
  930. $(info $V=$(if $(RAW_VARS),$(value $V),$($V))))))
  931. # ')))) # Syntax colouring...
  932. # See details above, same as for printvars
  933. .PHONY: show-vars
  934. show-vars: VARS?=%
  935. show-vars:
  936. @:
  937. $(foreach i, \
  938. $(call clean-json, { \
  939. $(foreach V, \
  940. $(.VARIABLES), \
  941. $(and $(filter $(VARS),$(V)) \
  942. , \
  943. $(filter-out environment% default automatic, $(origin $V)) \
  944. , \
  945. "$V": { \
  946. "expanded": $(call mk-json-str,$($V))$(comma) \
  947. "raw": $(call mk-json-str,$(value $V)) \
  948. }$(comma) \
  949. ) \
  950. ) \
  951. } ) \
  952. , \
  953. $(info $(i)) \
  954. )
  955. .PHONY: clean
  956. clean:
  957. rm -rf $(BASE_TARGET_DIR) $(BINARIES_DIR) $(HOST_DIR) $(HOST_DIR_SYMLINK) \
  958. $(BUILD_DIR) $(BASE_DIR)/staging \
  959. $(LEGAL_INFO_DIR) $(GRAPHS_DIR) $(PER_PACKAGE_DIR) $(O)/pkg-stats.*
  960. .PHONY: distclean
  961. distclean: clean
  962. ifeq ($(O),$(CURDIR)/output)
  963. rm -rf $(O)
  964. endif
  965. rm -rf $(TOPDIR)/dl $(BR2_CONFIG) $(CONFIG_DIR)/.config.old $(CONFIG_DIR)/..config.tmp \
  966. $(CONFIG_DIR)/.auto.deps $(BASE_DIR)/.br2-external.*
  967. .PHONY: help
  968. help:
  969. @echo 'Cleaning:'
  970. @echo ' clean - delete all files created by build'
  971. @echo ' distclean - delete all non-source files (including .config)'
  972. @echo
  973. @echo 'Build:'
  974. @echo ' all - make world'
  975. @echo ' toolchain - build toolchain'
  976. @echo ' sdk - build relocatable SDK'
  977. @echo
  978. @echo 'Configuration:'
  979. @echo ' menuconfig - interactive curses-based configurator'
  980. @echo ' nconfig - interactive ncurses-based configurator'
  981. @echo ' xconfig - interactive Qt-based configurator'
  982. @echo ' gconfig - interactive GTK-based configurator'
  983. @echo ' oldconfig - resolve any unresolved symbols in .config'
  984. @echo ' syncconfig - Same as oldconfig, but quietly, additionally update deps'
  985. @echo ' olddefconfig - Same as syncconfig but sets new symbols to their default value'
  986. @echo ' randconfig - New config with random answer to all options'
  987. @echo ' defconfig - New config with default answer to all options;'
  988. @echo ' BR2_DEFCONFIG, if set on the command line, is used as input'
  989. @echo ' savedefconfig - Save current config to BR2_DEFCONFIG (minimal config)'
  990. @echo ' update-defconfig - Same as savedefconfig'
  991. @echo ' allyesconfig - New config where all options are accepted with yes'
  992. @echo ' allnoconfig - New config where all options are answered with no'
  993. @echo ' alldefconfig - New config where all options are set to default'
  994. @echo ' randpackageconfig - New config with random answer to package options'
  995. @echo ' allyespackageconfig - New config where pkg options are accepted with yes'
  996. @echo ' allnopackageconfig - New config where package options are answered with no'
  997. @echo
  998. @echo 'Package-specific:'
  999. @echo ' <pkg> - Build and install <pkg> and all its dependencies'
  1000. @echo ' <pkg>-source - Only download the source files for <pkg>'
  1001. @echo ' <pkg>-extract - Extract <pkg> sources'
  1002. @echo ' <pkg>-patch - Apply patches to <pkg>'
  1003. @echo ' <pkg>-depends - Build <pkg>'\''s dependencies'
  1004. @echo ' <pkg>-configure - Build <pkg> up to the configure step'
  1005. @echo ' <pkg>-build - Build <pkg> up to the build step'
  1006. @echo ' <pkg>-show-info - generate info about <pkg>, as a JSON blurb'
  1007. @echo ' <pkg>-show-depends - List packages on which <pkg> depends'
  1008. @echo ' <pkg>-show-rdepends - List packages which have <pkg> as a dependency'
  1009. @echo ' <pkg>-show-recursive-depends'
  1010. @echo ' - Recursively list packages on which <pkg> depends'
  1011. @echo ' <pkg>-show-recursive-rdepends'
  1012. @echo ' - Recursively list packages which have <pkg> as a dependency'
  1013. @echo ' <pkg>-graph-depends - Generate a graph of <pkg>'\''s dependencies'
  1014. @echo ' <pkg>-graph-rdepends - Generate a graph of <pkg>'\''s reverse dependencies'
  1015. @echo ' <pkg>-graph-both-depends'
  1016. @echo ' - Generate a graph of both <pkg>'\''s forward and'
  1017. @echo ' reverse dependencies.'
  1018. @echo ' <pkg>-dirclean - Remove <pkg> build directory'
  1019. @echo ' <pkg>-reconfigure - Restart the build from the configure step'
  1020. @echo ' <pkg>-rebuild - Restart the build from the build step'
  1021. @echo ' <pkg>-reinstall - Restart the build from the install step'
  1022. $(foreach p,$(HELP_PACKAGES), \
  1023. @echo $(sep) \
  1024. @echo '$($(p)_NAME):' $(sep) \
  1025. $($(p)_HELP_CMDS)$(sep))
  1026. @echo
  1027. @echo 'Documentation:'
  1028. @echo ' manual - build manual in all formats'
  1029. @echo ' manual-html - build manual in HTML'
  1030. @echo ' manual-split-html - build manual in split HTML'
  1031. @echo ' manual-pdf - build manual in PDF'
  1032. @echo ' manual-text - build manual in text'
  1033. @echo ' manual-epub - build manual in ePub'
  1034. @echo ' graph-build - generate graphs of the build times'
  1035. @echo ' graph-depends - generate graph of the dependency tree'
  1036. @echo ' graph-size - generate stats of the filesystem size'
  1037. @echo ' list-defconfigs - list all defconfigs (pre-configured minimal systems)'
  1038. @echo
  1039. @echo 'Miscellaneous:'
  1040. @echo ' source - download all sources needed for offline-build'
  1041. @echo ' external-deps - list external packages used'
  1042. @echo ' legal-info - generate info about license compliance'
  1043. @echo ' show-info - generate info about packages, as a JSON blurb'
  1044. @echo ' pkg-stats - generate info about packages as JSON and HTML'
  1045. @echo ' printvars - dump internal variables selected with VARS=...'
  1046. @echo ' show-vars - dump all internal variables as a JSON blurb; use VARS=...'
  1047. @echo ' to limit the list to variables names matching that pattern'
  1048. @echo
  1049. @echo ' make V=0|1 - 0 => quiet build (default), 1 => verbose build'
  1050. @echo ' make O=dir - Locate all output files in "dir", including .config'
  1051. @echo
  1052. @echo 'For further details, see README, generate the Buildroot manual, or consult'
  1053. @echo 'it on-line at http://buildroot.org/docs.html'
  1054. @echo
  1055. # List the defconfig files
  1056. # $(1): base directory
  1057. # $(2): br2-external name, empty for bundled
  1058. define list-defconfigs
  1059. @first=true; \
  1060. for defconfig in $$(find $(1)/configs -name '*_defconfig' |sort); do \
  1061. [ -f "$${defconfig}" ] || continue; \
  1062. if $${first}; then \
  1063. if [ "$(2)" ]; then \
  1064. printf 'External configs in "$(call qstrip,$(2))":\n'; \
  1065. else \
  1066. printf "Built-in configs:\n"; \
  1067. fi; \
  1068. first=false; \
  1069. fi; \
  1070. defconfig="$${defconfig#$(1)/configs/}"; \
  1071. printf " %-35s - Build for %s\n" "$${defconfig}" "$${defconfig%_defconfig}"; \
  1072. done; \
  1073. $${first} || printf "\n"
  1074. endef
  1075. # We iterate over BR2_EXTERNAL_NAMES rather than BR2_EXTERNAL_DIRS,
  1076. # because we want to display the name of the br2-external tree.
  1077. .PHONY: list-defconfigs
  1078. list-defconfigs:
  1079. $(call list-defconfigs,$(TOPDIR))
  1080. $(foreach name,$(BR2_EXTERNAL_NAMES),\
  1081. $(call list-defconfigs,$(BR2_EXTERNAL_$(name)_PATH),\
  1082. $(BR2_EXTERNAL_$(name)_DESC))$(sep))
  1083. release: OUT = buildroot-$(BR2_VERSION)
  1084. # Create release tarballs. We need to fiddle a bit to add the generated
  1085. # documentation to the git output
  1086. release:
  1087. git archive --format=tar --prefix=$(OUT)/ HEAD > $(OUT).tar
  1088. $(MAKE) O=$(OUT) manual-html manual-text manual-pdf
  1089. $(MAKE) O=$(OUT) distclean
  1090. tar rf $(OUT).tar $(OUT)
  1091. gzip -9 -c < $(OUT).tar > $(OUT).tar.gz
  1092. xz -9 -c < $(OUT).tar > $(OUT).tar.xz
  1093. rm -rf $(OUT) $(OUT).tar
  1094. print-version:
  1095. @echo $(BR2_VERSION_FULL)
  1096. check-package:
  1097. $(Q)./utils/check-package `git ls-tree -r --name-only HEAD` \
  1098. --ignore-list=$(TOPDIR)/.checkpackageignore
  1099. .PHONY: .checkpackageignore
  1100. .checkpackageignore:
  1101. $(Q)./utils/check-package --failed-only `git ls-tree -r --name-only HEAD` \
  1102. > .checkpackageignore
  1103. include docs/manual/manual.mk
  1104. -include $(foreach dir,$(BR2_EXTERNAL_DIRS),$(sort $(wildcard $(dir)/docs/*/*.mk)))
  1105. .PHONY: $(noconfig_targets)
  1106. # .WAIT was introduced in make 4.4. For older make, define it as phony.
  1107. .PHONY: .WAIT
  1108. endif #umask / $(CURDIR) / $(O)