1 # SPDX-License-Identifier: GPL-2.0-only
3 # Copyright (C) 2007-2020 OpenWrt.org
5 PREP_MK
= OPENWRT_BUILD
= QUIET
=0
7 export IS_TTY
=$(if
$(MAKE_TERMOUT
),1,0)
9 include $(TOPDIR
)/include/verbose.mk
12 include $(TOPDIR
)/include/version.mk
14 REVISION
:=$(shell $(TOPDIR
)/scripts
/getver.sh
)
15 SOURCE_DATE_EPOCH
:=$(shell $(TOPDIR
)/scripts
/get_source_date_epoch.sh
)
19 export SOURCE_DATE_EPOCH
20 export GIT_CONFIG_PARAMETERS
='core.autocrlf=false'
21 export GIT_ASKPASS
:=/bin
/true
22 export MAKE_JOBSERVER
=$(filter --jobserver
%,$(MAKEFLAGS
))
23 export GNU_HOST_NAME
:=$(shell $(TOPDIR
)/scripts
/config.guess
)
24 export HOST_OS
:=$(shell uname
)
25 export HOST_ARCH
:=$(shell uname
-m
)
27 ifeq ($(HOST_OS
),Darwin
)
28 ifneq ($(filter /Applications
/Xcode.app
/% /Library
/Developer
/%,$(MAKE
)),)
29 $(error Please use a newer version of GNU make. The version shipped by Apple is not supported
)
33 # prevent perforce from messing with the patch utility
34 unexport P4PORT P4USER P4CONFIG P4CLIENT
36 # prevent user defaults for quilt from interfering
37 unexport QUILT_PATCHES QUILT_PATCH_OPTS
39 unexport C_INCLUDE_PATH CROSS_COMPILE ARCH
41 # prevent distro default LPATH from interfering
44 # make sure that a predefined CFLAGS variable does not disturb packages
49 space
:= $(empty
) $(empty
)
50 path
:=$(subst :,$(space
),$(PATH
))
51 path
:=$(filter-out .
%,$(path
))
52 path
:=$(subst $(space
),:,$(path
))
53 export ORIG_PATH
:=$(if
$(ORIG_PATH
),$(ORIG_PATH
),$(PATH
))
55 export STAGING_DIR_HOST
:=$(if
$(STAGING_DIR
),$(abspath
$(STAGING_DIR
)/..
/host
),$(TOPDIR
)/staging_dir
/host
)
60 .config scripts
/config
/conf scripts
/config
/mconf
: $(STAGING_DIR_HOST
)/.prereq-build
63 SCAN_COOKIE?
=$(shell echo
$$$$)
66 SUBMAKE
:=umask
022; $(SUBMAKE
)
68 ULIMIT_FIX
=_limit
=`ulimit -n`; [ "$$_limit" = "unlimited" -o
"$$_limit" -ge
1024 ] || ulimit
-n
1024;
70 prepare-mk
: $(STAGING_DIR_HOST
)/.prereq-build FORCE
;
73 IGNORE_PACKAGES
= linux
76 _ignore
= $(foreach p
,$(IGNORE_PACKAGES
),--ignore
$(p
))
78 prepare-tmpinfo
: FORCE
79 @
+$(MAKE
) -r
-s
$(STAGING_DIR_HOST
)/.prereq-build
$(PREP_MK
)
81 $(_SINGLE
)$(NO_TRACE_MAKE
) -j1
-r
-s
-f
include/scan.mk SCAN_TARGET
="packageinfo" SCAN_DIR
="package" SCAN_NAME
="package" SCAN_DEPTH
=5 SCAN_EXTRA
=""
82 $(_SINGLE
)$(NO_TRACE_MAKE
) -j1
-r
-s
-f
include/scan.mk SCAN_TARGET
="targetinfo" SCAN_DIR
="target/linux" SCAN_NAME
="target" SCAN_DEPTH
=3 SCAN_EXTRA
="" SCAN_MAKEOPTS
="TARGET_BUILD=1"
83 for type in package target
; do \
84 f
=tmp
/.
$${type}info; t
=tmp
/.config-
$${type}.in
; \
85 [ "$$t" -nt
"$$f" ] || .
/scripts
/$${type}-metadata.pl
$(_ignore
) config
"$$f" > "$$t" ||
{ rm -f
"$$t"; echo
"Failed to build $$t"; false
; break
; }; \
87 [ tmp
/.config-feeds.in
-nt tmp
/.packageauxvars
] || .
/scripts
/feeds feed_config
> tmp
/.config-feeds.in
88 .
/scripts
/package-metadata.pl mk tmp
/.packageinfo
> tmp
/.packagedeps ||
{ rm -f tmp
/.packagedeps
; false
; }
89 .
/scripts
/package-metadata.pl pkgaux tmp
/.packageinfo
> tmp
/.packageauxvars ||
{ rm -f tmp
/.packageauxvars
; false
; }
90 .
/scripts
/package-metadata.pl usergroup tmp
/.packageinfo
> tmp
/.packageusergroup ||
{ rm -f tmp
/.packageusergroup
; false
; }
91 touch
$(TOPDIR
)/tmp
/.build
93 .config
: .
/scripts
/config
/conf
$(if
$(CONFIG_HAVE_DOT_CONFIG
),,prepare-tmpinfo
)
94 @
+if
[ \
! -e .config
] ||
! grep CONFIG_HAVE_DOT_CONFIG .config
>/dev
/null
; then \
95 [ -e
$(HOME
)/.openwrt
/defconfig
] && cp
$(HOME
)/.openwrt
/defconfig .config
; \
96 $(_SINGLE
)$(NO_TRACE_MAKE
) menuconfig
$(PREP_MK
); \
99 ifeq ($(RECURSIVE_DEP_IS_ERROR
),1)
100 KCONF_FLAGS
=--fatalrecursive
102 ifneq ($(DISTRO_PKG_CONFIG
),)
103 scripts
/config
/%onf
: export PATH
:=$(dir $(DISTRO_PKG_CONFIG
)):$(PATH
)
105 scripts
/config
/%onf
: CFLAGS
+= -O2
106 scripts
/config
/%onf
: FORCE
107 @
$(_SINGLE
)$(SUBMAKE
) $(if
$(findstring s
,$(OPENWRT_VERBOSE
)),,-s
) \
108 -C scripts
/config
$(notdir $@
)
110 $(eval
$(call rdep
,scripts
/config
,scripts
/config
/mconf
))
112 config
: scripts
/config
/conf prepare-tmpinfo FORCE
113 [ -L .config
] && export KCONFIG_OVERWRITECONFIG
=1; \
114 $< $(KCONF_FLAGS
) Config.in
117 $(_SINGLE
)$(NO_TRACE_MAKE
) -C scripts
/config
clean
119 defconfig
: scripts
/config
/conf prepare-tmpinfo FORCE
121 @if
[ ! -s .config
-a
-e
$(HOME
)/.openwrt
/defconfig
]; then cp
$(HOME
)/.openwrt
/defconfig .config
; fi
122 [ -L .config
] && export KCONFIG_OVERWRITECONFIG
=1; \
123 $< $(KCONF_FLAGS
) --defconfig
=.config Config.in
128 confdefault
:=$(confdefault-
$(CONFDEFAULT
))
130 oldconfig
: scripts
/config
/conf prepare-tmpinfo FORCE
131 [ -L .config
] && export KCONFIG_OVERWRITECONFIG
=1; \
132 $< $(KCONF_FLAGS
) --$(if
$(confdefault
),$(confdefault
),old
)config Config.in
134 menuconfig
: scripts
/config
/mconf prepare-tmpinfo FORCE
135 if
[ \
! -e .config
-a
-e
$(HOME
)/.openwrt
/defconfig
]; then \
136 cp
$(HOME
)/.openwrt
/defconfig .config
; \
138 [ -L .config
] && export KCONFIG_OVERWRITECONFIG
=1; \
141 nconfig
: scripts
/config
/nconf prepare-tmpinfo FORCE
142 if
[ \
! -e .config
-a
-e
$(HOME
)/.openwrt
/defconfig
]; then \
143 cp
$(HOME
)/.openwrt
/defconfig .config
; \
145 [ -L .config
] && export KCONFIG_OVERWRITECONFIG
=1; \
148 xconfig
: scripts
/config
/qconf prepare-tmpinfo FORCE
149 if
[ \
! -e .config
-a
-e
$(HOME
)/.openwrt
/defconfig
]; then \
150 cp
$(HOME
)/.openwrt
/defconfig .config
; \
154 prepare_kernel_conf
: .config toolchain
/install FORCE
156 ifeq ($(wildcard $(STAGING_DIR_HOST
)/bin
/quilt
),)
158 @
+$(SUBMAKE
) -r tools
/quilt
/compile
160 prepare_kernel_conf
: ;
163 kernel_oldconfig
: prepare_kernel_conf
164 $(_SINGLE
)$(NO_TRACE_MAKE
) -C target
/linux oldconfig
166 ifneq ($(DISTRO_PKG_CONFIG
),)
167 kernel_menuconfig
: export PATH
:=$(dir $(DISTRO_PKG_CONFIG
)):$(PATH
)
168 kernel_nconfig
: export PATH
:=$(dir $(DISTRO_PKG_CONFIG
)):$(PATH
)
169 kernel_xconfig
: export PATH
:=$(dir $(DISTRO_PKG_CONFIG
)):$(PATH
)
171 kernel_menuconfig
: prepare_kernel_conf
172 $(_SINGLE
)$(NO_TRACE_MAKE
) -C target
/linux menuconfig
174 kernel_nconfig
: prepare_kernel_conf
175 $(_SINGLE
)$(NO_TRACE_MAKE
) -C target
/linux nconfig
177 kernel_xconfig
: prepare_kernel_conf
178 $(_SINGLE
)$(NO_TRACE_MAKE
) -C target
/linux xconfig
180 $(STAGING_DIR_HOST
)/.prereq-build
: include/prereq-build.mk
182 @
$(_SINGLE
)$(NO_TRACE_MAKE
) -j1
-r
-s
-f
$(TOPDIR
)/include/prereq-build.mk prereq
2>/dev
/null ||
{ \
183 echo
"Prerequisite check failed. Use FORCE=1 to override."; \
186 ifneq ($(realpath
$(TOPDIR
)/include/prepare.mk
),)
187 @
$(_SINGLE
)$(NO_TRACE_MAKE
) -j1
-r
-s
-f
$(TOPDIR
)/include/prepare.mk prepare
2>/dev
/null ||
{ \
188 echo
"Preparation failed."; \
195 @
$(_SINGLE
)$(NO_TRACE_MAKE
) -p
$@ V
=99 DUMP_TARGET_DB
=1 2>&1
198 DOWNLOAD_DIRS
= tools
/download toolchain
/download package
/download target
/download
200 DOWNLOAD_DIRS
= package
/download
203 download
: .config FORCE
$(if
$(wildcard $(STAGING_DIR_HOST
)/bin
/flock
),,tools
/flock
/compile
)
204 @
+$(foreach dir,$(DOWNLOAD_DIRS
),$(SUBMAKE
) $(dir);)
206 clean dirclean
: .config
209 prereq
:: prepare-tmpinfo .config
210 @
+$(NO_TRACE_MAKE
) -r
-s
$@
213 @
+$(NO_TRACE_MAKE
) -r
-s
$@ QUIET
= V
=s
216 @
+$(NO_TRACE_MAKE
) -r
-s
$@ QUIET
= V
=s
218 WARN_PARALLEL_ERROR
= $(if
$(BUILD_LOG
),,$(and
$(filter -j
,$(MAKEFLAGS
)),$(findstring s
,$(OPENWRT_VERBOSE
))))
223 @
+$(PREP_MK
) $(NO_TRACE_MAKE
) -r
-s prereq
224 @.
/scripts
/config
/conf
$(KCONF_FLAGS
) --defconfig
=.config Config.in
225 @
+$(ULIMIT_FIX
) $(SUBMAKE
) -r
$@
230 @
+$(PREP_MK
) $(NO_TRACE_MAKE
) -r
-s prereq
232 cp .config tmp
/.config
; \
233 .
/scripts
/config
/conf
$(KCONF_FLAGS
) --defconfig
=tmp
/.config
-w tmp
/.config Config.in
> /dev
/null
2>&1; \
234 if .
/scripts
/kconfig.pl
'>' .config tmp
/.config | grep
-q CONFIG
; then \
235 printf
"$(_R)WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!$(_N)\n" >&2; \
238 @
+$(ULIMIT_FIX
) $(SUBMAKE
) -r
$@
$(if
$(WARN_PARALLEL_ERROR
), ||
{ \
239 printf
"$(_R)Build failed - please re-run with -j1 to see the real error message$(_N)\n" >&2; \
245 # update all feeds, re-create index files, install symlinks
247 .
/scripts
/feeds update
-a
248 .
/scripts
/feeds
install -a
250 # re-create index files, install symlinks
251 package
/symlinks-install
:
252 .
/scripts
/feeds update
-i
253 .
/scripts
/feeds
install -a
255 # remove all symlinks, don't touch ./feeds
256 package
/symlinks-clean
:
257 .
/scripts
/feeds
uninstall -a
263 rm -rf bin build_dir .ccache .config
* dl feeds key-build
* logs package
/feeds staging_dir tmp
264 @
$(_SINGLE
)$(SUBMAKE
) -C scripts
/config
clean
266 ifeq ($(findstring v
,$(DEBUG
)),)
267 .SILENT
: symlinkclean
clean dirclean
distclean config-clean download help tmpinfo-clean .config scripts
/config
/mconf scripts
/config
/conf menuconfig
$(STAGING_DIR_HOST
)/.prereq-build tmp
/.prereq-package prepare-tmpinfo