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 Revision: "$(REVISION
)"'
106 echo 'Default Packages: $(DEFAULT_PACKAGES)'
107 echo 'Available Profiles:'
108 echo; $(PROFILE_LIST)
110 BUILD_PACKAGES:=$(USER_PACKAGES) $(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)
111 # "-pkgname
" in the package list means remove "pkgname
" from the package list
112 BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
115 _call_image: staging_dir/host/.prereq-build
116 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
117 echo 'Packages: $(BUILD_PACKAGES)'
119 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
120 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
121 $(MAKE) package_reload
122 $(MAKE) package_install
123 $(MAKE) -s prepare_rootfs
124 $(MAKE) -s build_image
125 $(MAKE) -s json_overview_image_info
128 _call_manifest: FORCE
130 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
131 $(MAKE) package_reload >/dev/null
132 $(MAKE) package_install >/dev/null
133 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
137 @echo Building package index... >&2
138 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
139 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
140 gzip -9nc Packages > Packages.gz; \
141 $(if $(CONFIG_SIGNATURE_CHECK), \
142 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
143 ) >/dev/null 2>/dev/null
144 $(OPKG) update >&2 || true
147 if [ -d "$(PACKAGE_DIR
)" ] && ( \
148 [ ! -f "$(PACKAGE_DIR
)/Packages
" ] || \
149 [ ! -f "$(PACKAGE_DIR
)/Packages.gz
" ] || \
150 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
151 echo "Package list missing or not up-to-date
, generating it.
" >&2 ;\
152 $(MAKE) package_index; \
154 mkdir -p $(TARGET_DIR)/tmp; \
155 $(OPKG) update >&2 || true; \
159 @$(MAKE) -s package_reload
160 @$(OPKG) list --size 2>/dev/null
162 package_install: FORCE
164 @echo Installing packages...
165 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
166 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
167 $(OPKG) install $(BUILD_PACKAGES)
169 prepare_rootfs: FORCE
171 @echo Finalizing root filesystem...
173 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
174 $(if $(CONFIG_SIGNATURE_CHECK), \
175 $(if $(ADD_LOCAL_KEY), \
176 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
177 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
180 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
184 @echo Building images...
185 rm -rf $(BUILD_DIR)/json_info_files/
186 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME
)" \
187 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE
)")
189 $(BIN_DIR)/profiles.json: FORCE
190 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
191 WORK_DIR=$(BUILD_DIR)/json_info_files \
192 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
195 json_overview_image_info: $(BIN_DIR)/profiles.json
199 @echo Calculating checksums...
200 @$(call sha256sums,$(BIN_DIR))
203 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
207 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
209 PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
211 _check_profile: FORCE
213 ifeq ($(PROFILE_FILTER),)
214 @echo 'Profile "$(PROFILE
)" does not exist!'
215 @echo 'Use "make
info" to get a list of available profile names.'
221 ifneq ($(CONFIG_SIGNATURE_CHECK),)
222 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
223 echo Generate local signing keys... >&2; \
224 $(STAGING_DIR_HOST)/bin/usign -G \
225 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key
"; \
226 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
228 if [ ! -s $(BUILD_KEY).ucert ]; then \
229 echo Generate local certificate... >&2; \
230 $(STAGING_DIR_HOST)/bin/ucert -I \
231 -c $(BUILD_KEY).ucert \
232 -p $(BUILD_KEY).pub \
238 $(MAKE) -s _check_profile
239 $(MAKE) -s _check_keys
240 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
241 $(MAKE) -s _call_image \
242 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
243 $(if $(FILES),USER_FILES="$(FILES
)") \
244 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)") \
245 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR
)") \
246 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES
)"))
249 $(MAKE) -s _check_profile
250 $(MAKE) -s _check_keys
251 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
252 $(MAKE) -s _call_manifest \
253 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER
)") \
254 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES
)"))
258 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
261 @$(MAKE) -s package_reload
262 @$(OPKG) whatdepends -A $(PACKAGE)
264 .SILENT: help info image manifest whatdepends