Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 241 lines (182 sloc) 6.039 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
86126ed @falconindy api: kill slow path in locating modules
authored
82 read -rd '' modpath < <(__kmodinfo -n "$module" 2>/dev/null)
72866c6 @falconindy error on module not found in API
authored
83 if [[ -z "$modpath" ]]; then
84 error "Module not found: $module"
85 return 1
86 fi
75052c2 @falconindy initial commit
authored
87
c5b484a @falconindy api: ignore EEXIST return in add_module
authored
88 __add_file "${modpath#$basedir}" "$modpath" 644
89 [[ $? = @(0|$EEXIST) ]] || return 1
75052c2 @falconindy initial commit
authored
90
91 # grab firmware
d1be2d7 @falconindy rename kmodinfo as __kmodinfo
authored
92 IFS=',' read -rd '' -a firmware < <(__kmodinfo -F firmware "$modpath")
75052c2 @falconindy initial commit
authored
93 for fw in "${firmware[@]}"; do
13711ff @falconindy only add firmware if its found
authored
94 if [[ -e $basedir/lib/firmware/$fw ]]; then
95 __add_file "/lib/firmware/$fw" "$basedir/lib/firmware/$fw" 644
96 fi
75052c2 @falconindy initial commit
authored
97 done
98
6438c9a @falconindy cleanup API, flesh out comments
authored
99 # resolve deps
d1be2d7 @falconindy rename kmodinfo as __kmodinfo
authored
100 IFS=',' read -rd '' -a moddeps < <(__kmodinfo -F depends "$modpath")
75052c2 @falconindy initial commit
authored
101 for dep in "${moddeps[@]}"; do
102 add_module "$dep"
103 done
104
105 # add in any quirks
f2136d7 @falconindy add quirks file for quirky modules
authored
106 for mod in ${modquirks[$module]}; do
107 add_module "$mod"
108 done
75052c2 @falconindy initial commit
authored
109
110 return 0
111 } # }}}
112
113 add_binary() { # {{{
ce83c05 @falconindy cleanup API documentation
authored
114 # add a binary file with .so depends
115 # $1: path to binary
9ca666e @falconindy more fixes for adventures in $basedir land
authored
116 # $2: destination on initcpio (optional: assumes same as source)
ce83c05 @falconindy cleanup API documentation
authored
117
118 (( $# )) || return 1
75052c2 @falconindy initial commit
authored
119
120 local -a sodeps
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
121 local regex= binary= dest= mode= sodep= resolved= dirname=
9ca666e @falconindy more fixes for adventures in $basedir land
authored
122
58c9f9f @falconindy go on a quoting spree.
authored
123 if [[ "${1:0:1}" == @ ]]; then # assert an absolute path
9ca666e @falconindy more fixes for adventures in $basedir land
authored
124 binary=${1:1}
125 else
126 binary=$basedir$1
127 fi
128
58c9f9f @falconindy go on a quoting spree.
authored
129 [[ -f "$binary" ]] || { error "$binary not found"; return 1; }
e37a454 @falconindy avoid using public API from within the API itself
authored
130
9ca666e @falconindy more fixes for adventures in $basedir land
authored
131 dest=${2:-$binary}
e37a454 @falconindy avoid using public API from within the API itself
authored
132 mode=$(stat -c %a "$binary")
517c50b @falconindy reroute non-binaries passed to add_binary
authored
133
d507fd0 @falconindy api: condense logic. always add, return when its not a binary
authored
134 # the file itself
135 __add_file "$dest" "$binary" "$mode"
75052c2 @falconindy initial commit
authored
136
d507fd0 @falconindy api: condense logic. always add, return when its not a binary
authored
137 "$ld_so" --verify "$binary" &>/dev/null || return # not a binary!
a04ee4e @falconindy dont add deps for a binary if it cant be successfully added to the image
authored
138
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
139 # resolve sodeps
af9ae20 @falconindy filter harder on __ldd output
authored
140 regex='^[[:space:]]*[^/].+ => (.*) \(.*\)'
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
141 while read line; do
58c9f9f @falconindy go on a quoting spree.
authored
142 [[ "$line" =~ $regex ]] && sodep="${BASH_REMATCH[1]}" || continue
75052c2 @falconindy initial commit
authored
143
58c9f9f @falconindy go on a quoting spree.
authored
144 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
145 if [[ ! -L $sodep ]]; then
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
146 __add_file "$sodep" "$basedir$sodep" "$(stat -c %a "$sodep")"
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
147 else
e37a454 @falconindy avoid using public API from within the API itself
authored
148 resolved=$(readlink -e "$basedir$sodep")
149 dirname=${resolved%/*}
150 __add_dir "${dirname#$basedir}" 755
151 __add_slink "$sodep" "${resolved#$basedir}"
9ca666e @falconindy more fixes for adventures in $basedir land
authored
152 __add_file "${resolved#$basedir}" "$resolved" 755
adc8b85 @falconindy fix add_binary so it adds more than just broken symlinks
authored
153 fi
154 fi
b19f848 @falconindy refactor sodep parsing by reimplementing ldd
authored
155 done < <(__ldd "$binary")
75052c2 @falconindy initial commit
authored
156
157 } # }}}
158
ce83c05 @falconindy cleanup API documentation
authored
159 add_pipe() { # {{{
160 # add a fifo
161 # $1: path of pipe
162 # $2: mode (optional, defaults to 644)
163
164 (( $# )) || return 1
165
b709a97 @falconindy call add_path_to_file prior to __add_pipe
authored
166 add_path_to_file "$1"
ce83c05 @falconindy cleanup API documentation
authored
167 __add_pipe "$1" "${2:-644}"
168 } # }}}
75052c2 @falconindy initial commit
authored
169
f1b4dae @falconindy introduce use_hookscript public API call
authored
170 use_hookscript() { # {{{
171 # specifies that a builder should install a hookscript
ce83c05 @falconindy cleanup API documentation
authored
172 # "$builder" comes from the builder parsing loop in main
4d2713d @falconindy allow specifying a alternate name for the hookscript
authored
173 # $1: script name (optional, defaults to the name of the builder)
174 local script=${1:-$builder}
9fd7d2b @falconindy fix grep call in add_driver_classes one more time
authored
175
4d2713d @falconindy allow specifying a alternate name for the hookscript
authored
176 if [[ ! -f $basedir$_sharedir/hooks/$script ]]; then
177 error "unable to find hook script: $script"
178 return 1
179 fi
180
9953e57 @falconindy fix reversed arguments in use_hookscript
authored
181 __add_file "/hooks/$script" "$basedir$_sharedir/hooks/$script" 755
f1b4dae @falconindy introduce use_hookscript public API call
authored
182 } # }}}
183
5fccc08 @falconindy api: add basic method for adding mount hooks
authored
184 use_mounthook() { # {{{
185 # specifies that a builder should install a custom mount handler.
186
187 local mounthook=${1:-$builder}
188
189 if [[ ! -f $basedir$_sharedir/mount/$mounthook ]]; then
190 error "unable to find mount hook: $mounthook"
191 return 1
192 fi
193
194 __add_file "/mount/$mounthook" "$basedir$_sharedir/mount/$mounthook" 755
195 } # }}}
196
e735fbc @falconindy change add_driver_classes -> add_checked_modules, add add_all_modules
authored
197 add_checked_modules() { # {{{
198 # add a class of modules, as a dir relative to /lib/modules/$kernver/kernel.
7b78689 @falconindy implement module filtering for add_driver_classes
authored
199 # if you need to block addition of modules, you can add glob patterns to the
7682d99 @falconindy modulefilter => MODFILTER
authored
200 # 'MODFILTER' array within your builder. They must be quoted and the
46ccd58 @falconindy cleanup API comments
authored
201 # filter is cleared after parsing of each builder.
ce83c05 @falconindy cleanup API documentation
authored
202 # $@: directories
203
75052c2 @falconindy initial commit
authored
204 local -a mods
dbffde7 @falconindy give add_driver_classes meaningful return values
authored
205 local -i ret=0
6438c9a @falconindy cleanup API, flesh out comments
authored
206 local mod=
75052c2 @falconindy initial commit
authored
207
208 # find modules by class (e.g. drivers/ata)
e37a454 @falconindy avoid using public API from within the API itself
authored
209 pushd "$basedir$moduledir/kernel" &>/dev/null
75052c2 @falconindy initial commit
authored
210 while read -rd '' mod; do
52dcddc @falconindy Simplify module discovery, knowing that . is illegal
authored
211 mods+=("${mod%%.*}")
29583f3 @falconindy api: leverage gnu find's -printf flag
authored
212 done < <(find "$@" -type f -name '*.ko*' -printf '%f\0' 2>/dev/null)
75052c2 @falconindy initial commit
authored
213 popd &>/dev/null
214
215 # only add what autodetect found if we have a module cache
58c9f9f @falconindy go on a quoting spree.
authored
216 [[ -s "$autodetect_cache" && -z "$NOAUTO" ]] &&
afb7ec8 @falconindy supply grep with -F to avoid interpretation
authored
217 IFS=$'\n' read -rd '' -a mods < <(grep -xFf <(printf '%s\n' "${mods[@]//-/_}") "$autodetect_cache")
75052c2 @falconindy initial commit
authored
218
219 for mod in "${mods[@]}"; do
7b78689 @falconindy implement module filtering for add_driver_classes
authored
220 # check for filter match
7682d99 @falconindy modulefilter => MODFILTER
authored
221 for filter in "${MODFILTER[@]}"; do
58c9f9f @falconindy go on a quoting spree.
authored
222 [[ "$mod" == $filter ]] && continue 2
7b78689 @falconindy implement module filtering for add_driver_classes
authored
223 done
224
dbffde7 @falconindy give add_driver_classes meaningful return values
authored
225 add_module "$mod" && (( ++ret ))
75052c2 @falconindy initial commit
authored
226 done
dbffde7 @falconindy give add_driver_classes meaningful return values
authored
227
228 # return 0 on modules added, else 1
229 return $(( ! ret ))
75052c2 @falconindy initial commit
authored
230 } # }}}
231
e735fbc @falconindy change add_driver_classes -> add_checked_modules, add add_all_modules
authored
232 add_all_modules() { # {{{
233 # add a class of modules, as a dir relative to /lib/modules/$kernver/kernel.
234 # this function honors 'MODFILTER', but does not check against the autodetected
235 # cache of modules.
236
237 NOAUTO=1 add_checked_modules "$@"
238 } # }}}
239
49078e2 @falconindy general builder code standardized/cleanup
authored
240 # vim: set et sw=2 ft=sh:
Something went wrong with that request. Please try again.