-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
generate.sh
executable file
·148 lines (121 loc) · 3.55 KB
/
generate.sh
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/bash
set -e
shopt -s globstar
cd "$(dirname "$0")"
source util/vars.sh
export LC_ALL=C.UTF-8
rm -f Dockerfile Dockerfile.{dl,final,dl.final}
layername() {
printf "layer-"
basename "$1" | sed 's/.sh$//'
}
to_df() {
_of="${TODF:-Dockerfile}"
printf "$@" >> "$_of"
echo >> "$_of"
}
###
### Generate main Dockerfile
###
exec_dockerstage() {
SCRIPT="$1"
(
SELF="$SCRIPT"
STAGENAME="$(basename "$SCRIPT" | sed 's/.sh$//')"
source util/dl_functions.sh
source "$SCRIPT"
ffbuild_enabled || exit 0
to_df "ENV SELF=\"$SELF\" STAGENAME=\"$STAGENAME\""
STG="$(ffbuild_dockerdl)"
if [[ -n "$STG" ]]; then
HASH="$(sha256sum <<<"$STG" | cut -d" " -f1)"
export SELFCACHE=".cache/downloads/${STAGENAME}_${HASH}.tar.xz"
fi
ffbuild_dockerstage || exit $?
)
}
export TODF="Dockerfile"
to_df "FROM ${REGISTRY}/${REPO}/base-${TARGET}:latest AS base"
to_df "ENV TARGET=$TARGET VARIANT=$VARIANT REPO=$REPO ADDINS_STR=$ADDINS_STR"
to_df "COPY --link util/run_stage.sh /usr/bin/run_stage"
for addin in "${ADDINS[@]}"; do
(
source addins/"${addin}.sh"
type ffbuild_dockeraddin &>/dev/null && ffbuild_dockeraddin || true
)
done
PREVLAYER="base"
for ID in $(ls -1d scripts.d/??-* | sed -s 's|^.*/\(..\).*|\1|' | sort -u); do
LAYER="layer-$ID"
for STAGE in scripts.d/$ID-*; do
to_df "FROM $PREVLAYER AS $(layername "$STAGE")"
if [[ -f "$STAGE" ]]; then
exec_dockerstage "$STAGE"
else
for STAGE in "${STAGE}"/??-*; do
exec_dockerstage "$STAGE"
done
fi
done
to_df "FROM $PREVLAYER AS $LAYER"
for STAGE in scripts.d/$ID-*; do
if [[ -f "$STAGE" ]]; then
SCRIPT="$STAGE"
else
SCRIPTS=( "$STAGE"/??-* )
SCRIPT="${SCRIPTS[-1]}"
fi
(
SELF="$SCRIPT"
SELFLAYER="$(layername "$STAGE")"
source "$SCRIPT"
ffbuild_enabled || exit 0
ffbuild_dockerlayer || exit $?
TODF="Dockerfile.final" PREVLAYER="__PREVLAYER__" \
ffbuild_dockerfinal || exit $?
)
done
PREVLAYER="$LAYER"
done
to_df "FROM base"
sed "s/__PREVLAYER__/$PREVLAYER/g" Dockerfile.final | sort -u >> Dockerfile
rm Dockerfile.final
###
### Compile list of configure arguments and add them to the final Dockerfile
###
get_output() {
(
SELF="$1"
source $1
if ffbuild_enabled; then
ffbuild_$2 || exit 0
else
ffbuild_un$2 || exit 0
fi
)
}
source "variants/${TARGET}-${VARIANT}.sh"
for addin in ${ADDINS[*]}; do
source "addins/${addin}.sh"
done
for script in scripts.d/**/*.sh; do
FF_CONFIGURE+=" $(get_output $script configure)"
FF_CFLAGS+=" $(get_output $script cflags)"
FF_CXXFLAGS+=" $(get_output $script cxxflags)"
FF_LDFLAGS+=" $(get_output $script ldflags)"
FF_LDEXEFLAGS+=" $(get_output $script ldexeflags)"
FF_LIBS+=" $(get_output $script libs)"
done
FF_CONFIGURE="$(xargs <<< "$FF_CONFIGURE")"
FF_CFLAGS="$(xargs <<< "$FF_CFLAGS")"
FF_CXXFLAGS="$(xargs <<< "$FF_CXXFLAGS")"
FF_LDFLAGS="$(xargs <<< "$FF_LDFLAGS")"
FF_LDEXEFLAGS="$(xargs <<< "$FF_LDEXEFLAGS")"
FF_LIBS="$(xargs <<< "$FF_LIBS")"
to_df "ENV \\"
to_df " FF_CONFIGURE=\"$FF_CONFIGURE\" \\"
to_df " FF_CFLAGS=\"$FF_CFLAGS\" \\"
to_df " FF_CXXFLAGS=\"$FF_CXXFLAGS\" \\"
to_df " FF_LDFLAGS=\"$FF_LDFLAGS\" \\"
to_df " FF_LDEXEFLAGS=\"$FF_LDEXEFLAGS\" \\"
to_df " FF_LIBS=\"$FF_LIBS\""