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
34 info: Show a list of available target profiles
35 clean: Remove images and temporary build files
36 image
: Build an image
(see below for more information
).
39 By default
'make image' will create an image with the default
40 target profile and package set. You can use the following parameters
43 make image PROFILE
="<profilename>" # override the default target profile
44 make image PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
45 make image FILES
="<path>" # include extra files from <path>
46 make image BIN_DIR
="<path>" # alternative output directory for the images
47 make image EXTRA_IMAGE_NAME
="<string>" # Add this to the output image filename (sanitized)
48 make image DISABLED_SERVICES
="<svc1> [<svc2> [<svc3> ..]]" # Which services in /etc/init.d/ should be disabled
49 make image ADD_LOCAL_KEY
=1 # store locally generated signing key in built images
52 List
"all" packages which
get installed into the image.
53 You can use the following parameters
:
55 make manifest PROFILE
="<profilename>" # override the default target profile
56 make manifest PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
57 make manifest STRIP_ABI
=1 # remove ABI version from printed package names
60 $(eval
$(call shexport
,Helptext
))
63 echo
"$$$(call shvar,Helptext)"
66 # override variables from rules.mk
67 PACKAGE_DIR
:=$(TOPDIR
)/packages
68 LISTS_DIR
:=$(subst $(space
),/,$(patsubst %,..
,$(subst /,$(space
),$(TARGET_DIR
))))$(DL_DIR
)
69 export OPKG_KEYS
:=$(TOPDIR
)/keys
70 OPKG
:=$(call opkg
,$(TARGET_DIR
)) \
71 -f
$(TOPDIR
)/repositories.conf \
72 --verify-program
$(SCRIPT_DIR
)/opkg-key \
74 --lists-dir
$(LISTS_DIR
)
76 include $(INCLUDE_DIR
)/target.mk
79 USER_PROFILE ?
= $(firstword $(PROFILE_NAMES
))
80 PROFILE_LIST
= $(foreach p
,$(PROFILE_NAMES
), \
81 echo
'$(patsubst DEVICE_%,%,$(p)):'; $(if
$($(p
)_NAME
),echo
' $(subst ','"'"',$($(p)_NAME))'; ) \
82 echo ' Packages: $($(p)_PACKAGES)'; echo ' hasImageMetadata: $($(p)_HAS_IMAGE_METADATA)'; \
83 $(if $($(p)_SUPPORTED_DEVICES),echo ' SupportedDevices: $($(p)_SUPPORTED_DEVICES)';) )
86 .profiles.mk: .targetinfo
87 @$(SCRIPT_DIR)/target-metadata.pl profile_mk $< '$(BOARD)$(if $(SUBTARGET),/$(SUBTARGET))' > $@
89 staging_dir/host/.prereq-build: include/prereq-build.mk
91 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq IB=1 2>/dev/null || { \
92 echo "Prerequisite
check failed. Use FORCE
=1 to
override.
"; \
95 ifneq ($(realpath $(TOPDIR)/include/prepare.mk),)
96 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \
97 echo "Preparation failed.
"; \
104 echo 'Current Target: "$(TARGETID
)"'
105 echo 'Current Architecture: "$(ARCH
)"'
106 echo 'Current Revision: "$(REVISION
)"'
107 echo 'Default Packages: $(DEFAULT_PACKAGES)'
108 echo 'Available Profiles:'
109 echo; $(PROFILE_LIST)
111 BUILD_PACKAGES:=$(USER_PACKAGES) $(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)
112 # "-pkgname
" in the package list means remove "pkgname
" from the package list
113 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
116 _call_image: staging_dir/host/.prereq-build
117 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
118 echo 'Packages: $(BUILD_PACKAGES)'
120 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
121 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
122 $(MAKE) package_reload
123 $(MAKE) package_install
124 $(MAKE) -s prepare_rootfs
125 $(MAKE) -s build_image
126 $(MAKE) -s json_overview_image_info
129 _call_manifest: FORCE
131 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
132 $(MAKE) package_reload >/dev/null
133 $(MAKE) package_install >/dev/null
134 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
138 @echo Building package index... >&2
139 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
140 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
141 gzip -9nc Packages > Packages.gz; \
142 $(if $(CONFIG_SIGNATURE_CHECK), \
143 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
144 ) >/dev/null 2>/dev/null
145 $(OPKG) update >&2 || true
148 if [ -d "$(PACKAGE_DIR
)" ] && ( \
149 [ ! -f "$(PACKAGE_DIR
)/Packages
" ] || \
150 [ ! -f "$(PACKAGE_DIR
)/Packages.gz
" ] || \
151 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
152 echo "Package list missing or not up-to-date
, generating it.
" >&2 ;\
153 $(MAKE) package_index; \
155 mkdir -p $(TARGET_DIR)/tmp; \
156 $(OPKG) update >&2 || true; \
160 @$(MAKE) -s package_reload
161 @$(OPKG) list --size 2>/dev/null
163 package_install: FORCE
165 @echo Installing packages...
166 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
167 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
168 $(OPKG) install $(BUILD_PACKAGES)
170 prepare_rootfs: FORCE
172 @echo Finalizing root filesystem...
174 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
175 $(if $(CONFIG_SIGNATURE_CHECK), \
176 $(if $(ADD_LOCAL_KEY), \
177 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
178 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
181 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
185 @echo Building images...
186 rm -rf $(BUILD_DIR)/json_info_files/
187 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
188 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)")
190 $(BIN_DIR)/profiles.json: FORCE
191 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
192 WORK_DIR=$(BUILD_DIR)/json_info_files \
193 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
196 json_overview_image_info: $(BIN_DIR)/profiles.json
200 @echo Calculating checksums...
201 @$(call sha256sums,$(BIN_DIR))
204 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
208 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
210 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
212 _check_profile: FORCE
214 ifeq ($(PROFILE_FILTER),)
215 @echo 'Profile "$(PROFILE
)" does not exist!'
216 @echo 'Use "make
info" to get a list of available profile names.'
222 ifneq ($(CONFIG_SIGNATURE_CHECK),)
223 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
224 echo Generate local signing keys... >&2; \
225 $(STAGING_DIR_HOST)/bin/usign -G \
226 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
227 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
229 if [ ! -s $(BUILD_KEY).ucert ]; then \
230 echo Generate local certificate... >&2; \
231 $(STAGING_DIR_HOST)/bin/ucert -I \
232 -c $(BUILD_KEY).ucert \
233 -p $(BUILD_KEY).pub \
239 $(MAKE) -s _check_profile
240 $(MAKE) -s _check_keys
241 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
242 $(MAKE) -s _call_image \
243 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
244 $(if $(FILES),USER_FILES="$(FILES
)") \
245 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
246 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
247 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)"))
250 $(MAKE) -s _check_profile
251 $(MAKE) -s _check_keys
252 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
253 $(MAKE) -s _call_manifest \
254 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
255 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
259 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
262 @$(MAKE) -s package_reload
263 @$(OPKG) whatdepends -A $(PACKAGE)
265 .SILENT: help info image manifest whatdepends