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
).
38 package_depends
: Show installation dependency of the package
41 By default
'make image' will create an image with the default
42 target profile and package set. You can use the following parameters
45 make image PROFILE
="<profilename>" # override the default target profile
46 make image PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
47 make image FILES
="<path>" # include extra files from <path>
48 make image BIN_DIR
="<path>" # alternative output directory for the images
49 make image EXTRA_IMAGE_NAME
="<string>" # Add this to the output image filename (sanitized)
50 make image DISABLED_SERVICES
="<svc1> [<svc2> [<svc3> ..]]" # Which services in /etc/init.d/ should be disabled
51 make image ADD_LOCAL_KEY
=1 # store locally generated signing key in built images
54 List
"all" packages which
get installed into the image.
55 You can use the following parameters
:
57 make manifest PROFILE
="<profilename>" # override the default target profile
58 make manifest PACKAGES
="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
59 make manifest STRIP_ABI
=1 # remove ABI version from printed package names
62 List
"all" packages dependency of the package
63 You can use the following parameters
:
65 make package_depends PACKAGE
="<pkg>"
68 $(eval
$(call shexport
,Helptext
))
71 echo
"$$$(call shvar,Helptext)"
74 # override variables from rules.mk
75 PACKAGE_DIR
:=$(TOPDIR
)/packages
76 LISTS_DIR
:=$(subst $(space
),/,$(patsubst %,..
,$(subst /,$(space
),$(TARGET_DIR
))))$(DL_DIR
)
77 export OPKG_KEYS
:=$(TOPDIR
)/keys
78 OPKG
:=$(call opkg
,$(TARGET_DIR
)) \
79 -f
$(TOPDIR
)/repositories.conf \
80 --verify-program
$(SCRIPT_DIR
)/opkg-key \
82 --lists-dir
$(LISTS_DIR
)
84 include $(INCLUDE_DIR
)/target.mk
87 USER_PROFILE ?
= $(firstword $(PROFILE_NAMES
))
88 PROFILE_LIST
= $(foreach p
,$(PROFILE_NAMES
), \
89 echo
'$(patsubst DEVICE_%,%,$(p)):'; $(if
$($(p
)_NAME
),echo
' $(subst ','"'"',$($(p)_NAME))'; ) \
90 echo ' Packages: $($(p)_PACKAGES)'; echo ' hasImageMetadata: $($(p)_HAS_IMAGE_METADATA)'; \
91 $(if $($(p)_SUPPORTED_DEVICES),echo ' SupportedDevices: $($(p)_SUPPORTED_DEVICES)';) )
94 .profiles.mk: .targetinfo
95 @$(SCRIPT_DIR)/target-metadata.pl profile_mk $< '$(BOARD)$(if $(SUBTARGET),/$(SUBTARGET))' > $@
97 staging_dir/host/.prereq-build: include/prereq-build.mk
99 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq IB=1 2>/dev/null || { \
100 echo "Prerequisite
check failed. Use FORCE
=1 to
override.
"; \
103 ifneq ($(realpath $(TOPDIR)/include/prepare.mk),)
104 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \
105 echo "Preparation failed.
"; \
112 echo 'Current Target: "$(TARGETID
)"'
113 echo 'Current Architecture: "$(ARCH
)"'
114 echo 'Current Revision: "$(REVISION
)"'
115 echo 'Default Packages: $(DEFAULT_PACKAGES)'
116 echo 'Available Profiles:'
117 echo; $(PROFILE_LIST)
119 BUILD_PACKAGES:=$(USER_PACKAGES) $(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)
120 # "-pkgname
" in the package list means remove "pkgname
" from the package list
121 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
124 _call_image: staging_dir/host/.prereq-build
125 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
126 echo 'Packages: $(BUILD_PACKAGES)'
128 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
129 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
130 $(MAKE) package_reload
131 $(MAKE) package_install
132 $(MAKE) -s prepare_rootfs
133 $(MAKE) -s build_image
134 $(MAKE) -s json_overview_image_info
137 _call_manifest: FORCE
139 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
140 $(MAKE) package_reload >/dev/null
141 $(MAKE) package_install >/dev/null
142 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
146 @echo Building package index... >&2
147 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
148 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
149 gzip -9nc Packages > Packages.gz; \
150 $(if $(CONFIG_SIGNATURE_CHECK), \
151 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
152 ) >/dev/null 2>/dev/null
153 $(OPKG) update >&2 || true
156 if [ -d "$(PACKAGE_DIR
)" ] && ( \
157 [ ! -f "$(PACKAGE_DIR
)/Packages
" ] || \
158 [ ! -f "$(PACKAGE_DIR
)/Packages.gz
" ] || \
159 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
160 echo "Package list missing or not up-to-date
, generating it.
" >&2 ;\
161 $(MAKE) package_index; \
163 mkdir -p $(TARGET_DIR)/tmp; \
164 $(OPKG) update >&2 || true; \
168 @$(MAKE) -s package_reload
169 @$(OPKG) list --size 2>/dev/null
171 package_install: FORCE
173 @echo Installing packages...
174 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
175 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
176 $(OPKG) install $(BUILD_PACKAGES)
178 prepare_rootfs: FORCE
180 @echo Finalizing root filesystem...
182 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
183 $(if $(CONFIG_SIGNATURE_CHECK), \
184 $(if $(ADD_LOCAL_KEY), \
185 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
186 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
189 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
193 @echo Building images...
194 rm -rf $(BUILD_DIR)/json_info_files/
195 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
196 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)")
198 $(BIN_DIR)/profiles.json: FORCE
199 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
200 WORK_DIR=$(BUILD_DIR)/json_info_files \
201 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
204 json_overview_image_info: $(BIN_DIR)/profiles.json
208 @echo Calculating checksums...
209 @$(call sha256sums,$(BIN_DIR))
212 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
216 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
218 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
220 _check_profile: FORCE
222 ifeq ($(PROFILE_FILTER),)
223 @echo 'Profile "$(PROFILE
)" does not exist!'
224 @echo 'Use "make
info" to get a list of available profile names.'
230 ifneq ($(CONFIG_SIGNATURE_CHECK),)
231 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
232 echo Generate local signing keys... >&2; \
233 $(STAGING_DIR_HOST)/bin/usign -G \
234 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
235 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
237 if [ ! -s $(BUILD_KEY).ucert ]; then \
238 echo Generate local certificate... >&2; \
239 $(STAGING_DIR_HOST)/bin/ucert -I \
240 -c $(BUILD_KEY).ucert \
241 -p $(BUILD_KEY).pub \
247 $(MAKE) -s _check_profile
248 $(MAKE) -s _check_keys
249 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
250 $(MAKE) -s _call_image \
251 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
252 $(if $(FILES),USER_FILES="$(FILES
)") \
253 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
254 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
255 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)"))
258 $(MAKE) -s _check_profile
259 $(MAKE) -s _check_keys
260 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
261 $(MAKE) -s _call_manifest \
262 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
263 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
267 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
270 @$(MAKE) -s package_reload
271 @$(OPKG) whatdepends -A $(PACKAGE)
273 package_depends: FORCE
275 @echo 'Variable `PACKAGE` is not set but required by `package_depends`'
278 @$(MAKE) -s package_reload
279 @$(OPKG) depends -A $(PACKAGE)
282 .SILENT: help info image manifest whatdepends package_depends