diff --git a/include/image.mk b/include/image.mk index 3bdf579da..ba2d34fdb 100644 --- a/include/image.mk +++ b/include/image.mk @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only # -# Copyright (C) 2006-2020 LEDE.org +# Copyright (C) 2006-2020 OpenWrt.org override TARGET_BUILD= include $(INCLUDE_DIR)/prereq.mk @@ -293,8 +293,13 @@ define Image/mkfs/erofs endef define Image/Manifest - $(call opkg,$(TARGET_DIR_ORIG)) list-installed > \ - $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest + $(if $(CONFIG_USE_APK), \ + $(call apk,$(TARGET_DIR_ORIG)) list --quiet --manifest --no-network \ + --repositories-file /dev/null | sort | sed 's/ / - /' > \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest, \ + $(call opkg,$(TARGET_DIR_ORIG)) list-installed > \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest \ + ) endef define Image/gzip-ext4-padded-squashfs @@ -337,7 +342,20 @@ opkg_target = \ $(call opkg,$(mkfs_cur_target_dir)) \ -f $(mkfs_cur_target_dir).conf +apk_target = \ + $(call apk,$(mkfs_cur_target_dir)) --no-scripts \ + --repositories-file /dev/null --repository file://$(PACKAGE_DIR_ALL)/packages.adb + + target-dir-%: FORCE +ifneq ($(CONFIG_USE_APK),) + rm -rf $(mkfs_cur_target_dir) + $(CP) $(TARGET_DIR_ORIG) $(mkfs_cur_target_dir) + $(if $(mkfs_packages_remove), \ + -$(apk_target) del $(mkfs_packages_remove)) + $(if $(mkfs_packages_add), \ + $(apk_target) add $(mkfs_packages_add)) +else rm -rf $(mkfs_cur_target_dir) $(mkfs_cur_target_dir).opkg $(CP) $(TARGET_DIR_ORIG) $(mkfs_cur_target_dir) -mv $(mkfs_cur_target_dir)/etc/opkg $(mkfs_cur_target_dir).opkg @@ -351,6 +369,7 @@ target-dir-%: FORCE $(call opkg_package_files,$(mkfs_packages_add))) -$(CP) -T $(mkfs_cur_target_dir).opkg/ $(mkfs_cur_target_dir)/etc/opkg/ rm -rf $(mkfs_cur_target_dir).opkg $(mkfs_cur_target_dir).conf +endif $(call prepare_rootfs,$(mkfs_cur_target_dir),$(TOPDIR)/files) $(KDIR)/root.%: kernel_prepare @@ -519,9 +538,9 @@ define Device/Build/initramfs $(KDIR)/$$(KERNEL_INITRAMFS_NAME):: image_prepare $(1)-images: $$(if $$(KERNEL_INITRAMFS),$(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE)) - + .IGNORE: $(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE) - + $(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE): $(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE) cp $$^ $$@ diff --git a/include/rootfs.mk b/include/rootfs.mk index f2ed648d2..02fa3b13d 100644 --- a/include/rootfs.mk +++ b/include/rootfs.mk @@ -43,6 +43,14 @@ opkg = \ --add-arch all:100 \ --add-arch $(if $(ARCH_PACKAGES),$(ARCH_PACKAGES),$(BOARD)):200 +apk = \ + IPKG_INSTROOT=$(1) \ + $(FAKEROOT) $(STAGING_DIR_HOST)/bin/apk \ + --root $(1) \ + --keys-dir $(if $(APK_KEYS),$(APK_KEYS),$(TOPDIR)) \ + --no-logfile \ + --preserve-env + TARGET_DIR_ORIG := $(TARGET_ROOTFS_DIR)/root.orig-$(BOARD) ifdef CONFIG_CLEAN_IPKG @@ -68,14 +76,31 @@ define prepare_rootfs @mkdir -p $(1)/var/lock @( \ cd $(1); \ - for script in ./usr/lib/opkg/info/*.postinst; do \ + if [ -n "$(CONFIG_USE_APK)" ]; then \ + IPKG_POSTINST_PATH=./lib/apk/db/*.post-install; \ + $(STAGING_DIR_HOST)/bin/gzip -d ./lib/apk/db/scripts.tar; \ + $(STAGING_DIR_HOST)/bin/tar -C ./lib/apk/db/ -xf ./lib/apk/db/scripts.tar --wildcards "*.post-install"; \ + else \ + IPKG_POSTINST_PATH=./usr/lib/opkg/info/*.postinst; \ + fi; \ + for script in $$IPKG_POSTINST_PATH; do \ IPKG_INSTROOT=$(1) $$(command -v bash) $$script; \ ret=$$?; \ if [ $$ret -ne 0 ]; then \ echo "postinst script $$script has failed with exit code $$ret" >&2; \ exit 1; \ fi; \ + [ -n "$(CONFIG_USE_APK)" ] && $(STAGING_DIR_HOST)/bin/tar --delete -f ./lib/apk/db/scripts.tar $$(basename $$script); \ done; \ + [ -n "$(CONFIG_USE_APK)" ] && $(STAGING_DIR_HOST)/bin/gzip -f -9n -S ".gz" ./lib/apk/db/scripts.tar; \ + if [ -z "$(CONFIG_USE_APK)" ]; then \ + $(if $(IB),,awk -i inplace \ + '/^Status:/ { \ + if ($$3 == "user") { $$3 = "ok" } \ + else { sub(/,\|\,/, "", $$3) } \ + }1' $(1)/usr/lib/opkg/status) ; \ + $(if $(SOURCE_DATE_EPOCH),sed -i "s/Installed-Time: .*/Installed-Time: $(SOURCE_DATE_EPOCH)/" $(1)/usr/lib/opkg/status ;) \ + fi; \ for script in ./etc/init.d/*; do \ grep '#!/bin/sh /etc/rc.common' $$script >/dev/null || continue; \ if ! echo " $(3) " | grep -q " $$(basename $$script) "; then \ @@ -87,11 +112,12 @@ define prepare_rootfs fi; \ done || true \ ) - $(if $(SOURCE_DATE_EPOCH),sed -i "s/Installed-Time: .*/Installed-Time: $(SOURCE_DATE_EPOCH)/" $(1)/usr/lib/opkg/status) + @-find $(1) -name CVS -o -name .svn -o -name .git -o -name '.#*' | $(XARGS) rm -rf rm -rf \ $(1)/boot \ $(1)/tmp/* \ + $(1)/lib/apk/db/*.post-install* \ $(1)/usr/lib/opkg/info/*.postinst* \ $(1)/usr/lib/opkg/lists/* \ $(1)/var/lock/*.lock diff --git a/package/Makefile b/package/Makefile index 209be3467..f72f8dedb 100644 --- a/package/Makefile +++ b/package/Makefile @@ -53,19 +53,58 @@ $(curdir)/cleanup: $(TMP_DIR)/.build $(curdir)/merge: rm -rf $(PACKAGE_DIR_ALL) mkdir -p $(PACKAGE_DIR_ALL) +ifneq ($(CONFIG_USE_APK),) + -$(foreach pdir,$(PACKAGE_SUBDIRS),$(if $(wildcard $(pdir)/*.apk),ln -s $(pdir)/*.apk $(PACKAGE_DIR_ALL);)) +else -$(foreach pdir,$(PACKAGE_SUBDIRS),$(if $(wildcard $(pdir)/*.ipk),ln -s $(pdir)/*.ipk $(PACKAGE_DIR_ALL);)) +endif + +$(BUILD_KEY_APK_SEC): + $(STAGING_DIR_HOST)/bin/openssl ecparam -name prime256v1 -genkey -noout -out $(BUILD_KEY_APK_SEC) + +$(BUILD_KEY_APK_PUB): $(BUILD_KEY_APK_SEC) + $(STAGING_DIR_HOST)/bin/openssl ec -in $(BUILD_KEY_APK_SEC) -pubout > $(BUILD_KEY_APK_PUB) $(curdir)/merge-index: $(curdir)/merge +ifneq ($(CONFIG_USE_APK),) + (cd $(PACKAGE_DIR_ALL) && $(STAGING_DIR_HOST)/bin/apk mkndx \ + --root $(TOPDIR) \ + --keys-dir $(TOPDIR) \ + --allow-untrusted \ + --sign $(BUILD_KEY_APK_SEC) \ + --output packages.adb \ + *.apk; \ + ) +else (cd $(PACKAGE_DIR_ALL) && $(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages; ) +endif ifndef SDK + $(curdir)//compile = $(STAGING_DIR)/.prepared $(BIN_DIR) +ifneq ($(CONFIG_USE_APK),) + $(curdir)//compile += $(curdir)/system/apk/host/compile $(BUILD_KEY_APK_SEC) $(BUILD_KEY_APK_PUB) +else $(curdir)/compile: $(curdir)/system/opkg/host/compile endif +else +ifneq ($(CONFIG_USE_APK),) + $(curdir)//compile += $(BUILD_KEY_APK_SEC) $(BUILD_KEY_APK_PUB) +endif +endif $(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(if $(CONFIG_TARGET_PER_DEVICE_ROOTFS),$(curdir)/merge-index) - find $(STAGING_DIR_ROOT) -type d | $(XARGS) chmod 0755 rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG) mkdir -p $(TARGET_DIR)/tmp +ifneq ($(CONFIG_USE_APK),) + $(file >$(TMP_DIR)/apk_install_list,\ + $(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(pkg)$(call GetABISuffix,$(pkg)))) + $(call apk,$(TARGET_DIR)) add --no-cache --initdb --no-scripts --arch $(ARCH_PACKAGES) \ + --repositories-file /dev/null --repository file://$(PACKAGE_DIR_ALL)/packages.adb \ + $$(cat $(TMP_DIR)/apk_install_list) + + rm -rf $(TARGET_DIR)/run +else $(file >$(TMP_DIR)/opkg_install_list,\ $(call opkg_package_files,\ $(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(pkg)$(call GetABISuffix,$(pkg))))) @@ -76,6 +115,7 @@ $(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(if $(CONFIG_TARGET_PER_DE $(call opkg,$(TARGET_DIR)) flag $$flag `cat $$file`; \ done; \ done || true +endif $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG) @@ -83,6 +123,20 @@ $(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(if $(CONFIG_TARGET_PER_DE $(curdir)/index: FORCE @echo Generating package index... +ifneq ($(CONFIG_USE_APK),) + @for d in $(PACKAGE_SUBDIRS); do \ + mkdir -p $$d; \ + cd $$d || continue; \ + ls *.apk >/dev/null 2>&1 || continue; \ + $(STAGING_DIR_HOST)/bin/apk mkndx \ + --root $(TOPDIR) \ + --keys-dir $(TOPDIR) \ + --allow-untrusted \ + --sign $(BUILD_KEY_APK_SEC) \ + --output packages.adb \ + *.apk; \ + done +else @for d in $(PACKAGE_SUBDIRS); do ( \ mkdir -p $$d; \ cd $$d || continue; \ @@ -102,6 +156,7 @@ ifdef CONFIG_SIGNED_PACKAGES $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY); \ ); done endif +endif $(curdir)/flags-install:= -j1