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:=$(USER_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))
135 _call_image: staging_dir/host/.prereq-build
136 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
137 echo 'Packages: $(BUILD_PACKAGES)'
139 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
140 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
141 $(MAKE) package_reload
142 $(MAKE) package_install
143 $(MAKE) -s prepare_rootfs
144 $(MAKE) -s build_image
145 $(MAKE) -s json_overview_image_info
148 _call_manifest: FORCE
150 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
151 $(MAKE) package_reload >/dev/null
152 $(MAKE) package_install >/dev/null
153 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
157 @echo Building package index... >&2
158 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
159 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
160 gzip -9nc Packages > Packages.gz; \
161 $(if $(CONFIG_SIGNATURE_CHECK), \
162 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
163 ) >/dev/null 2>/dev/null
164 $(OPKG) update >&2 || true
167 if [ -d "$(PACKAGE_DIR
)" ] && ( \
168 [ ! -f "$(PACKAGE_DIR
)/Packages
" ] || \
169 [ ! -f "$(PACKAGE_DIR
)/Packages.gz
" ] || \
170 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
171 echo "Package list missing or not up-to-date
, generating it.
" >&2 ;\
172 $(MAKE) package_index; \
174 mkdir -p $(TARGET_DIR)/tmp; \
175 $(OPKG) update >&2 || true; \
179 @$(MAKE) -s package_reload
180 @$(OPKG) list --size 2>/dev/null
182 package_install: FORCE
184 @echo Installing packages...
185 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
186 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
187 $(OPKG) install $(BUILD_PACKAGES)
189 prepare_rootfs: FORCE
191 @echo Finalizing root filesystem...
193 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
194 $(if $(CONFIG_SIGNATURE_CHECK), \
195 $(if $(ADD_LOCAL_KEY), \
196 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
197 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
200 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
204 @echo Building images...
205 rm -rf $(BUILD_DIR)/json_info_files/
206 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
207 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)")
209 $(BIN_DIR)/profiles.json: FORCE
210 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
211 WORK_DIR=$(BUILD_DIR)/json_info_files \
212 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
215 json_overview_image_info: $(BIN_DIR)/profiles.json
219 @echo Calculating checksums...
220 @$(call sha256sums,$(BIN_DIR))
223 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
227 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
229 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
231 _check_profile: FORCE
233 ifeq ($(PROFILE_FILTER),)
234 @echo 'Profile "$(PROFILE
)" does not exist!'
235 @echo 'Use "make
info" to get a list of available profile names.'
241 ifneq ($(CONFIG_SIGNATURE_CHECK),)
242 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
243 echo Generate local signing keys... >&2; \
244 $(STAGING_DIR_HOST)/bin/usign -G \
245 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
246 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
248 if [ ! -s $(BUILD_KEY).ucert ]; then \
249 echo Generate local certificate... >&2; \
250 $(STAGING_DIR_HOST)/bin/ucert -I \
251 -c $(BUILD_KEY).ucert \
252 -p $(BUILD_KEY).pub \
258 $(MAKE) -s _check_profile
259 $(MAKE) -s _check_keys
260 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
261 $(MAKE) -s _call_image \
262 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
263 $(if $(FILES),USER_FILES="$(FILES
)") \
264 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
265 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
266 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)") \
267 $(if $(ROOTFS_PARTSIZE),CONFIG_TARGET_ROOTFS_PARTSIZE="$(ROOTFS_PARTSIZE
)"))
270 $(MAKE) -s _check_profile
271 $(MAKE) -s _check_keys
272 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
273 $(MAKE) -s _call_manifest \
274 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
275 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
277 package_whatdepends: FORCE
279 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
282 @$(MAKE) -s package_reload
283 @$(OPKG) whatdepends -A $(PACKAGE)
285 package_depends: FORCE
287 @echo 'Variable `PACKAGE` is not set but required by `package_depends`'
290 @$(MAKE) -s package_reload
291 @$(OPKG) depends -A $(PACKAGE)
294 .SILENT: help info image manifest package_whatdepends package_depends