build: add checks for missing package dependencies
authorFelix Fietkau <nbd@openwrt.org>
Mon, 11 Jun 2012 00:57:36 +0000 (00:57 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 11 Jun 2012 00:57:36 +0000 (00:57 +0000)
SVN-Revision: 32185

include/package-ipkg.mk
scripts/gen-dependencies.sh [new file with mode: 0755]

index 93c4fdf2f7c52609aa705f37fdfbabee2abc7a08..e9bac7a23be9a3d3b5d75eeb246ac3daeb64d02c 100644 (file)
@@ -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 (executable)
index 0000000..ab047b6
--- /dev/null
@@ -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