Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 251 lines (191 sloc) 6.35 kb
75052c2 @falconindy initial commit
authored
1 #!/bin/bash
2 #
e5a8d5b @falconindy standardize file headers and add MIT licensee
authored
3 # geninit.api
75052c2 @falconindy initial commit
authored
4 #
e5a8d5b @falconindy standardize file headers and add MIT licensee
authored
5 # This file is part of geninit.
6 #
7 # declares intended public API calls for builders to use. These functions
8 # should be used over other functions in geninit such as __add_file, which have
9 # no awareness of things such as $basedir or $kernver.
75052c2 @falconindy initial commit
authored
10 #
11
6438c9a @falconindy cleanup API, flesh out comments
authored
12 add_dir() { # {{{
61ed3b4 @falconindy use find|cpio instead of gen_init_cpio
authored
13 # add a directory (with parents)
6438c9a @falconindy cleanup API, flesh out comments
authored
14 # $1: absolute path on initcpio
75052c2 @falconindy initial commit
authored
15 # $2: mode (optional, defaults to 755)
16
17 (( ! $# )) && return 1 # NOOP
18
19 local path=$1 mode=${2:-755}
20
21 __add_dir "$path" "$mode"
6438c9a @falconindy cleanup API, flesh out comments
authored
22 } # }}}
75052c2 @falconindy initial commit
authored
23
24 add_file() { # {{{
25 # add a regular file. no parsing done.
26 # $1: source on disk
27 # $2: destination on initcpio (optional: assumes same as source)
28
ce83c05 @falconindy cleanup API documentation
authored
29 (( $# )) || return 1 # NOOP
75052c2 @falconindy initial commit
authored
30
31 # determine source and destination
9ca666e @falconindy more fixes for adventures in $basedir land
authored
32 local src= dest=${2:-$1} mode=
75052c2 @falconindy initial commit
authored
33
58c9f9f @falconindy go on a quoting spree.
authored
34 if [[ "${1:0:1}" == @ ]]; then # assert an absolute path
9ca666e @falconindy more fixes for adventures in $basedir land
authored
35 src=${1:1}
36 else
37 src=$basedir$1
75052c2 @falconindy initial commit
authored
38 fi
39
58c9f9f @falconindy go on a quoting spree.
authored
40 [[ -f "$src" ]] || { error "$src: No such file"; return 1; }
9ca666e @falconindy more fixes for adventures in $basedir land
authored
41
75052c2 @falconindy initial commit
authored
42 mode=$(stat -c %a "$src")
58c9f9f @falconindy go on a quoting spree.
authored
43 if [[ -z "$mode" ]]; then
8584669 @falconindy replace old and busted output functions with makepkg's
authored
44 error "failed to stat file: \`$src'"
75052c2 @falconindy initial commit
authored
45 return 1
46 fi
47
e37a454 @falconindy avoid using public API from within the API itself
authored
48 __add_file "${dest#$basedir}" "$src" "$mode"
75052c2 @falconindy initial commit
authored
49 } # }}}
50
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
51 add_symlink() { # {{{
6438c9a @falconindy cleanup API, flesh out comments
authored
52 # add a symlink
9c28450 @falconindy reverse parameters to add_symlink to model common form of ls invocation
authored
53 # $1: target of $2
54 # $2: name on initcpio
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
55
ce83c05 @falconindy cleanup API documentation
authored
56 (( $# == 2 )) || return 1
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
57
c8af038 @falconindy fix regression spotted by commit 809b5b2
authored
58 add_path_to_file "$1"
9c28450 @falconindy reverse parameters to add_symlink to model common form of ls invocation
authored
59 __add_slink "$2" "$1"
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
60 } # }}}
75052c2 @falconindy initial commit
authored
61
62 add_path_to_file() { # {{{
6438c9a @falconindy cleanup API, flesh out comments
authored
63 # add the path leading up to a file
64 # $1: filename with full path
ce83c05 @falconindy cleanup API documentation
authored
65
66 (( $# )) || return 1
67
68 add_dir "${1%/*}"
75052c2 @falconindy initial commit
authored
69 } # }}}
70
71 add_module() { # {{{
ce83c05 @falconindy cleanup API documentation
authored
72 # add a kernel module with dependencies
6438c9a @falconindy cleanup API, flesh out comments
authored
73 # $1: kernel module by name (no path, with or without extension)
75052c2 @falconindy initial commit
authored
74
ce83c05 @falconindy cleanup API documentation
authored
75 (( $# )) || return 1
76
75052c2 @falconindy initial commit
authored
77 local -a firmware moddeps
e37a454 @falconindy avoid using public API from within the API itself
authored
78 local modpath= module= mod= dep=
75052c2 @falconindy initial commit
authored
79
52dcddc @falconindy Simplify module discovery, knowing that . is illegal
authored
80 module=${1%%.*}
75052c2 @falconindy initial commit
authored
81
58c9f9f @falconindy go on a quoting spree.
authored
82 if [[ -z "$basedir" ]]; then # fast path =)
d1be2d7 @falconindy rename kmodinfo as __kmodinfo
authored
83 read -rd '' modpath < <(__kmodinfo -n "$module" 2>/dev/null)
75052c2 @falconindy initial commit
authored
84 else # slow path =(
52dcddc @falconindy Simplify module discovery, knowing that . is illegal
authored
85 read -rd '' modpath < <(find "$basedir$moduledir/kernel" -type f
86 -name "$module.ko*" -print0)
75052c2 @falconindy initial commit
authored
87 fi
88
72866c6 @falconindy error on module not found in API
authored
89 if [[ -z "$modpath" ]]; then
90 error "Module not found: $module"
91 return 1
92 fi
75052c2 @falconindy initial commit
authored
93
e37a454 @falconindy avoid using public API from within the API itself
authored
94 __add_file "${modpath#$basedir}" "$modpath" 644 || return 1
75052c2 @falconindy initial commit
authored
95
96 # grab firmware
d1be2d7 @falconindy rename kmodinfo as __kmodinfo
authored
97 IFS=',' read -rd '' -a firmware < <(__kmodinfo -F firmware "$modpath")
75052c2 @falconindy initial commit
authored
98 for fw in "${firmware[@]}"; do
13711ff @falconindy only add firmware if its found
authored
99 if [[ -e $basedir/lib/firmware/$fw ]]; then
100 __add_file "/lib/firmware/$fw" "$basedir/lib/firmware/$fw" 644
101 fi
75052c2 @falconindy initial commit
authored
102 done
103
6438c9a @falconindy cleanup API, flesh out comments
authored
104 # resolve deps
d1be2d7 @falconindy rename kmodinfo as __kmodinfo
authored
105 IFS=',' read -rd '' -a moddeps < <(__kmodinfo -F depends "$modpath")
75052c2 @falconindy initial commit
authored
106 for dep in "${moddeps[@]}"; do
107 add_module "$dep"
108 done
109
110 # add in any quirks
f2136d7 @falconindy add quirks file for quirky modules
authored
111 for mod in ${modquirks[$module]}; do
112 add_module "$mod"
113 done
75052c2 @falconindy initial commit
authored
114
115 return 0
116 } # }}}
117
118 add_binary() { # {{{
ce83c05 @falconindy cleanup API documentation
authored
119 # add a binary file with .so depends
120 # $1: path to binary
9ca666e @falconindy more fixes for adventures in $basedir land
authored
121 # $2: destination on initcpio (optional: assumes same as source)
ce83c05 @falconindy cleanup API documentation
authored
122
123 (( $# )) || return 1
75052c2 @falconindy initial commit
authored
124
125 local -a sodeps
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
126 local regex= binary= dest= mode= sodep= resolved= dirname=
9ca666e @falconindy more fixes for adventures in $basedir land
authored
127
58c9f9f @falconindy go on a quoting spree.
authored
128 if [[ "${1:0:1}" == @ ]]; then # assert an absolute path
9ca666e @falconindy more fixes for adventures in $basedir land
authored
129 binary=${1:1}
130 else
131 binary=$basedir$1
132 fi
133
58c9f9f @falconindy go on a quoting spree.
authored
134 [[ -f "$binary" ]] || { error "$binary not found"; return 1; }
e37a454 @falconindy avoid using public API from within the API itself
authored
135
9ca666e @falconindy more fixes for adventures in $basedir land
authored
136 dest=${2:-$binary}
e37a454 @falconindy avoid using public API from within the API itself
authored
137 mode=$(stat -c %a "$binary")
517c50b @falconindy reroute non-binaries passed to add_binary
authored
138
2cbb19b @falconindy squelch /lib/ld.so because i686 is ridiculous
authored
139 if ! "$ld_so" --verify "$binary" &>/dev/null; then
517c50b @falconindy reroute non-binaries passed to add_binary
authored
140 # this isn't a binary!
b9f399c @falconindy api: fix src::dest file adding when not a binary
authored
141 __add_file "$dest" "$binary" "$mode"
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
142 return $? # return with __add_file's return val
517c50b @falconindy reroute non-binaries passed to add_binary
authored
143 fi
75052c2 @falconindy initial commit
authored
144
a04ee4e @falconindy dont add deps for a binary if it cant be successfully added to the image
authored
145 # the binary itself
146 __add_file "${dest#$basedir}" "${binary#$basedir}" 755 || return 1
147
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
148 # resolve sodeps
af9ae20 @falconindy filter harder on __ldd output
authored
149 regex='^[[:space:]]*[^/].+ => (.*) \(.*\)'
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
150 while read line; do
58c9f9f @falconindy go on a quoting spree.
authored
151 [[ "$line" =~ $regex ]] && sodep="${BASH_REMATCH[1]}" || continue
75052c2 @falconindy initial commit
authored
152
58c9f9f @falconindy go on a quoting spree.
authored
153 if [[ -f "$sodep" ]]; then # -f follows symlinks, don't believe it!
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
154 if [[ ! -L $sodep ]]; then
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
155 __add_file "$sodep" "$basedir$sodep" "$(stat -c %a "$sodep")"
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
156 else
e37a454 @falconindy avoid using public API from within the API itself
authored
157 resolved=$(readlink -e "$basedir$sodep")
158 dirname=${resolved%/*}
159 __add_dir "${dirname#$basedir}" 755
160 __add_slink "$sodep" "${resolved#$basedir}"
9ca666e @falconindy more fixes for adventures in $basedir land
authored
161 __add_file "${resolved#$basedir}" "$resolved" 755
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
162 fi
163 fi
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
164 done < <(__ldd "$binary")
75052c2 @falconindy initial commit
authored
165
166 } # }}}
167
ce83c05 @falconindy cleanup API documentation
authored
168 add_pipe() { # {{{
169 # add a fifo
170 # $1: path of pipe
171 # $2: mode (optional, defaults to 644)
172
173 (( $# )) || return 1
174
b709a97 @falconindy call add_path_to_file prior to __add_pipe
authored
175 add_path_to_file "$1"
ce83c05 @falconindy cleanup API documentation
authored
176 __add_pipe "$1" "${2:-644}"
177 } # }}}
75052c2 @falconindy initial commit
authored
178
f1b4dae @falconindy introduce use_hookscript public API call
authored
179 use_hookscript() { # {{{
180 # specifies that a builder should install a hookscript
ce83c05 @falconindy cleanup API documentation
authored
181 # "$builder" comes from the builder parsing loop in main
4d2713d @falconindy allow specifying a alternate name for the hookscript
authored
182 # $1: script name (optional, defaults to the name of the builder)
183 local script=${1:-$builder}
9fd7d2b @falconindy fix grep call in add_driver_classes one more time
authored
184
4d2713d @falconindy allow specifying a alternate name for the hookscript
authored
185 if [[ ! -f $basedir$_sharedir/hooks/$script ]]; then
186 error "unable to find hook script: $script"
187 return 1
188 fi
189
9953e57 @falconindy fix reversed arguments in use_hookscript
authored
190 __add_file "/hooks/$script" "$basedir$_sharedir/hooks/$script" 755
f1b4dae @falconindy introduce use_hookscript public API call
authored
191 } # }}}
192
5fccc08 @falconindy api: add basic method for adding mount hooks
authored
193 use_mounthook() { # {{{
194 # specifies that a builder should install a custom mount handler.
195
196 local mounthook=${1:-$builder}
197
198 if [[ ! -f $basedir$_sharedir/mount/$mounthook ]]; then
199 error "unable to find mount hook: $mounthook"
200 return 1
201 fi
202
203 __add_file "/mount/$mounthook" "$basedir$_sharedir/mount/$mounthook" 755
204 } # }}}
205
e735fbc @falconindy change add_driver_classes -> add_checked_modules, add add_all_modules
authored
206 add_checked_modules() { # {{{
207 # add a class of modules, as a dir relative to /lib/modules/$kernver/kernel.
7b78689 @falconindy implement module filtering for add_driver_classes
authored
208 # if you need to block addition of modules, you can add glob patterns to the
7682d99 @falconindy modulefilter => MODFILTER
authored
209 # 'MODFILTER' array within your builder. They must be quoted and the
46ccd58 @falconindy cleanup API comments
authored
210 # filter is cleared after parsing of each builder.
ce83c05 @falconindy cleanup API documentation
authored
211 # $@: directories
212
75052c2 @falconindy initial commit
authored
213 local -a mods
dbffde7 @falconindy give add_driver_classes meaningful return values
authored
214 local -i ret=0
6438c9a @falconindy cleanup API, flesh out comments
authored
215 local mod=
75052c2 @falconindy initial commit
authored
216
217 # find modules by class (e.g. drivers/ata)
e37a454 @falconindy avoid using public API from within the API itself
authored
218 pushd "$basedir$moduledir/kernel" &>/dev/null
75052c2 @falconindy initial commit
authored
219 while read -rd '' mod; do
220 mod=${mod##*/}
52dcddc @falconindy Simplify module discovery, knowing that . is illegal
authored
221 mods+=("${mod%%.*}")
222 done < <(find "$@" -type f -name '*.ko*' -print0 2>/dev/null)
75052c2 @falconindy initial commit
authored
223 popd &>/dev/null
224
225 # only add what autodetect found if we have a module cache
58c9f9f @falconindy go on a quoting spree.
authored
226 [[ -s "$autodetect_cache" && -z "$NOAUTO" ]] &&
afb7ec8 @falconindy supply grep with -F to avoid interpretation
authored
227 IFS=$'\n' read -rd '' -a mods < <(grep -xFf <(printf '%s\n' "${mods[@]//-/_}") "$autodetect_cache")
75052c2 @falconindy initial commit
authored
228
229 for mod in "${mods[@]}"; do
7b78689 @falconindy implement module filtering for add_driver_classes
authored
230 # check for filter match
7682d99 @falconindy modulefilter => MODFILTER
authored
231 for filter in "${MODFILTER[@]}"; do
58c9f9f @falconindy go on a quoting spree.
authored
232 [[ "$mod" == $filter ]] && continue 2
7b78689 @falconindy implement module filtering for add_driver_classes
authored
233 done
234
dbffde7 @falconindy give add_driver_classes meaningful return values
authored
235 add_module "$mod" && (( ++ret ))
75052c2 @falconindy initial commit
authored
236 done
dbffde7 @falconindy give add_driver_classes meaningful return values
authored
237
238 # return 0 on modules added, else 1
239 return $(( ! ret ))
75052c2 @falconindy initial commit
authored
240 } # }}}
241
e735fbc @falconindy change add_driver_classes -> add_checked_modules, add add_all_modules
authored
242 add_all_modules() { # {{{
243 # add a class of modules, as a dir relative to /lib/modules/$kernver/kernel.
244 # this function honors 'MODFILTER', but does not check against the autodetected
245 # cache of modules.
246
247 NOAUTO=1 add_checked_modules "$@"
248 } # }}}
249
49078e2 @falconindy general builder code standardized/cleanup
authored
250 # vim: set et sw=2 ft=sh:
Something went wrong with that request. Please try again.