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)$(if $(SUBTARGET),/$(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 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
209 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)")
211 $(BIN_DIR)/profiles.json: FORCE
212 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
213 WORK_DIR=$(BUILD_DIR)/json_info_files \
214 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
217 json_overview_image_info: $(BIN_DIR)/profiles.json
221 @echo Calculating checksums...
222 @$(call sha256sums,$(BIN_DIR))
225 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
229 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
231 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
233 _check_profile: FORCE
235 ifeq ($(PROFILE_FILTER),)
236 @echo 'Profile "$(PROFILE
)" does not exist!'
237 @echo 'Use "make
info" to get a list of available profile names.'
243 ifneq ($(CONFIG_SIGNATURE_CHECK),)
244 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
245 echo Generate local signing keys... >&2; \
246 $(STAGING_DIR_HOST)/bin/usign -G \
247 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
248 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
250 if [ ! -s $(BUILD_KEY).ucert ]; then \
251 echo Generate local certificate... >&2; \
252 $(STAGING_DIR_HOST)/bin/ucert -I \
253 -c $(BUILD_KEY).ucert \
254 -p $(BUILD_KEY).pub \
260 $(MAKE) -s _check_profile
261 $(MAKE) -s _check_keys
262 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
263 $(MAKE) -s _call_image \
264 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
265 $(if $(FILES),USER_FILES="$(FILES
)") \
266 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
267 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
268 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)") \
269 $(if $(ROOTFS_PARTSIZE),CONFIG_TARGET_ROOTFS_PARTSIZE="$(ROOTFS_PARTSIZE
)"))
272 $(MAKE) -s _check_profile
273 $(MAKE) -s _check_keys
274 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
275 $(MAKE) -s _call_manifest \
276 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
277 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
279 package_whatdepends: FORCE
281 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
284 @$(MAKE) -s package_reload
285 @$(OPKG) whatdepends -A $(PACKAGE)
287 package_depends: FORCE
289 @echo 'Variable `PACKAGE` is not set but required by `package_depends`'
292 @$(MAKE) -s package_reload
293 @$(OPKG) depends -A $(PACKAGE)
296 .SILENT: help info image manifest package_whatdepends package_depends