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 ln -sf $(TOPDIR)/package $(TOPDIR)/feeds/base
111 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq IB=1 2>/dev/null || { \
112 echo "Prerequisite
check failed. Use FORCE
=1 to
override.
"; \
115 ifneq ($(realpath $(TOPDIR)/include/prepare.mk),)
116 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \
117 echo "Preparation failed.
"; \
124 echo 'Current Target: "$(TARGETID
)"'
125 echo 'Current Architecture: "$(ARCH
)"'
126 echo 'Current Revision: "$(REVISION
)"'
127 echo 'Default Packages: $(DEFAULT_PACKAGES)'
128 echo 'Available Profiles:'
129 echo; $(PROFILE_LIST)
131 BUILD_PACKAGES:=$(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)
132 # "-pkgname
" in the package list means remove "pkgname
" from the package list
133 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
134 BUILD_PACKAGES:=$(USER_PACKAGES) $(BUILD_PACKAGES)
135 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
138 _call_image: staging_dir/host/.prereq-build
139 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
140 echo 'Packages: $(BUILD_PACKAGES)'
142 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
143 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
144 $(MAKE) package_reload
145 $(MAKE) package_install
146 $(MAKE) -s prepare_rootfs
147 $(MAKE) -s build_image
148 $(MAKE) -s json_overview_image_info
151 _call_manifest: FORCE
153 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
154 $(MAKE) package_reload >/dev/null
155 $(MAKE) package_install >/dev/null
156 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
160 @echo Building package index... >&2
161 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
162 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
163 gzip -9nc Packages > Packages.gz; \
164 $(if $(CONFIG_SIGNATURE_CHECK), \
165 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
166 ) >/dev/null 2>/dev/null
167 $(OPKG) update >&2 || true
170 if [ -d "$(PACKAGE_DIR
)" ] && ( \
171 [ ! -f "$(PACKAGE_DIR
)/Packages
" ] || \
172 [ ! -f "$(PACKAGE_DIR
)/Packages.gz
" ] || \
173 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
174 echo "Package list missing or not up-to-date
, generating it.
" >&2 ;\
175 $(MAKE) package_index; \
177 mkdir -p $(TARGET_DIR)/tmp; \
178 $(OPKG) update >&2 || true; \
182 @$(MAKE) -s package_reload
183 @$(OPKG) list --size 2>/dev/null
185 package_install: FORCE
187 @echo Installing packages...
188 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
189 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
190 $(OPKG) install $(BUILD_PACKAGES)
192 prepare_rootfs: FORCE
194 @echo Finalizing root filesystem...
196 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
197 $(if $(CONFIG_SIGNATURE_CHECK), \
198 $(if $(ADD_LOCAL_KEY), \
199 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
200 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
203 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
207 @echo Building images...
208 rm -rf $(BUILD_DIR)/json_info_files/
209 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
210 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)")
212 $(BIN_DIR)/profiles.json: FORCE
213 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
214 WORK_DIR=$(BUILD_DIR)/json_info_files \
215 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
218 json_overview_image_info: $(BIN_DIR)/profiles.json
222 @echo Calculating checksums...
223 @$(call sha256sums,$(BIN_DIR))
226 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
230 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
232 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
234 _check_profile: FORCE
236 ifeq ($(PROFILE_FILTER),)
237 @echo 'Profile "$(PROFILE
)" does not exist!'
238 @echo 'Use "make
info" to get a list of available profile names.'
244 ifneq ($(CONFIG_SIGNATURE_CHECK),)
245 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
246 echo Generate local signing keys... >&2; \
247 $(STAGING_DIR_HOST)/bin/usign -G \
248 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
249 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
251 if [ ! -s $(BUILD_KEY).ucert ]; then \
252 echo Generate local certificate... >&2; \
253 $(STAGING_DIR_HOST)/bin/ucert -I \
254 -c $(BUILD_KEY).ucert \
255 -p $(BUILD_KEY).pub \
261 $(MAKE) -s _check_profile
262 $(MAKE) -s _check_keys
263 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
264 $(MAKE) -s _call_image \
265 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
266 $(if $(FILES),USER_FILES="$(FILES
)") \
267 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
268 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
269 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)") \
270 $(if $(ROOTFS_PARTSIZE),CONFIG_TARGET_ROOTFS_PARTSIZE="$(ROOTFS_PARTSIZE
)"))
273 $(MAKE) -s _check_profile
274 $(MAKE) -s _check_keys
275 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
276 $(MAKE) -s _call_manifest \
277 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
278 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
280 package_whatdepends: FORCE
282 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
285 @$(MAKE) -s package_reload
286 @$(OPKG) whatdepends -A $(PACKAGE)
288 package_depends: FORCE
290 @echo 'Variable `PACKAGE` is not set but required by `package_depends`'
293 @$(MAKE) -s package_reload
294 @$(OPKG) depends -A $(PACKAGE)
297 .SILENT: help info image manifest package_whatdepends package_depends