From 6ca6d317b38fcef792e4564b69d9a5aefc98c85d Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Mon, 11 Jun 2012 00:57:36 +0000
Subject: [PATCH] build: add checks for missing package dependencies

SVN-Revision: 32185
---
 include/package-ipkg.mk     | 22 ++++++++++++++++++++++
 scripts/gen-dependencies.sh | 24 ++++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100755 scripts/gen-dependencies.sh

diff --git a/include/package-ipkg.mk b/include/package-ipkg.mk
index 93c4fdf2f7..e9bac7a23b 100644
--- a/include/package-ipkg.mk
+++ b/include/package-ipkg.mk
@@ -65,6 +65,26 @@ define FixupDependencies
   $(call AddDependency,$(1),$$(DEPS))
 endef
 
+ifneq ($(PKG_NAME),toolchain)
+  define CheckDependencies
+	@( \
+		rm -f $(PKG_INFO_DIR)/$(1).missing; \
+		( \
+			export READELF=$(TARGET_CROSS)readelf XARGS="$(XARGS)"; \
+			$(SCRIPT_DIR)/gen-dependencies.sh "$$(IDIR_$(1))"; \
+		) | while read FILE; do \
+			grep -q "$$$$FILE" $(PKG_INFO_DIR)/$(1).provides || \
+				echo "$$$$FILE" >> $(PKG_INFO_DIR)/$(1).missing; \
+		done; \
+		if [ -f "$(PKG_INFO_DIR)/$(1).missing" ]; then \
+			echo "Package $(1) is missing dependencies for the following libraries:"; \
+			cat "$(PKG_INFO_DIR)/$(1).missing"; \
+			false; \
+		fi; \
+	)
+  endef
+endif
+
 ifeq ($(DUMP),)
   define BuildTarget/ipkg
     IPKG_$(1):=$(PACKAGE_DIR)/$(1)_$(VERSION)_$(PKGARCH).ipk
@@ -124,6 +144,8 @@ ifeq ($(DUMP),)
 			fi; \
 		done; \
 	) | sort -u > $(PKG_INFO_DIR)/$(1).provides
+	$(CheckDependencies)
+
 	$(RSTRIP) $$(IDIR_$(1))
 	( \
 		echo "Package: $(1)"; \
diff --git a/scripts/gen-dependencies.sh b/scripts/gen-dependencies.sh
new file mode 100755
index 0000000000..ab047b6482
--- /dev/null
+++ b/scripts/gen-dependencies.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2012 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+SELF=${0##*/}
+
+READELF="${READELF:-readelf}"
+TARGETS=$*
+XARGS="${XARGS:-xargs -r}"
+
+[ -z "$TARGETS" ] && {
+  echo "$SELF: no directories / files specified"
+  echo "usage: $SELF [PATH...]"
+  exit 1
+}
+
+find $TARGETS -type f -a -exec file {} \; | \
+  sed -n -e 's/^\(.*\):.*ELF.*\(executable\|shared object\).*,.* stripped/\1/p' | \
+  $XARGS -n1 readelf -d | \
+  awk '$2 ~ /NEEDED/ && $NF !~ /interpreter/ { gsub(/[\[\]]/, "", $NF); print $NF }' | \
+  sort -u
-- 
2.30.2