summaryrefslogtreecommitdiff
path: root/make
blob: 9f3548356f7d40cb01ee7a3acaf53d0d21bc5370 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/sh

set -e

compressor="lz4 --best --favor-decSpeed -l"

# generate a cpio entry for a command
gen_cmd() {
    cmd=$1
    cmdp="$(command -v "$cmd")"
    # builtin
    if [ "$cmd" = "$cmdp" ]; then
        return
    fi
    printf 'file %s %s 0755 0 0\n' "$cmdp" "$cmdp"
    ldd "$cmdp" | grep / | while read line; do
        tmp=${line% *}
        lib=/${tmp#*/}
        # don't bother with ld.so.conf
        printf 'file /lib64/%s %s 0755 0 0\n' "${lib##*/}" "$lib"
    done
}

# generate the main file list
gen_cpio_list() {
    sed -e '/^#/d' cpio_list.txt
    gen_cmd e2fsck
    gen_cmd dropbear
    export LD_PRELOAD=libgcc_s.so.1
    gen_cmd cryptsetup
}

# filter the list and insert parent directory entries
gen_dir_ents() {
    while read type target args; do
        # re-print the original entry
        printf '%s %s %s\n' "$type" "$target" "$args"
        # print the necessary directory entries. duplicates will be
        # filtered by sort -u later
        while [ "${target%/*}" != '' ]; do
            target=${target%/*}
            printf 'dir %s 0755 0 0\n' "$target"
        done
    done
}

# filter the list and generate the make dependency file
gen_depfile() {
    deps='cpio_list.txt make'
    while read type target source args; do
        # re-print the original entry
        printf '%s %s %s %s\n' "$type" "$target" "$source" "$args"
        # accumulate the dependencies in a list to avoid make bugs.
        # there will be no duplicates since the list was previously sorted
        if [ "$type" = file ]; then
            deps="$deps $source"
            # avoid "No rule to make target" when deps disappear
            echo "$source:" >&3
        fi
    done
    echo "initramfs.img: $deps" >&3
}

if ! [ -e cpio_list.txt ] || ! [ -e gen_init_cpio ]; then
    cd "${0%/*}"
fi

gen_cpio_list | \
gen_dir_ents | \
sort -u | \
gen_depfile 3>initramfs.d | \
./gen_init_cpio -t 0 - | \
$compressor > initramfs.img