3 # Copyright (C) 2007-2015 OpenWrt.org
5 # This is free software, licensed under the GNU General Public License v2.
6 # See /LICENSE for more information.
12 export TOPDIR LC_ALL LANG
13 export OPENWRT_VERBOSE
=s
16 export ORIG_PATH
:=$(if
$(ORIG_PATH
),$(ORIG_PATH
),$(PATH
))
17 export PATH
:=$(TOPDIR
)/staging_dir
/host
/bin
:$(PATH
)
19 ifneq ($(OPENWRT_BUILD
),1)
20 override OPENWRT_BUILD
=1
25 include $(INCLUDE_DIR
)/debug.mk
26 include $(INCLUDE_DIR
)/depends.mk
27 include $(INCLUDE_DIR
)/rootfs.mk
29 include $(INCLUDE_DIR
)/version.mk
31 export SOURCE_DATE_EPOCH
36 info: Show a list of available target profiles
37 clean: Remove images and temporary build files
38 image
: Build an image
(see below for more information
).
39 manifest
: Show
all package that will be installed into the image
40 package_whatdepends
: Show which packages have a dependency on this
41 package_depends
: Show installation dependency of the package
44 By default
'make image' will create an image with the default
45 target profile and package set. You can use the following parameters
48 make image PROFILE
="<profilename>" # override the default target profile
49 make image PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
50 make image FILES
="<path>" # include extra files from <path>
51 make image BIN_DIR
="<path>" # alternative output directory for the images
52 make image EXTRA_IMAGE_NAME
="<string>" # Add this to the output image filename (sanitized)
53 make image DISABLED_SERVICES
="<svc1> [<svc2> [<svc3> ..]]" # Which services in /etc/init.d/ should be disabled
54 make image ADD_LOCAL_KEY
=1 # store locally generated signing key in built images
55 make image ROOTFS_PARTSIZE
="<size>" # override the default rootfs partition size in MegaBytes
58 List
"all" packages which
get installed into the image.
59 You can use the following parameters
:
61 make manifest PROFILE
="<profilename>" # override the default target profile
62 make manifest PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
63 make manifest STRIP_ABI
=1 # remove ABI version from printed package names
67 List
"all" packages that have a dependency on this package
68 You can use the following parameters
:
70 make package_whatdepends PACKAGE
="<pkg>"
73 List
"all" packages dependency of the package
74 You can use the following parameters
:
76 make package_depends PACKAGE
="<pkg>"
79 $(eval
$(call shexport
,Helptext
))
82 echo
"$$$(call shvar,Helptext)"
85 # override variables from rules.mk
86 PACKAGE_DIR
:=$(TOPDIR
)/packages
87 LISTS_DIR
:=$(subst $(space
),/,$(patsubst %,..
,$(subst /,$(space
),$(TARGET_DIR
))))$(DL_DIR
)
88 export OPKG_KEYS
:=$(TOPDIR
)/keys
89 OPKG
:=$(call opkg
,$(TARGET_DIR
)) \
90 -f
$(TOPDIR
)/repositories.conf \
91 --verify-program
$(SCRIPT_DIR
)/opkg-key \
93 --lists-dir
$(LISTS_DIR
)
95 include $(INCLUDE_DIR
)/target.mk
98 USER_PROFILE ?
= $(firstword $(PROFILE_NAMES
))
99 PROFILE_LIST
= $(foreach p
,$(PROFILE_NAMES
), \
100 echo
'$(patsubst DEVICE_%,%,$(p)):'; $(if
$($(p
)_NAME
),echo
' $(subst ','"'"',$($(p)_NAME))'; ) \
101 echo ' Packages: $($(p)_PACKAGES)'; echo ' hasImageMetadata: $($(p)_HAS_IMAGE_METADATA)'; \
102 $(if $($(p)_SUPPORTED_DEVICES),echo ' SupportedDevices: $($(p)_SUPPORTED_DEVICES)';) )
105 .profiles.mk: .targetinfo
106 @$(SCRIPT_DIR)/target-metadata.pl profile_mk $< '$(BOARD)/$(SUBTARGET)' > $@
108 staging_dir/host/.prereq-build: include/prereq-build.mk
110 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq IB=1 2>/dev/null || { \
111 echo "Prerequisite
check failed. Use FORCE
=1 to
override.
"; \
114 ifneq ($(realpath $(TOPDIR)/include/prepare.mk),)
115 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \
116 echo "Preparation failed.
"; \
123 echo 'Current Target: "$(TARGETID
)"'
124 echo 'Current Architecture: "$(ARCH
)"'
125 echo 'Current Revision: "$(REVISION
)"'
126 echo 'Default Packages: $(DEFAULT_PACKAGES)'
127 echo 'Available Profiles:'
128 echo; $(PROFILE_LIST)
130 BUILD_PACKAGES:=$(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)
131 # "-pkgname
" in the package list means remove "pkgname
" from the package list
132 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
133 BUILD_PACKAGES:=$(USER_PACKAGES) $(BUILD_PACKAGES)
134 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
137 _call_image: staging_dir/host/.prereq-build
138 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
139 echo 'Packages: $(BUILD_PACKAGES)'
141 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
142 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
143 $(MAKE) package_reload
144 $(MAKE) package_install
145 $(MAKE) -s prepare_rootfs
146 $(MAKE) -s build_image
147 $(MAKE) -s json_overview_image_info
150 _call_manifest: FORCE
152 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
153 $(MAKE) package_reload >/dev/null
154 $(MAKE) package_install >/dev/null
155 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
159 @echo Building package index... >&2
160 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
161 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
162 gzip -9nc Packages > Packages.gz; \
163 $(if $(CONFIG_SIGNATURE_CHECK), \
164 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
165 ) >/dev/null 2>/dev/null
166 $(OPKG) update >&2 || true
169 if [ -d "$(PACKAGE_DIR
)" ] && ( \
170 [ ! -f "$(PACKAGE_DIR
)/Packages
" ] || \
171 [ ! -f "$(PACKAGE_DIR
)/Packages.gz
" ] || \
172 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
173 echo "Package list missing or not up-to-date
, generating it.
" >&2 ;\
174 $(MAKE) package_index; \
176 mkdir -p $(TARGET_DIR)/tmp; \
177 $(OPKG) update >&2 || true; \
181 @$(MAKE) -s package_reload
182 @$(OPKG) list --size 2>/dev/null
184 package_install: FORCE
186 @echo Installing packages...
187 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
188 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
189 $(OPKG) install $(BUILD_PACKAGES)
191 prepare_rootfs: FORCE
193 @echo Finalizing root filesystem...
195 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
196 $(if $(CONFIG_SIGNATURE_CHECK), \
197 $(if $(ADD_LOCAL_KEY), \
198 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
199 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
202 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
206 @echo Building images...
207 rm -rf $(BUILD_DIR)/json_info_files/
208 if [ -d "target
/linux
/feeds
/$(BOARD
)" ]; then \
209 $(NO_TRACE_MAKE) -C target/linux/feeds/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
210 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)"); \
212 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
213 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)"); \
216 $(BIN_DIR)/profiles.json: FORCE
217 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
218 WORK_DIR=$(BUILD_DIR)/json_info_files \
219 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
222 json_overview_image_info: $(BIN_DIR)/profiles.json
226 @echo Calculating checksums...
227 @$(call sha256sums,$(BIN_DIR))
230 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
234 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
236 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
238 _check_profile: FORCE
240 ifeq ($(PROFILE_FILTER),)
241 @echo 'Profile "$(PROFILE
)" does not exist!'
242 @echo 'Use "make
info" to get a list of available profile names.'
248 ifneq ($(CONFIG_SIGNATURE_CHECK),)
249 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
250 echo Generate local signing keys... >&2; \
251 $(STAGING_DIR_HOST)/bin/usign -G \
252 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
253 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
255 if [ ! -s $(BUILD_KEY).ucert ]; then \
256 echo Generate local certificate... >&2; \
257 $(STAGING_DIR_HOST)/bin/ucert -I \
258 -c $(BUILD_KEY).ucert \
259 -p $(BUILD_KEY).pub \
265 $(MAKE) -s _check_profile
266 $(MAKE) -s _check_keys
267 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
268 $(MAKE) -s _call_image \
269 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
270 $(if $(FILES),USER_FILES="$(FILES
)") \
271 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
272 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
273 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)") \
274 $(if $(ROOTFS_PARTSIZE),CONFIG_TARGET_ROOTFS_PARTSIZE="$(ROOTFS_PARTSIZE
)"))
277 $(MAKE) -s _check_profile
278 $(MAKE) -s _check_keys
279 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
280 $(MAKE) -s _call_manifest \
281 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
282 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
284 package_whatdepends: FORCE
286 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
289 @$(MAKE) -s package_reload
290 @$(OPKG) whatdepends -A $(PACKAGE)
292 package_depends: FORCE
294 @echo 'Variable `PACKAGE` is not set but required by `package_depends`'
297 @$(MAKE) -s package_reload
298 @$(OPKG) depends -A $(PACKAGE)
301 .SILENT: help info image manifest package_whatdepends package_depends