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 PATH
:=$(TOPDIR
)/staging_dir
/host
/bin
:$(PATH
)
18 ifneq ($(OPENWRT_BUILD
),1)
19 override OPENWRT_BUILD
=1
24 include $(INCLUDE_DIR
)/debug.mk
25 include $(INCLUDE_DIR
)/depends.mk
26 include $(INCLUDE_DIR
)/rootfs.mk
28 include $(INCLUDE_DIR
)/version.mk
30 export SOURCE_DATE_EPOCH
35 info: Show a list of available target profiles
36 clean: Remove images and temporary build files
37 image
: Build an image
(see below for more information
).
40 By default
'make image' will create an image with the default
41 target profile and package set. You can use the following parameters
44 make image PROFILE
="<profilename>" # override the default target profile
45 make image PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
46 make image FILES
="<path>" # include extra files from <path>
47 make image BIN_DIR
="<path>" # alternative output directory for the images
48 make image EXTRA_IMAGE_NAME
="<string>" # Add this to the output image filename (sanitized)
49 make image DISABLED_SERVICES
="<svc1> [<svc2> [<svc3> ..]]" # Which services in /etc/init.d/ should be disabled
50 make image ADD_LOCAL_KEY
=1 # store locally generated signing key in built images
53 List
"all" packages which
get installed into the image.
54 You can use the following parameters
:
56 make manifest PROFILE
="<profilename>" # override the default target profile
57 make manifest PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
58 make manifest STRIP_ABI
=1 # remove ABI version from printed package names
61 $(eval
$(call shexport
,Helptext
))
64 echo
"$$$(call shvar,Helptext)"
67 # override variables from rules.mk
68 PACKAGE_DIR
:=$(TOPDIR
)/packages
69 LISTS_DIR
:=$(subst $(space
),/,$(patsubst %,..
,$(subst /,$(space
),$(TARGET_DIR
))))$(DL_DIR
)
70 export OPKG_KEYS
:=$(TOPDIR
)/keys
71 OPKG
:=$(call opkg
,$(TARGET_DIR
)) \
72 -f
$(TOPDIR
)/repositories.conf \
73 --verify-program
$(SCRIPT_DIR
)/opkg-key \
75 --lists-dir
$(LISTS_DIR
)
77 include $(INCLUDE_DIR
)/target.mk
80 USER_PROFILE ?
= $(firstword $(PROFILE_NAMES
))
81 PROFILE_LIST
= $(foreach p
,$(PROFILE_NAMES
), \
82 echo
'$(patsubst DEVICE_%,%,$(p)):'; $(if
$($(p
)_NAME
),echo
' $(subst ','"'"',$($(p)_NAME))'; ) \
83 echo ' Packages: $($(p)_PACKAGES)'; echo ' hasImageMetadata: $($(p)_HAS_IMAGE_METADATA)'; \
84 $(if $($(p)_SUPPORTED_DEVICES),echo ' SupportedDevices: $($(p)_SUPPORTED_DEVICES)';) )
87 .profiles.mk: .targetinfo
88 @$(SCRIPT_DIR)/target-metadata.pl profile_mk $< '$(BOARD)$(if $(SUBTARGET),/$(SUBTARGET))' > $@
90 staging_dir/host/.prereq-build: include/prereq-build.mk
92 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq IB=1 2>/dev/null || { \
93 echo "Prerequisite
check failed. Use FORCE
=1 to
override.
"; \
96 ifneq ($(realpath $(TOPDIR)/include/prepare.mk),)
97 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \
98 echo "Preparation failed.
"; \
105 echo 'Current Target: "$(TARGETID
)"'
106 echo 'Current Architecture: "$(ARCH
)"'
107 echo 'Current Revision: "$(REVISION
)"'
108 echo 'Default Packages: $(DEFAULT_PACKAGES)'
109 echo 'Available Profiles:'
110 echo; $(PROFILE_LIST)
112 BUILD_PACKAGES:=$(USER_PACKAGES) $(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)
113 # "-pkgname
" in the package list means remove "pkgname
" from the package list
114 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
117 _call_image: staging_dir/host/.prereq-build
118 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
119 echo 'Packages: $(BUILD_PACKAGES)'
121 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
122 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
123 $(MAKE) package_reload
124 $(MAKE) package_install
125 $(MAKE) -s prepare_rootfs
126 $(MAKE) -s build_image
127 $(MAKE) -s json_overview_image_info
130 _call_manifest: FORCE
132 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
133 $(MAKE) package_reload >/dev/null
134 $(MAKE) package_install >/dev/null
135 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
139 @echo Building package index... >&2
140 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
141 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
142 gzip -9nc Packages > Packages.gz; \
143 $(if $(CONFIG_SIGNATURE_CHECK), \
144 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
145 ) >/dev/null 2>/dev/null
146 $(OPKG) update >&2 || true
149 if [ -d "$(PACKAGE_DIR
)" ] && ( \
150 [ ! -f "$(PACKAGE_DIR
)/Packages
" ] || \
151 [ ! -f "$(PACKAGE_DIR
)/Packages.gz
" ] || \
152 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
153 echo "Package list missing or not up-to-date
, generating it.
" >&2 ;\
154 $(MAKE) package_index; \
156 mkdir -p $(TARGET_DIR)/tmp; \
157 $(OPKG) update >&2 || true; \
161 @$(MAKE) -s package_reload
162 @$(OPKG) list --size 2>/dev/null
164 package_install: FORCE
166 @echo Installing packages...
167 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
168 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
169 $(OPKG) install $(BUILD_PACKAGES)
171 prepare_rootfs: FORCE
173 @echo Finalizing root filesystem...
175 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
176 $(if $(CONFIG_SIGNATURE_CHECK), \
177 $(if $(ADD_LOCAL_KEY), \
178 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
179 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
182 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
186 @echo Building images...
187 rm -rf $(BUILD_DIR)/json_info_files/
188 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
189 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)")
191 $(BIN_DIR)/profiles.json: FORCE
192 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
193 WORK_DIR=$(BUILD_DIR)/json_info_files \
194 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
197 json_overview_image_info: $(BIN_DIR)/profiles.json
201 @echo Calculating checksums...
202 @$(call sha256sums,$(BIN_DIR))
205 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
209 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
211 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
213 _check_profile: FORCE
215 ifeq ($(PROFILE_FILTER),)
216 @echo 'Profile "$(PROFILE
)" does not exist!'
217 @echo 'Use "make
info" to get a list of available profile names.'
223 ifneq ($(CONFIG_SIGNATURE_CHECK),)
224 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
225 echo Generate local signing keys... >&2; \
226 $(STAGING_DIR_HOST)/bin/usign -G \
227 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
228 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
230 if [ ! -s $(BUILD_KEY).ucert ]; then \
231 echo Generate local certificate... >&2; \
232 $(STAGING_DIR_HOST)/bin/ucert -I \
233 -c $(BUILD_KEY).ucert \
234 -p $(BUILD_KEY).pub \
240 $(MAKE) -s _check_profile
241 $(MAKE) -s _check_keys
242 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
243 $(MAKE) -s _call_image \
244 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
245 $(if $(FILES),USER_FILES="$(FILES
)") \
246 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
247 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
248 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)"))
251 $(MAKE) -s _check_profile
252 $(MAKE) -s _check_keys
253 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
254 $(MAKE) -s _call_manifest \
255 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
256 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
260 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
263 @$(MAKE) -s package_reload
264 @$(OPKG) whatdepends -A $(PACKAGE)
266 .SILENT: help info image manifest whatdepends