001ddb941e82f7e8acb1ac09b6dd3d2f11da7e7e
[gentoo.git] / app-eselect / eselect-blas / files / blas.eselect-0.2
1 # -*-eselect-*-  vim: ft=eselect
2 # Copyright 2019 Gentoo Foundation
3 # Distributed under the terms of the GNU GPL version 2 or later
4
5 inherit config tests multilib skel
6
7 MODULE="BLAS/CBLAS"
8 IFACE="blas"
9 DESCRIPTION="Manage installed alternatives of $MODULE shared objects"
10 MAINTAINER="lumin@debian.org"
11 VERSION="20190621"
12
13 ### helper utility to find all available BLAS/CBLAS implementations
14 find_targets_in() {
15         [[ $# -eq 1 ]] || die -q "in which libdir?"
16
17         local cand
18         for cand in ${EROOT}/etc/env.d/blas/$1/*; do
19                 [[ "config" = $(basename ${cand}) ]] && continue
20                 [[ -r ${cand} ]] && basename ${cand}
21         done
22 }
23
24 ### helper utility to validate a BLAS/CBLAS library directory
25 validate_blaslibdir() {
26         [[ -d $1 ]] || return 2  # dir doesn't exist
27         [[ -r "${1}/libblas.so.3" ]] && [[ -r "${1}/libblas.so" ]] \
28         && [[ -r "${1}/libcblas.so.3" ]] && [[ -r "${1}/libcblas.so" ]] \
29         || return 1
30 }
31
32 ### show action
33 do_show() {
34         # do_show -- show both lib64 and lib32 selection
35         # do_show libxx -- show libxx selection
36         local libdir cur libdirs=( $(list_libdirs) )
37
38         # if manually specified libdirs
39         if [[ ! $# -eq 0 ]]; then
40                 for libdir in $@; do
41                         has $libdir ${libdirs[@]} || die -q "invalid libdir '$libdir'!"
42                 done
43                 libdirs=( $@ )
44         fi
45
46         for libdir in ${libdirs[@]}; do
47                 [[ ! -d ${EROOT}/usr/$libdir ]] && continue
48                 [[ ! -r ${EROOT}/etc/env.d/blas/${libdir}/config ]] && continue
49                 cur=$(load_config ${EROOT}/etc/env.d/blas/${libdir}/config CURRENT)
50                 echo ${libdir}: $cur
51         done
52 }
53
54 ### list action
55 do_list() {
56         local i cur targets
57         local libdir libdirs=( $(list_libdirs) )
58
59         # if manually specified libdirs
60         if [[ ! $# -eq 0 ]]; then
61                 for libdir in $@; do
62                         has $libdir ${libdirs[@]} || die -q "invalid libdir '$libdir'!"
63                 done
64                 libdirs=( $@ )
65         fi
66         
67         for libdir in ${libdirs[@]}; do
68                 [[ ! -d ${EROOT}/usr/$libdir ]] || [[ -L ${EROOT}/usr/$libdir ]] && continue
69                 targets=( $(find_targets_in $libdir) )
70                 cur=$(load_config ${EROOT}/etc/env.d/blas/${libdir}/config CURRENT)
71
72                 write_list_start "Available BLAS/CBLAS ($libdir) candidates:"
73                 for (( i = 0; i < ${#targets[@]}; i++ )); do
74                         [[ ${targets[i]} = $cur ]] \
75                         && targets[i]=$(highlight_marker "${targets[i]}")
76                 done
77                 write_numbered_list -m "(none found)" "${targets[@]}"
78         done
79 }
80
81 ### validate action
82 describe_validate() {
83         echo "validate candidates and remove invalid ones"
84 }
85
86 do_validate() {
87         local i ldpath targets target candidate
88         local libdir libdirs=( $(list_libdirs) )
89         for libdir in ${libdirs[@]}; do
90                 [[ ! -d ${EROOT}/usr/$libdir ]] || [[ -L ${EROOT}/usr/$libdir ]] && continue
91                 targets=( $(find_targets_in $libdir) )
92                 for target in ${targets[@]}; do
93                         candidate=${EROOT}/etc/env.d/blas/${libdir}/${target}
94                         ldpath=$(load_config $candidate LDPATH)
95                         if ! validate_blaslibdir $ldpath; then
96                                 echo "Removing invalid BLAS/CBLAS candidate ($candidate) ..."
97                                 rm -v $candidate
98                         fi
99                 done
100         done
101 }
102
103 ### set action
104
105 describe_set() {
106         echo "Activate one of the installed $MODULE implementations"
107 }
108
109 describe_set_parameters() {
110         echo "[<libdir>] <implementation>"
111 }
112
113 describe_set_options() {
114         echo "libdir: lib64 or lib32. Will use the native one when omitted."
115         echo "implementation : implementation name or number (from 'list' action)"
116 }
117
118 do_set() {
119         local libdirs=( $(list_libdirs) )
120         local targets libdir ldconf libpath impl
121
122         # check argument existence
123         [[ $# -eq 1 ]] || [[ $# -eq 2 ]] || \
124                 die -q "Please specify [<libdir>] <impl> to activate!"
125         # read argumenets
126         if [[ $# -eq 2 ]]; then libdir="$1"; else libdir="$(get_libdir)"; fi
127         if [[ $# -eq 2 ]]; then impl="$2"; else impl="$1"; fi
128         # validate arguments
129         has "$libdir" "${libdirs[@]}" || die -q "Invalid libdir ($libdir) !"
130         targets=( $(find_targets_in $libdir) )
131         if ! has "$impl" "${targets[@]}"; then
132                 if [[ ${impl} -gt 0 ]] && [[ ${impl} -le ${#targets[@]} ]]; then
133                         impl=${targets[(${impl} - 1)]}
134                 else
135                         die -q "Invalid impl ($impl) !"
136                 fi
137         fi
138         # store the configuration to env.d
139         store_config ${EROOT}/etc/env.d/blas/${libdir}/config CURRENT "${impl}"
140         # generate ld.so.conf file
141         ldconf="${EROOT}/etc/ld.so.conf.d/81-blas-${libdir}.conf"
142         libpath=$(load_config ${EROOT}/etc/env.d/blas/${libdir}/${impl} LDPATH)
143         truncate -s0 $ldconf
144         echo "# Auto-generated by eselect::blas. DON'T EDIT." >> $ldconf
145         echo "$libpath" >> $ldconf
146
147         # refresh cache. env-update will call ldconfig (see
148         # portage::env_update.py) so we don't need to call it explicitly.
149         env-update
150 }
151
152 ### add action
153 describe_add_parameters() {
154         echo "<libdir> <dir> <impl>"
155 }
156
157 describe_add_options() {
158         echo "libdir : library directory where $MODULE implementation is installed (lib, lib64, etc.)"
159         echo "dir : directory containing lib{,c}blas.so{.3}"
160         echo "impl : name of the $MODULE implementation"
161 }
162
163 do_add() {
164         [[ $# -eq 3 ]] \
165                 || die -q "Please specify <libdir> <dir> <impl> to activate!"
166         validate_blaslibdir $2 || die -q "invalid blas libdir!"
167         store_config ${EROOT}/etc/env.d/blas/$1/$3 LDPATH $2
168 }