blob: e9e08fb2765b0ee88de963945a7ccd5b9294dc61 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001# Makefile for OpenWrt
2#
3# Copyright (C) 2007-2015 OpenWrt.org
4#
5# This is free software, licensed under the GNU General Public License v2.
6# See /LICENSE for more information.
7#
8
9TOPDIR:=${CURDIR}
10LC_ALL:=C
11LANG:=C
12export TOPDIR LC_ALL LANG
13export OPENWRT_VERBOSE=s
14all: help
15
16export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH))
17export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH)
18
19ifneq ($(OPENWRT_BUILD),1)
20 override OPENWRT_BUILD=1
21 export OPENWRT_BUILD
22endif
23
24include rules.mk
25include $(INCLUDE_DIR)/debug.mk
26include $(INCLUDE_DIR)/depends.mk
27include $(INCLUDE_DIR)/rootfs.mk
28
29include $(INCLUDE_DIR)/default-packages.mk
30include $(INCLUDE_DIR)/version.mk
31export REVISION
32export SOURCE_DATE_EPOCH
33
34define Helptext
35Available Commands:
36 help: This help text
37 info: Show a list of available target profiles
38 clean: Remove images and temporary build files
39 image: Build an image (see below for more information).
40 manifest: Show all package that will be installed into the image
41 package_whatdepends: Show which packages have a dependency on this
42 package_depends: Show installation dependency of the package
43
44image:
45 By default 'make image' will create an image with the default
46 target profile and package set. You can use the following parameters
47 to change that:
48
49 make image PROFILE="<profilename>" # override the default target profile
50 make image PACKAGES="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
51 make image FILES="<path>" # include extra files from <path>
52 make image BIN_DIR="<path>" # alternative output directory for the images
53 make image EXTRA_IMAGE_NAME="<string>" # Add this to the output image filename (sanitized)
54 make image DISABLED_SERVICES="<svc1> [<svc2> [<svc3> ..]]" # Which services in /etc/init.d/ should be disabled
55 make image ADD_LOCAL_KEY=1 # store locally generated signing key in built images
56 make image ROOTFS_PARTSIZE="<size>" # override the default rootfs partition size in MegaBytes
57
58manifest:
59 List "all" packages which get installed into the image.
60 You can use the following parameters:
61
62 make manifest PROFILE="<profilename>" # override the default target profile
63 make manifest PACKAGES="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
64 make manifest STRIP_ABI=1 # remove ABI version from printed package names
65
66
67package_whatdepends:
68 List "all" packages that have a dependency on this package
69 You can use the following parameters:
70
71 make package_whatdepends PACKAGE="<pkg>"
72
73package_depends:
74 List "all" packages dependency of the package
75 You can use the following parameters:
76
77 make package_depends PACKAGE="<pkg>"
78
79endef
80$(eval $(call shexport,Helptext))
81
82help: FORCE
83 echo "$$$(call shvar,Helptext)"
84
85
86# override variables from rules.mk
87BUILD_KEY_APK_SEC=$(TOPDIR)/keys/local-private-key.pem
88BUILD_KEY_APK_PUB=$(TOPDIR)/keys/local-public-key.pem
89export PACKAGE_DIR:=$(TOPDIR)/packages
90LISTS_DIR:=$(subst $(space),/,$(patsubst %,..,$(subst /,$(space),$(TARGET_DIR))))$(DL_DIR)
91export PACKAGE_DIR_ALL:=$(TOPDIR)/packages
92
93export OPKG_KEYS:=$(TOPDIR)/keys
94OPKG:=$(call opkg,$(TARGET_DIR)) \
95 -f $(TOPDIR)/repositories.conf \
96 --verify-program $(SCRIPT_DIR)/opkg-key \
97 --cache $(DL_DIR) \
98 --lists-dir $(LISTS_DIR)
99
100export APK_KEYS:=$(TOPDIR)/keys
101APK:=$(call apk,$(TARGET_DIR)) \
102 --repositories-file $(TOPDIR)/repositories \
103 $(if $(CONFIG_SIGNATURE_CHECK),,--allow-untrusted) \
104 --cache-dir $(DL_DIR)
105
106
107include $(INCLUDE_DIR)/target.mk
108-include .profiles.mk
109
110USER_PROFILE ?= $(firstword $(PROFILE_NAMES))
111PROFILE_LIST = $(foreach p,$(PROFILE_NAMES), \
112 echo '$(patsubst DEVICE_%,%,$(p)):'; $(if $($(p)_NAME),echo ' $(subst ','"'"',$($(p)_NAME))'; ) \
113 echo ' Packages: $($(p)_PACKAGES)'; echo ' hasImageMetadata: $($(p)_HAS_IMAGE_METADATA)'; \
114 $(if $($(p)_SUPPORTED_DEVICES),echo ' SupportedDevices: $($(p)_SUPPORTED_DEVICES)';) )
115
116
117.profiles.mk: .targetinfo
118 @$(SCRIPT_DIR)/target-metadata.pl profile_mk $< '$(BOARD)/$(SUBTARGET)' > $@
119
120staging_dir/host/.prereq-build: include/prereq-build.mk
121 mkdir -p tmp
122 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq IB=1 2>/dev/null || { \
123 echo "Prerequisite check failed. Use FORCE=1 to override."; \
124 false; \
125 }
126 ifneq ($(realpath $(TOPDIR)/include/prepare.mk),)
127 @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \
128 echo "Preparation failed."; \
129 false; \
130 }
131 endif
132 touch $@
133
134_call_info: FORCE
135 echo 'Current Target: "$(TARGETID)"'
136 echo 'Current Architecture: "$(ARCH)"'
137 echo 'Current Revision: "$(REVISION)"'
138 echo 'Default Packages: $(DEFAULT_PACKAGES)'
139 echo 'Available Profiles:'
140 echo; $(PROFILE_LIST)
141
142ifneq ($(CONFIG_USE_APK),)
143 DEFAULT_PACKAGES += apk-mbedtls
144else
145 DEFAULT_PACKAGES += opkg
146endif
147BUILD_PACKAGES:=$(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)
148# "-pkgname" in the package list means remove "pkgname" from the package list
149BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
150BUILD_PACKAGES:=$(USER_PACKAGES) $(BUILD_PACKAGES)
151BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))
152PACKAGES:=
153
154_call_image: staging_dir/host/.prereq-build
155 echo 'Building images for $(BOARD)$(if $($(USER_PROFILE)_NAME), - $($(USER_PROFILE)_NAME))'
156 echo 'Packages: $(BUILD_PACKAGES)'
157 echo
158 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
159 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
160 $(MAKE) package_reload
161 $(MAKE) package_install
162 $(MAKE) -s prepare_rootfs
163 $(MAKE) -s build_image
164 $(MAKE) -s json_overview_image_info
165 $(MAKE) -s checksum
166
167_call_manifest: FORCE
168 rm -rf $(TARGET_DIR)
169 mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
170 $(MAKE) package_reload >/dev/null
171 $(MAKE) package_install >/dev/null
172ifeq ($(CONFIG_USE_APK),)
173 $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
174else
175 $(APK) list --quiet --manifest --no-network
176endif
177
178package_index: FORCE
179 @echo >&2
180 @echo Building package index... >&2
181 @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
182ifeq ($(CONFIG_USE_APK),)
183 (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
184 gzip -9nc Packages > Packages.gz; \
185 $(if $(CONFIG_SIGNATURE_CHECK), \
186 $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
187 ) >/dev/null 2>/dev/null
188 $(OPKG) update >&2 || true
189else
190 $(APK) add --initdb
191 (cd $(PACKAGE_DIR); $(APK) mkndx \
192 $(if $(CONFIG_SIGNATURE_CHECK), --keys-dir $(APK_KEYS) --sign $(BUILD_KEY_APK_SEC)) \
193 --allow-untrusted --output packages.adb *.apk) >/dev/null 2>/dev/null || true
194 $(APK) update >&2 || true
195endif
196
197package_reload:
198ifeq ($(CONFIG_USE_APK),)
199 if [ -d "$(PACKAGE_DIR)" ] && ( \
200 [ ! -f "$(PACKAGE_DIR)/Packages" ] || \
201 [ ! -f "$(PACKAGE_DIR)/Packages.gz" ] || \
202 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
203 echo "Package list missing or not up-to-date, generating it." >&2 ;\
204 $(MAKE) package_index; \
205 else \
206 mkdir -p $(TARGET_DIR)/tmp; \
207 $(OPKG) update >&2 || true; \
208 fi
209else
210 if [ -d "$(PACKAGE_DIR)" ] && ( \
211 [ ! -f "$(PACKAGE_DIR)/packages.adb" ] || \
212 [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/packages.adb`" ] ); then \
213 echo "Package list missing or not up-to-date, generating it." >&2 ;\
214 $(MAKE) package_index; \
215 else \
216 mkdir -p $(TARGET_DIR)/tmp; \
217 $(APK) update >&2 || true; \
218 fi
219endif
220
221package_list: FORCE
222 @$(MAKE) -s package_reload
223ifeq ($(CONFIG_USE_APK),)
224 @$(OPKG) list --size 2>/dev/null
225else
226 @$(APK) list --size 2>/dev/null
227endif
228
229package_install: FORCE
230 @echo
231 @echo Installing packages...
232ifeq ($(CONFIG_USE_APK),)
233 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
234 $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
235 $(OPKG) install $(BUILD_PACKAGES)
236else
237 $(APK) add --no-scripts $(firstword $(wildcard $(LINUX_DIR)/libc-*.apk $(PACKAGE_DIR)/libc-*.apk))
238 $(APK) add --no-scripts $(firstword $(wildcard $(LINUX_DIR)/kernel-*.apk $(PACKAGE_DIR)/kernel-*.apk))
239 $(APK) add --no-scripts $(BUILD_PACKAGES)
240endif
241
242prepare_rootfs: FORCE
243 @echo
244 @echo Finalizing root filesystem...
245
246 $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
247ifeq ($(CONFIG_USE_APK),)
248 $(if $(CONFIG_SIGNATURE_CHECK), \
249 $(if $(ADD_LOCAL_KEY), \
250 OPKG_KEYS=$(TARGET_DIR)/etc/opkg/keys/ \
251 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub \
252 ) \
253 )
254else
255 $(if $(CONFIG_SIGNATURE_CHECK), \
256 $(if $(ADD_LOCAL_KEY), \
257 mkdir -p $(TARGET_DIR)/etc/opkg/keys/; \
258 cp $(BUILD_KEY_APK_PUB) $(TARGET_DIR)/etc/apk/keys/; \
259 ) \
260 )
261endif
262 $(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))
263
264build_image: FORCE
265 @echo
266 @echo Building images...
267 rm -rf $(BUILD_DIR)/json_info_files/
268 if [ -d "target/linux/feeds/$(BOARD)" ]; then \
269 $(NO_TRACE_MAKE) -C target/linux/feeds/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME)" \
270 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE)"); \
271 else \
272 $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME)" \
273 $(if $(USER_PROFILE),PROFILE="$(USER_PROFILE)"); \
274 fi
275
276$(BIN_DIR)/profiles.json: FORCE
277 $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
278 WORK_DIR=$(BUILD_DIR)/json_info_files \
279 $(SCRIPT_DIR)/json_overview_image_info.py $@ \
280 )
281
282json_overview_image_info: $(BIN_DIR)/profiles.json
283
284checksum: FORCE
285 @echo
286 @echo Calculating checksums...
287 @$(call sha256sums,$(BIN_DIR))
288
289clean:
290 rm -rf $(TMP_DIR) $(DL_DIR) $(TARGET_DIR) $(BIN_DIR)
291
292
293info:
294 (unset PROFILE FILES PACKAGES MAKEFLAGS; $(MAKE) -s _call_info)
295
296PROFILE_FILTER = $(filter DEVICE_$(PROFILE) $(PROFILE),$(PROFILE_NAMES))
297
298_check_profile: FORCE
299ifneq ($(PROFILE),)
300 ifeq ($(PROFILE_FILTER),)
301 @echo 'Profile "$(PROFILE)" does not exist!'
302 @echo 'Use "make info" to get a list of available profile names.'
303 @exit 1
304 endif
305endif
306
307_check_keys: FORCE
308ifneq ($(CONFIG_SIGNATURE_CHECK),)
309ifeq ($(CONFIG_USE_APK),)
310 @if [ ! -s $(BUILD_KEY) -o ! -s $(BUILD_KEY).pub ]; then \
311 echo Generate local signing keys... >&2; \
312 $(STAGING_DIR_HOST)/bin/usign -G \
313 -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key"; \
314 $(SCRIPT_DIR)/opkg-key add $(BUILD_KEY).pub; \
315 fi
316 if [ ! -s $(BUILD_KEY).ucert ]; then \
317 echo Generate local certificate... >&2; \
318 $(STAGING_DIR_HOST)/bin/ucert -I \
319 -c $(BUILD_KEY).ucert \
320 -p $(BUILD_KEY).pub \
321 -s $(BUILD_KEY); \
322 fi
323else
324 @if [ ! -s $(BUILD_KEY_APK_SEC) -o ! -s $(BUILD_KEY_APK_PUB) ]; then \
325 echo Generate local signing keys... >&2; \
326 $(STAGING_DIR_HOST)/bin/openssl ecparam -name prime256v1 -genkey -noout -out $(BUILD_KEY_APK_SEC); \
327 sed -i '1s/^/untrusted comment: Local build key\n/' $(BUILD_KEY_APK_SEC); \
328 $(STAGING_DIR_HOST)/bin/openssl ec -in $(BUILD_KEY_APK_SEC) -pubout > $(BUILD_KEY_APK_PUB); \
329 sed -i '1s/^/untrusted comment: Local build key\n/' $(BUILD_KEY_APK_PUB); \
330 fi
331endif
332endif
333
334image:
335 $(MAKE) -s _check_profile
336 $(MAKE) -s _check_keys
337 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
338 $(MAKE) -s _call_image \
339 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER)") \
340 $(if $(FILES),USER_FILES="$(FILES)") \
341 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES)") \
342 $(if $(BIN_DIR),BIN_DIR="$(BIN_DIR)") \
343 $(if $(DISABLED_SERVICES),DISABLED_SERVICES="$(DISABLED_SERVICES)") \
344 $(if $(ROOTFS_PARTSIZE),CONFIG_TARGET_ROOTFS_PARTSIZE="$(ROOTFS_PARTSIZE)"))
345
346manifest: FORCE
347 $(MAKE) -s _check_profile
348 $(MAKE) -s _check_keys
349 (unset PROFILE FILES PACKAGES MAKEFLAGS; \
350 $(MAKE) -s _call_manifest \
351 $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER)") \
352 $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES)"))
353
354package_whatdepends: FORCE
355ifeq ($(PACKAGE),)
356 @echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
357 @exit 1
358endif
359 @$(MAKE) -s package_reload
360ifeq ($(CONFIG_USE_APK),)
361 @$(OPKG) whatdepends -A $(PACKAGE)
362else
363 @$(APK) list --depends $(PACKAGE)
364endif
365
366package_depends: FORCE
367ifeq ($(PACKAGE),)
368 @echo 'Variable `PACKAGE` is not set but required by `package_depends`'
369 @exit 1
370endif
371 @$(MAKE) -s package_reload
372ifeq ($(CONFIG_USE_APK),)
373 @$(OPKG) depends -A $(PACKAGE)
374else
375 @$(OPKG) whatdepends -A $(PACKAGE)
376endif
377
378.SILENT: help info image manifest package_whatdepends package_depends