The main repository uses multiple sub-repositories to manage packages of
different categories. All packages are installed via the OpenWrt package
-manager called `apk`. If you're looking to develop the web interface or port
+manager called `opkg`. If you're looking to develop the web interface or port
packages to OpenWrt, please find the fitting repository below.
* [LuCI Web Interface](https://github.com/openwrt/luci): Modern and modular
PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_AVAILABLE),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED))
endif
+opkg_package_files = $(wildcard \
+ $(foreach dir,$(PACKAGE_SUBDIRS), \
+ $(foreach pkg,$(1), $(dir)/$(pkg)_*.ipk)))
+
apk_package_files = $(wildcard \
$(foreach dir,$(PACKAGE_SUBDIRS), \
$(foreach pkg,$(1), $(dir)/$(pkg)_*.apk)))
endef
# 1: destination file
-define FeedSourcesAppend
+define FeedSourcesAppendOPKG
+( \
+ echo 'src/gz %d_core %U/targets/%S/packages'; \
+ $(strip $(if $(CONFIG_PER_FEED_REPO), \
+ echo 'src/gz %d_base %U/packages/%A/base'; \
+ $(if $(filter %SNAPSHOT-y,$(VERSION_NUMBER)-$(CONFIG_BUILDBOT)), \
+ echo 'src/gz %d_kmods %U/targets/%S/kmods/$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)';) \
+ $(foreach feed,$(FEEDS_AVAILABLE), \
+ $(if $(CONFIG_FEED_$(feed)), \
+ echo '$(if $(filter m,$(CONFIG_FEED_$(feed))),# )src/gz %d_$(feed) %U/packages/%A/$(feed)';)))) \
+) >> $(1)
+endef
+
+# 1: destination file
+define FeedSourcesAppendAPK
( \
echo '%U/targets/%S/packages/packages.adb'; \
$(strip $(if $(CONFIG_PER_FEED_REPO), \
$@ $(call mkfs_target_dir,$(1))/
endef
+ifdef CONFIG_USE_APK
define Image/Manifest
$(call apk,$(TARGET_DIR_ORIG)) list --quiet --manifest | sort > \
$(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest
endef
+else
+define Image/Manifest
+ $(call opkg,$(TARGET_DIR_ORIG)) list-installed > \
+ $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest
+endef
+endif
define Image/gzip-ext4-padded-squashfs
mkfs_packages_remove = $(foreach pkg,$(patsubst -%,%,$(filter -%,$(mkfs_packages))),$(pkg)$(call GetABISuffix,$(pkg)))
mkfs_cur_target_dir = $(call mkfs_target_dir,pkg=$(target_params))
+opkg_target = \
+ $(call opkg,$(mkfs_cur_target_dir)) \
+ -f $(mkfs_cur_target_dir).conf
+
apk_target = $(call apk,$(mkfs_cur_target_dir))
target-dir-%: FORCE
- rm -rf $(mkfs_cur_target_dir) $(mkfs_cur_target_dir).apk
+ifdef CONFIG_USE_APK
+ rm -rf $(mkfs_cur_target_dir)
$(CP) $(TARGET_DIR_ORIG) $(mkfs_cur_target_dir)
mv $(mkfs_cur_target_dir)/etc/apk/repositories $(mkfs_cur_target_dir).repositories
$(if $(mkfs_packages_remove), \
$(if $(mkfs_packages_add), \
$(apk_target) add $(mkfs_packages_add))
mv $(mkfs_cur_target_dir).repositories $(mkfs_cur_target_dir)/etc/apk/repositories
+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
+ echo 'src default file://$(PACKAGE_DIR_ALL)' > $(mkfs_cur_target_dir).conf
+ $(if $(mkfs_packages_remove), \
+ -$(call opkg,$(mkfs_cur_target_dir)) remove \
+ $(mkfs_packages_remove))
+ $(if $(call opkg_package_files,$(mkfs_packages_add)), \
+ $(opkg_target) update && \
+ $(opkg_target) install \
+ $(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)
- $(apk_target) list --quiet --manifest | sort > $(mkfs_cur_target_dir).manifest
$(KDIR)/root.%: kernel_prepare
$(call Image/mkfs/$(word 1,$(target_params)),$(target_params))
include $(INCLUDE_DIR)/feeds.mk
endif
+IPKG_REMOVE:= \
+ $(SCRIPT_DIR)/ipkg-remove
+
+ IPKG_STATE_DIR:=$(TARGET_DIR)/usr/lib/opkg
+
# Generates a make statement to return a wildcard for candidate ipkg files
# 1: package name
define gen_ipkg_wildcard
endef
endif
+# where to build (and put) .ipk packages
+opkg = \
+ IPKG_NO_SCRIPT=1 \
+ IPKG_INSTROOT=$(1) \
+ TMPDIR=$(1)/tmp \
+ $(STAGING_DIR_HOST)/bin/opkg \
+ --offline-root $(1) \
+ --force-postinstall \
+ --add-dest root:/ \
+ --add-arch all:100 \
+ --add-arch $(if $(ARCH_PACKAGES),$(ARCH_PACKAGES),$(BOARD)):200
+
apk = \
IPKG_INSTROOT=$(1) \
$(FAKEROOT) $(STAGING_DIR_HOST)/bin/apk \
@mkdir -p $(1)/var/lock
@( \
cd $(1); \
+ if [ -n $(CONFIG_USE_APK) ]; then \
$(STAGING_DIR_HOST)/bin/tar -xf ./lib/apk/db/scripts.tar --wildcards "*.post-install" -O > script.sh; \
chmod +x script.sh; \
IPKG_INSTROOT=$(1) $$(command -v bash) script.sh; \
+ else \
+ for script in ./usr/lib/opkg/info/*.postinst; 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; \
+ done; \
+ 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 \
echo "Disabling" $$(basename $$script); \
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
- @-find $(1)/usr/cache/apk/ -name '*.apk' -delete
rm -rf \
$(1)/boot \
$(1)/tmp/* \
+ $(1)/usr/lib/opkg/info/*.postinst* \
+ $(1)/usr/lib/opkg/lists/* \
$(1)/var/lock/*.lock
$(call clean_ipkg,$(1))
$(call mklibs,$(1))
# Default packages - the really basic set
DEFAULT_PACKAGES:=\
base-files \
- apk \
ca-bundle \
dropbear \
fstools \
urandom-seed \
urngd
+ifdef CONFIG_USE_APK
+DEFAULT_PACKAGES+=apk
+else
+DEFAULT_PACKAGES+=opkg
+endif
+
ifneq ($(CONFIG_SELINUX),)
DEFAULT_PACKAGES+=busybox-selinux procd-selinux
else
$(if $(CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE), \
rm -f $(1)/etc/banner.failsafe,)
+ifdef CONFIG_USE_APK
mkdir -p $(1)/etc/apk/
- $(call FeedSourcesAppend,$(1)/etc/apk/repositories)
+ $(call FeedSourcesAppendAPK,$(1)/etc/apk/repositories)
$(VERSION_SED_SCRIPT) $(1)/etc/apk/repositories
+else
+ $(if $(CONFIG_CLEAN_IPKG),, \
+ mkdir -p $(1)/etc/opkg; \
+ $(call FeedSourcesAppendOPKG,$(1)/etc/opkg/distfeeds.conf); \
+ $(VERSION_SED_SCRIPT) $(1)/etc/opkg/distfeeds.conf)
+ $(if $(CONFIG_IPK_FILES_CHECKSUMS),, \
+ rm -f $(1)/sbin/pkg_check)
+endif
endef
ifneq ($(DUMP),1)
SECTION:=libs
CATEGORY:=Base system
URL:=http://gcc.gnu.org/
- VERSION:=$(LIBGCC_VERSION)-r$(PKG_RELEASE)
+ VERSION:=$(LIBGCC_VERSION)-$(PKG_RELEASE)
endef
define Package/libgcc
define Package/libc/Default
SECTION:=libs
CATEGORY:=Base system
- VERSION:=$(LIBC_VERSION)-r$(PKG_RELEASE)
+ VERSION:=$(LIBC_VERSION)-$(PKG_RELEASE)
DEPENDS:=+libgcc
URL:=$(LIBC_URL)
endef
}
do_snapshot_upgrade() {
- apk upgrade
+ if command -v opkg; then
+ opkg update
+ [ $? -eq 0 ] || exit 1
+
+ opkg list-upgradable
+ [ $? -eq 0 ] || exit 2
+
+ UPDATES=`opkg list-upgradable | cut -d" " -f1`
+ [ -z "${UPDATES}" ] && exit 0
+
+ opkg upgrade ${UPDATES}
+ [ $? -eq 0 ] || exit 3
+ else
+ apk upgrade
+ fi
do_snapshot_push
sleep 5
printf "\t\tdepends on PER_FEED_REPO\n";
printf "\t\tdefault y\n" if $installed;
printf "\t\thelp\n";
- printf "\t\t Enable the \\\"%s\\\" feed in apk repositories.\n", $feed->[1];
+ printf "\t\t Enable the \\\"%s\\\" feed in opkg distfeeds.conf and apk repositories.\n", $feed->[1];
printf "\t\t Say M to add the feed commented out.\n";
printf "\n";
}