summaryrefslogtreecommitdiff
path: root/scripts/list-build-dependencies
blob: e13651f39b65fe19ddaf0cbb302e44b5315792d7 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/bin/bash
#
# Copyright (C) 2020 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# in order to easy exprort images built to "external" world
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Parse debian/control like content and extract packages required by the
# Build-Depends statement. Return a string with all required packages.
#
# Code below copied from https://stackoverflow.com/a/47707412 - Thank You!
get_build_depends () {
    echo $(awk '
        /^Build-Depends:/ || /^ / && deps {
        sub(/^[^ ]+: /, "")
        deps = 1
        dep_str = dep_str ", " $0
        next
      }
      { deps=0 }
      END {
        split(dep_str, dep_array, /, */)
        for (d in dep_array) {
          dep = dep_array[d]
          gsub(/[^a-z0-9_.-].*$/, "", dep)
          if (dep && !seen[dep]++) print dep
        }
      }' $1)
}

get_runtime_depends () {
    echo $(awk '
        /^Depends:/ || /^ / && deps {
        sub(/^[^ ]+: /, "")
        deps = 1
        dep_str = dep_str ", " $0
        next
      }
      { deps=0 }
      END {
        split(dep_str, dep_array, /, */)
        for (d in dep_array) {
          dep = dep_array[d]
          gsub(/[^a-z0-9_.-].*$/, "", dep)
          if (dep && !seen[dep]++) print dep
        }
      }' $1)
}

# Some packages are required prior to running this script
BOOTSTRAP_PACKAGES="devscripts curl equivs"
for pkg in $BOOTSTRAP_PACKAGES
do
    dpkg -s $pkg >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "Required package \"$pkg\" not installed"
        exit 1
    fi
done

echo ""
echo "Below you can find a list of packages that are required as build time"
echo "dependency for the individual package"
echo ""
echo "The generated content can be used to populate a file to provision"
echo "e.g. a native build host or a Docker container"
echo ""
echo ""

GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

# First we need to get vyos-world so we know all individual packages for VyOS
curl -L https://github.com/vyos/vyos-world/raw/$GIT_BRANCH/debian/control \
  --output /tmp/vyos-world.control --retry 100 --retry-delay 1 --silent

VYOS_PACKAGES=$(get_runtime_depends /tmp/vyos-world.control)
rm -f /tmp/vyos-world.control
for pkg in $VYOS_PACKAGES
do
    # Check if repo exists
    res=$(curl -o /dev/null --silent -Iw '%{http_code}' https://github.com/vyos/$pkg)
    if [[ $res -ne 200 ]]; then
        continue
    fi

    CTRLFILE=/tmp/$pkg.control
    curl -L https://github.com/vyos/$pkg/raw/$GIT_BRANCH/debian/control \
      --output $CTRLFILE --retry 100 --retry-delay 1 --silent

    declare -a array
    declare -i length cnt

    array=($(get_build_depends $CTRLFILE))
    length=${#array[@]}
    cnt=0

    echo "# Packages needed to build '$pkg' from https://github.com/vyos/$pkg"
    echo "apt-get install -y \\"
    for name in "${array[@]}"; do
        cnt=$((cnt + 1))
        if [[ "$cnt" -eq "$length" ]]; then
            echo "  $name"
        else
            echo "  $name \\"
        fi
    done
    rm -f $CTRLFILE
    echo ""
done