 1854aeec4d
			
		
	
	1854aeec4d
	
	
	
		
			
			When the list of packages to be installed in a built image exceeds a certain number, then 'opkg install' executed for target '$(curdir)/install' in package/Makefile fails with: /usr/bin/env: Argument list too long. On Linux, the length of a command-line parameter is limited by MAX_ARG_STRLEN to max 128 kB. * https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/binfmts.h#L15 * https://www.in-ulm.de/~mascheck/various/argmax/ To solve the problem, store the package list being passed to 'opkg install' in a temporary file and use the shell command substitution to pass the content of the file to 'opkg install'. This guarantees that the length of the command-line parameters passed to the bash shell is short. The following bash script demonstrates the problem: ---------------------------------------------------------------------------- count=${1:-1000} FILES="" a_file="/home/egorenar/Repositories/openwrt-rel/bin/targets/alpine/generic/packages/base-files_1414-r16464+19-e887049fbb_arm_cortex-a15_neon-vfpv4.ipk" for i in $(seq 1 $count); do FILES="$FILES $a_file" done env bash -c "echo $FILES >/dev/null" echo "$FILES" | wc -c ---------------------------------------------------------------------------- Test run: ---------------------------------------------------------------------------- $ ./test.sh 916 130989 $ ./test.sh 917 ./test.sh: line 14: /bin/env: Argument list too long 131132 ---------------------------------------------------------------------------- Signed-off-by: Alexander Egorenkov <egorenar-dev@posteo.net> [reword commit subject] Signed-off-by: Paul Spooren <mail@aparcar.org>
		
			
				
	
	
		
			115 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| #
 | |
| # Copyright (C) 2006-2010 OpenWrt.org
 | |
| #
 | |
| # This is free software, licensed under the GNU General Public License v2.
 | |
| # See /LICENSE for more information.
 | |
| #
 | |
| 
 | |
| curdir:=package
 | |
| 
 | |
| include $(INCLUDE_DIR)/feeds.mk
 | |
| include $(INCLUDE_DIR)/rootfs.mk
 | |
| 
 | |
| -include $(TMP_DIR)/.packagedeps
 | |
| package-y += kernel/linux
 | |
| $(curdir)/autoremove:=1
 | |
| $(curdir)/builddirs:=$(sort $(package-) $(package-y) $(package-m))
 | |
| $(curdir)/builddirs-default:=. $(sort $(package-y) $(package-m))
 | |
| $(curdir)/builddirs-prereq:=. $(sort $(prereq-y) $(prereq-m))
 | |
| ifdef CHECK_ALL
 | |
| $(curdir)/builddirs-check:=$($(curdir)/builddirs)
 | |
| $(curdir)/builddirs-download:=$($(curdir)/builddirs)
 | |
| endif
 | |
| ifneq ($(IGNORE_ERRORS),)
 | |
|   package-y-filter := $(package-y)
 | |
|   package-m-filter := $(filter-out $(package-y),$(package-m))
 | |
|   package-n-filter := $(filter-out $(package-y) $(package-m),$(package-))
 | |
|   package-ignore-errors := $(filter n m y,$(IGNORE_ERRORS))
 | |
|   package-ignore-errors := $(if $(package-ignore-errors),$(package-ignore-errors),n m)
 | |
|   package-ignore-subdirs := $(sort $(foreach m,$(package-ignore-errors),$(package-$(m)-filter)))
 | |
|   $(curdir)/builddirs-ignore-download := $(package-ignore-subdirs)
 | |
|   $(curdir)/builddirs-ignore-compile := $(package-ignore-subdirs)
 | |
|   $(curdir)/builddirs-ignore-host-download := $(package-ignore-subdirs)
 | |
|   $(curdir)/builddirs-ignore-host-compile := $(package-ignore-subdirs)
 | |
| endif
 | |
| 
 | |
| PACKAGE_INSTALL_FILES:= \
 | |
| 	$(foreach pkg,$(sort $(package-y)), \
 | |
| 		$(foreach variant, \
 | |
| 			$(if $(strip $(package/$(pkg)/variants)), \
 | |
| 				$(package/$(pkg)/variants), \
 | |
| 				$(if $(package/$(pkg)/default-variant), \
 | |
| 					$(package/$(pkg)/default-variant), \
 | |
| 					default \
 | |
| 				) \
 | |
| 			), \
 | |
| 			$(PKG_INFO_DIR)/$(lastword $(subst /,$(space),$(pkg))).$(variant).install \
 | |
| 		) \
 | |
| 	)
 | |
| 
 | |
| $(curdir)/cleanup: $(TMP_DIR)/.build
 | |
| 	rm -rf $(STAGING_DIR_ROOT)
 | |
| 
 | |
| $(curdir)/merge:
 | |
| 	rm -rf $(PACKAGE_DIR_ALL)
 | |
| 	mkdir -p $(PACKAGE_DIR_ALL)
 | |
| 	-$(foreach pdir,$(PACKAGE_SUBDIRS),$(if $(wildcard $(pdir)/*.ipk),ln -s $(pdir)/*.ipk $(PACKAGE_DIR_ALL);))
 | |
| 
 | |
| $(curdir)/merge-index: $(curdir)/merge
 | |
| 	(cd $(PACKAGE_DIR_ALL) && $(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages; )
 | |
| 
 | |
| ifndef SDK
 | |
|   $(curdir)/compile: $(curdir)/system/opkg/host/compile
 | |
| 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
 | |
| 	$(file >$(TMP_DIR)/opkg_install_list,\
 | |
| 	  $(call opkg_package_files,\
 | |
| 	    $(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(pkg)$(call GetABISuffix,$(pkg)))))
 | |
| 	$(call opkg,$(TARGET_DIR)) install $$(cat $(TMP_DIR)/opkg_install_list)
 | |
| 	@for file in $(PACKAGE_INSTALL_FILES); do \
 | |
| 		[ -s $$file.flags ] || continue; \
 | |
| 		for flag in `cat $$file.flags`; do \
 | |
| 			$(call opkg,$(TARGET_DIR)) flag $$flag `cat $$file`; \
 | |
| 		done; \
 | |
| 	done || true
 | |
| 
 | |
| 	$(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
 | |
| 
 | |
| 	$(call prepare_rootfs,$(TARGET_DIR),$(TOPDIR)/files)
 | |
| 
 | |
| $(curdir)/index: FORCE
 | |
| 	@echo Generating package index...
 | |
| 	@for d in $(PACKAGE_SUBDIRS); do ( \
 | |
| 		mkdir -p $$d; \
 | |
| 		cd $$d || continue; \
 | |
| 		$(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages.manifest; \
 | |
| 		grep -vE '^(Maintainer|LicenseFiles|Source|SourceName|Require|SourceDateEpoch)' Packages.manifest > Packages; \
 | |
| 		case "$$(((64 + $$(stat -L -c%s Packages)) % 128))" in 110|111) \
 | |
| 			$(call ERROR_MESSAGE,WARNING: Applying padding in $$d/Packages to workaround usign SHA-512 bug!); \
 | |
| 			{ echo ""; echo ""; } >> Packages;; \
 | |
| 		esac; \
 | |
| 		gzip -9nc Packages > Packages.gz; \
 | |
| 	); done
 | |
| ifdef CONFIG_SIGNED_PACKAGES
 | |
| 	@echo Signing package index...
 | |
| 	@for d in $(PACKAGE_SUBDIRS); do ( \
 | |
| 		[ -d $$d ] && \
 | |
| 			cd $$d || continue; \
 | |
| 		$(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY); \
 | |
| 	); done
 | |
| endif
 | |
| 
 | |
| $(curdir)/flags-install:= -j1
 | |
| 
 | |
| $(eval $(call stampfile,$(curdir),package,prereq,.config))
 | |
| $(eval $(call stampfile,$(curdir),package,cleanup,$(TMP_DIR)/.build))
 | |
| $(eval $(call stampfile,$(curdir),package,compile,$(TMP_DIR)/.build))
 | |
| $(eval $(call stampfile,$(curdir),package,install,$(TMP_DIR)/.build))
 | |
| $(eval $(call stampfile,$(curdir),package,check,$(TMP_DIR)/.build))
 | |
| 
 | |
| $(eval $(call subdir,$(curdir)))
 |