[arch-projects] [mkinitcpio][PATCH 05/12] functions: refactor add_module

Dave Reisner d at falconindy.com
Thu Jun 9 16:09:59 EDT 2011


Simplify and fix a few bugs in the process. We rely solely on modinfo
for obtaining information about module location, dependencies and
firmware. Add a small wrapper function for modinfo that will always
specify our $BASEDIR and $KERNELVERSION for us.

Also, kill off HAS_MODULES. Since we have ADDED_MODULES, which contains
all currently added modules, we can count the elements in this when it
comes time to decide to create depmod files.

Signed-off-by: Dave Reisner <d at falconindy.com>
---
 functions  |   64 ++++++++++++++++++++++++++++++-----------------------------
 mkinitcpio |    2 +-
 2 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/functions b/functions
index 1282e58..c0c0a78 100644
--- a/functions
+++ b/functions
@@ -39,6 +39,10 @@ in_array() {
     return 1 # Not Found
 }
 
+kmodinfo() {
+    modinfo -b "$BASEDIR" -k "$KERNELVERSION" "$@" 2>/dev/null
+}
+
 auto_modules ()
 {
     IFS=$'\n' read -rd '' -a mods < \
@@ -173,50 +177,48 @@ add_file ()
     fi
 }
 
-HAS_MODULES="n"
 declare -a ADDED_MODULES
 #modules are handled specially in order to enable autodetection
 add_module ()
 {
-    local m fil path fw mod deps
-    m=$(get_module_name "${1}")
-    #find pattern - replace _ with [-_] to match either
-    fil="${m//_/[-_]}"
+    local module path fw dep deps
+    module=${1%.ko*}
 
     #skip expensive stuff if this module has already been added
-    if in_array $m ${ADDED_MODULES[@]}; then
-        msg "module $m was already added"
+    if in_array $module ${ADDED_MODULES[@]}; then
+        msg "module $module was already added"
         return
     fi
 
-    found=0
-    for path in $(find "${MODULEDIR}" -type f -name "${fil}.ko" -or -name "${fil}.ko.gz"); do
-        #get needed firmware files
-        for fw in $(/sbin/modinfo -F firmware "${path}"); do
-            [ -f "/lib/firmware/$fw" ] && add_file "/lib/firmware/$fw"
-        done
-        #get module depends
-        deps="$(/sbin/modinfo -F depends "${path}")"
-        for mod in ${deps//,/ }; do
-            if [ -n "${mod}" ]; then
-                add_module "${mod}"
+    path=$(kmodinfo -0F filename "$module")
+    if [[ $path ]]; then
+        # get module firmware
+        while read -r -d '' fw; do
+            if [[ -e "$BASEDIR/lib/firmware/$fw" ]]; then
+                add_file "$BASEDIR/lib/firmware/$fw"
             fi
+        done < <(kmodinfo -0F firmware "$module")
+
+        # get module depends
+        IFS=',' read -r -d '' -a deps < <(kmodinfo -0F depends "$module")
+        for dep in "${deps[@]}"; do
+            add_module "$dep"
         done
-        HAS_MODULES="y"
-        ADDED_MODULES[${#ADDED_MODULES[*]}]="$m"
-        msg "  adding module ${fil}"
-        add_file "${path}" && found=1
-    done
-    if [ ${found} -eq 1 ]; then
-        #explicit module depends
-        case "$m" in 
-            fat) add_module "nls_cp437" ;;
-            ocfs2) add_module "configfs" ;;
-            libcrc32c) add_module "crc32c"; add_module "crc32c_intel" ;;
-        esac
+
+        ADDED_MODULES+=("$module")
+        msg "  adding module $module"
+        add_file "$path" || return
     else
-        err "module '$m' not found"
+        err "module '$module' not found"
+        return
     fi
+
+    # explicit module depends
+    case "$module" in
+        fat) add_module "nls_cp437" ;;
+        ocfs2) add_module "configfs" ;;
+        libcrc32c) add_module "crc32c"; add_module "crc32c_intel" ;;
+    esac
 }
 
 add_binary ()
diff --git a/mkinitcpio b/mkinitcpio
index fc50396..ac9522b 100755
--- a/mkinitcpio
+++ b/mkinitcpio
@@ -274,7 +274,7 @@ for hook in ${HOOKS}; do
     fi
 done
 
-if [ "${HAS_MODULES}" = "y" ]; then
+if (( ${#ADDED_MODULES[*]} )); then
     echo ":: Generating module dependencies"
     for mod in $(grep "file /lib/modules/${KERNELVERSION}" ${FILELIST} | cut -d' ' -f2); do
         install -m 644 -D "${BASEDIR}${mod}" "${TMPDIR}${mod}"
-- 
1.7.5.4



More information about the arch-projects mailing list