# Makefile for OpenWrt # # Copyright (C) 2007-2012 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # PREP_MK= OPENWRT_BUILD= QUIET=0 export IS_TTY=$(shell tty -s && echo 1 || echo 0) include $(TOPDIR)/include/verbose.mk ifeq ($(SDK),1) include $(TOPDIR)/include/version.mk else REVISION:=$(shell $(TOPDIR)/scripts/getver.sh) endif HOSTCC ?= $(CC) export REVISION export GIT_CONFIG_PARAMETERS='core.autocrlf=false' export MAKE_JOBSERVER=$(filter --jobserver%,$(MAKEFLAGS)) export SOURCE_DATE_EPOCH:=$(shell $(TOPDIR)/scripts/get_source_date_epoch.sh) # prevent perforce from messing with the patch utility unexport P4PORT P4USER P4CONFIG P4CLIENT # prevent user defaults for quilt from interfering unexport QUILT_PATCHES QUILT_PATCH_OPTS unexport C_INCLUDE_PATH CROSS_COMPILE ARCH # prevent distro default LPATH from interfering unexport LPATH # make sure that a predefined CFLAGS variable does not disturb packages export CFLAGS= export LDFLAGS= empty:= space:= $(empty) $(empty) path:=$(subst :,$(space),$(PATH)) path:=$(filter-out .%,$(path)) path:=$(subst $(space),:,$(path)) export PATH:=$(path) unexport TAR_OPTIONS ifneq ($(shell $(HOSTCC) 2>&1 | grep clang),) export HOSTCC_REAL?=$(HOSTCC) export HOSTCC_WRAPPER:=$(TOPDIR)/scripts/clang-gcc-wrapper else export HOSTCC_WRAPPER:=$(HOSTCC) endif ifeq ($(FORCE),) .config scripts/config/conf scripts/config/mconf: staging_dir/host/.prereq-build endif SCAN_COOKIE?=$(shell echo $$$$) export SCAN_COOKIE SUBMAKE:=umask 022; $(SUBMAKE) ULIMIT_FIX=_limit=`ulimit -n`; [ "$$_limit" = "unlimited" -o "$$_limit" -ge 1024 ] || ulimit -n 1024; prepare-mk: FORCE ; ifdef SDK IGNORE_PACKAGES = linux endif _ignore = $(foreach p,$(IGNORE_PACKAGES),--ignore $(p)) prepare-tmpinfo: FORCE @+$(MAKE) -r -s staging_dir/host/.prereq-build $(PREP_MK) mkdir -p tmp/info $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPS="$(TOPDIR)/include/package*.mk $(TOPDIR)/overlay/*/*.mk" SCAN_DEPTH=5 SCAN_EXTRA="" $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPS="image/Makefile profiles/*.mk $(TOPDIR)/include/kernel*.mk $(TOPDIR)/include/target.mk" SCAN_DEPTH=2 SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1" for type in package target; do \ f=tmp/.$${type}info; t=tmp/.config-$${type}.in; \ [ "$$t" -nt "$$f" ] || ./scripts/$${type}-metadata.pl $(_ignore) config "$$f" > "$$t" || { rm -f "$$t"; echo "Failed to build $$t"; false; break; }; \ done [ tmp/.config-feeds.in -nt tmp/.packagesubdirs ] || ./scripts/feeds feed_config > tmp/.config-feeds.in ./scripts/package-metadata.pl mk tmp/.packageinfo > tmp/.packagedeps || { rm -f tmp/.packagedeps; false; } ./scripts/package-metadata.pl subdirs tmp/.packageinfo > tmp/.packagesubdirs || { rm -f tmp/.packagesubdirs; false; } touch $(TOPDIR)/tmp/.build .config: ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo) @+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \ [ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \ $(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \ fi scripts/config/mconf: @$(_SINGLE)$(SUBMAKE) -s -C scripts/config all CC="$(HOSTCC_WRAPPER)" $(eval $(call rdep,scripts/config,scripts/config/mconf)) scripts/config/conf: @$(_SINGLE)$(SUBMAKE) -s -C scripts/config conf CC="$(HOSTCC_WRAPPER)" config: scripts/config/conf prepare-tmpinfo FORCE $< Config.in config-clean: FORCE $(_SINGLE)$(NO_TRACE_MAKE) -C scripts/config clean defconfig: scripts/config/conf prepare-tmpinfo FORCE touch .config @if [ -e $(HOME)/.openwrt/defconfig ]; then cp $(HOME)/.openwrt/defconfig .config; fi $< --defconfig=.config Config.in confdefault-y=allyes confdefault-m=allmod confdefault-n=allno confdefault:=$(confdefault-$(CONFDEFAULT)) oldconfig: scripts/config/conf prepare-tmpinfo FORCE $< --$(if $(confdefault),$(confdefault),old)config Config.in menuconfig: scripts/config/mconf prepare-tmpinfo FORCE if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \ cp $(HOME)/.openwrt/defconfig .config; \ fi $< Config.in prepare_kernel_conf: .config FORCE ifeq ($(wildcard staging_dir/host/bin/quilt),) prepare_kernel_conf: @+$(SUBMAKE) -r tools/quilt/install else prepare_kernel_conf: ; endif kernel_oldconfig: prepare_kernel_conf $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux oldconfig kernel_menuconfig: prepare_kernel_conf $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig kernel_nconfig: prepare_kernel_conf $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux nconfig staging_dir/host/.prereq-build: include/prereq-build.mk mkdir -p tmp rm -f tmp/.host.mk @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \ echo "Prerequisite check failed. Use FORCE=1 to override."; \ false; \ } ifneq ($(realpath $(TOPDIR)/include/prepare.mk),) @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \ echo "Preparation failed."; \ false; \ } endif touch $@ printdb: FORCE @$(_SINGLE)$(NO_TRACE_MAKE) -p $@ V=99 DUMP_TARGET_DB=1 2>&1 ifndef SDK DOWNLOAD_DIRS = tools/download toolchain/download package/download target/download else DOWNLOAD_DIRS = package/download endif download: .config FORCE @+$(foreach dir,$(DOWNLOAD_DIRS),$(SUBMAKE) $(dir);) clean dirclean: .config @+$(SUBMAKE) -r $@ prereq:: prepare-tmpinfo .config @+$(NO_TRACE_MAKE) -r -s $@ WARN_PARALLEL_ERROR = $(if $(BUILD_LOG),,$(and $(filter -j,$(MAKEFLAGS)),$(findstring s,$(OPENWRT_VERBOSE)))) ifeq ($(SDK),1) %:: @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq @./scripts/config/conf --defconfig=.config Config.in @+$(ULIMIT_FIX) $(SUBMAKE) -r $@ else %:: @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq @( \ cp .config tmp/.config; \ ./scripts/config/conf --defconfig=tmp/.config -w tmp/.config Config.in > /dev/null 2>&1; \ if ./scripts/kconfig.pl '>' .config tmp/.config | grep -q CONFIG; then \ printf "$(_R)WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!$(_N)\n" >&2; \ fi \ ) @+$(ULIMIT_FIX) $(SUBMAKE) -r $@ $(if $(WARN_PARALLEL_ERROR), || { \ printf "$(_R)Build failed - please re-run with -j1 to see the real error message$(_N)\n" >&2; \ false; \ } ) endif # update all feeds, re-create index files, install symlinks package/symlinks: ./scripts/feeds update -a ./scripts/feeds install -a # re-create index files, install symlinks package/symlinks-install: ./scripts/feeds update -i ./scripts/feeds install -a # remove all symlinks, don't touch ./feeds package/symlinks-clean: ./scripts/feeds uninstall -a help: cat README docs docs/compile: FORCE @$(_SINGLE)$(SUBMAKE) -C docs compile docs/clean: FORCE @$(_SINGLE)$(SUBMAKE) -C docs clean distclean: rm -rf bin build_dir .config* dl feeds key-build* logs package/feeds package/openwrt-packages staging_dir tmp @$(_SINGLE)$(SUBMAKE) -C scripts/config clean ifeq ($(findstring v,$(DEBUG)),) .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 endif .PHONY: help FORCE .NOTPARALLEL: >103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190