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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
#compdef dkms
local curcontext="$curcontext" ign cmds opts ret=1
local -a state line expl args subcmds dirs
local -A opt_args
subcmds=(
'add:add a module/version combination to the tree for builds and installs'
'remove:remove a module from the tree'
'build:compile a module for a kernel'
'unbuild:undoes the build of a module'
"install:install a build module for it's corresponding kernel"
'uninstall:uninstall a module for a kernel'
'match:install every module that is installed for a template kernel for another kernel'
'mkdriverdisk:create a floppy driver disk image for use when updated drivers are needed to install an OS'
'mktarball:tar up files in the DKMS tree for a specific module'
'ldtarball:extract a tarball created with mktarball into the DKMS tree'
'mkrpm:create an RPM package for a module'
'mkdeb:create a debian binary package for a module'
'mkdsc:create a debian source package for a module'
'mkbmdeb:create a debian package containing just binary modules'
'mkkmp:create a Kernel Module Package source RPM for a module'
'status:display the current status of modules, versions and kernels within the tree'
'autoinstall:try to install the latest revision of all modules that have been installed for other kernel revisions'
)
args=(
'(1)-m[specify module]:module:->modules'
'(1)-v[specify module version]:version'
'(-q --quiet)'{-q,--quiet}'[suppress output]'
'(--all)*'{-a,--arch}'[specify system architecture]:architecture:->architectures'
'*--directive=:directive'
'--dkmstree=:path:_directories'
'--installtree=:path:_directories'
'--sourcetree=:path:_directories'
'--dkmsframework=:path:_directories'
'--force-version-override'
'1: : _describe -t commands command subcmds'
)
cmd=${${${subcmds%%:*}:*words}[1]}
if [[ -n $cmd ]]; then
curcontext="${curcontext%:*}-$cmd:"
else
# exclude sub-commands based on any options specified so far
for cmds opts in \
'(remove|build|install|uninstall|match|status|mk(^kmp))' 'k' \
'(add|remove)' '-rpm_safe_upgrade' \
'mk(driverdisk|kmp)' '-spec' \
'mk(deb|dsc|bmdeb|rpm)' '-legacy-postinst' \
'mk(tarball|rpm|deb|dsc)' '-(source|binary)-only' \
'(match|build|mkkmp)' '(k|-no-(prepare|clean)-kernel|-kernelsourcedir)' \
'(|un)install' '-no-(depmod|initrd)' \
'mkdriverdisk' '([dr]|-distro|-release|-size|-media)' \
'(add|build|install|ldtarball)' '-force' \
'match' '-templatekernel' \
'*tarball' '-archive' \
'(match|build|mkkmp)' '(j*|-no-(prepare|clean)-kernel|-kernelsourcedir)' \
'(remove|build|install|status|mk(^kmp))' '-all' \
'build' '-config'
do
[[ -n ${(M)words:#-${~opts}*} ]] &&
subcmds=( ${(M)subcmds:#${~cmds}:*} )
done
args+=( '(1 -)'{-V,--version}'[display version information]' )
ign='!' # hide some uncommon options but handle their arguments
fi
case $cmd in
remove|build|install|uninstall|mk*|status)
args+=( ': :->modules' )
;|
|remove|(un|)build|install|uninstall|match|status|mk(^kmp))
args+=( '(--all)*-k[specify kernel version]:kernel:->kernels' )
;|
|add|remove) args+=( "${ign}--rpm_safe_upgrade" ) ;|
|mk(driverdisk|kmp))
args+=( "${ign}--spec=:spec file:_files -g '*.spec(-.)'" )
;|
|(mk|ld)tarball)
args+=( "${ign}--archive=:tarball:_files -g '*.tar(-.)'" )
;|
|mk(deb|dsc|bmdeb|rpm))
args+=( "${ign}--legacy-postinst=:value [1]:(0 1)" )
;|
|mk(tarball|rpm|deb|dsc)) args+=( "${ign}(--source-only --binaries-only)--"{source,binaries}-only ) ;|
|match|build|mkkmp)
args+=( #TODO: check ignore needed in absence of parameters
"${ign}--no-prepare-kernel"
"${ign}--no-clean-kernel"
'--kernelsourcedir=:directory:_directories'
"${ign}-j+[specify maximum number of jobs to use when building]:jobs"
)
;|
|(|un)install)
args+=(
"${ign}--no-depmod"
"${ign}--no-initrd"
)
;|
|add)
args+=(
'-c[specify location of dkms.conf file]:location:_files'
)
;|
|remove|(un|)build|install|status|mk(^kmp))
args+=( '(-a --arch -k)--all[specify all relevant kernels/arches]' )
;|
|build)
args+=( "${ign}--config=:kernel config file:_files" )
;|
|add|build|install|ldtarball)
args+=( '--force[force overwriting of extant files]' )
;|
|match)
args+=( "${ign}--templatekernel=:kernel:->kernels" )
;|
|mkdriverdisk)
args+=(
"${ign}(-d --distro)"{-d,--distro=}':distribution:(redhat'{,1,2,3}' suse unitedlinux)'
"${ign}(-r --release)"{-r,--release=}':release'
"${ign}--size=:size (kb) [1440]"
"${ign}--media=:media type [floppy]:(floppy iso tar)"
)
;|
add)
args+=(
'3:path:_directories'
'4:tarball:_files -g "*.tar(-.)"'
)
;;
install)
args+=(
'3:rpm file:_files -g "*.rpm(-.)"'
)
;;
esac
_arguments -C $args && ret=0
case $state in
modules)
dirs=( ${(e)opt_args[--dkmstree]:-/var/lib/dkms}/*/*(/) )
dirs=( ${${(M)dirs%/*/*}#/} )
_description modules expl module
_multi_parts -i "$expl[@]" / dirs && ret=0
;;
kernels)
if compset -P 1 '*/'; then
_description architectures expl architecture
compadd "$expl[@]" /lib/modules/$IPREFIX/build/arch/*(/:t) && ret=0
else
compset -S '/*'
dirs=( /lib/modules/*(/:t) )
_description -V kernels expl kernel
compadd "$expl[@]" -r "/ \t\n\-" ${(on)dirs} && ret=0
fi
;;
architectures)
_description architectures expl architecture
compadd "$expl[@]" /lib/modules/$(uname -r)/build/arch/*(/:t) && ret=0
;;
esac
return ret
|