diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | README | 8 | ||||
-rw-r--r-- | libs/default.eclectic.in | 1 | ||||
-rw-r--r-- | libs/output.bash.in | 10 | ||||
-rw-r--r-- | man/blas.eclectic.5 | 47 | ||||
-rw-r--r-- | man/eclectic.1 | 2 | ||||
-rw-r--r-- | man/lapack.eclectic.5 | 83 | ||||
-rw-r--r-- | man/profile-symlink.eclectic.5 | 40 | ||||
-rw-r--r-- | modules/Makefile.am | 5 | ||||
-rw-r--r-- | modules/blas.eclectic | 52 | ||||
-rw-r--r-- | modules/lapack.eclectic | 226 |
11 files changed, 446 insertions, 38 deletions
@@ -1,5 +1,15 @@ ChangeLog for eclectic +2005-05-07 Danny van Dyk <kugelfang@gentoo.org> + + * libs/output.bash.in: Added funciton 'space'. + * libs/default.eclectic.in: Fixed do_usage to filter 'action'. + * man/blas.eclectic: Added missing Section 'ACTION: SET'. + * man/lapack.eclectic: Added a manpage for the lapack module. + * man/profile-symlink.eclectic: Addeda manpage for profile-symlink. + * modules/blas.eclectic: Finalized this module. + * modules/lapack.eclectic: Added lapack module. + 2005-04-25 Tom Martin <slarti@gentoo.org> * modules/mailer-symlink.eclectic: Added mailwrapper symlink module. @@ -10,11 +10,15 @@ Ciaran McCreesh <ciaranm@gentoo.org> Libraries: core, output Danny van Dyk <kugelfang@gentoo.org> - Modules: blas + Manpages + Modules: blas, lapack Libraries: config, multilib Aaron Walker <ka0ttic@gentoo.org> - Modules: bashcomp + Modules: bashcomp, profile-symlink + +Tom Martin <slarti@gentoo.org> + Modules: mailer-symlink Copyright --------- diff --git a/libs/default.eclectic.in b/libs/default.eclectic.in index 30a61af..80bf3e3 100644 --- a/libs/default.eclectic.in +++ b/libs/default.eclectic.in @@ -42,6 +42,7 @@ do_usage() { # FIXME: can we do this using expansion somehow? for action in $(set | \ sed -n -e '/^do_\S\+ ()\s*$/s/^do_\(\S\+\).*/\1/p' | \ + grep -v 'action' | \ sort ) ; do case "${action}" in help|usage|version) diff --git a/libs/output.bash.in b/libs/output.bash.in index e2755a4..7879408 100644 --- a/libs/output.bash.in +++ b/libs/output.bash.in @@ -63,4 +63,14 @@ write_numbered_list() { done } +# space PUBLIC +# Write $1 numbers of spaces +space() { + local n=${1} + while [[ ${n} -gt 0 ]] ; do + echo -ne " " + n=$(( ${n} - 1)) + done +} + # vim: set sw=4 et sts=4 tw=80 : diff --git a/man/blas.eclectic.5 b/man/blas.eclectic.5 index ac7f174..052354d 100644 --- a/man/blas.eclectic.5 +++ b/man/blas.eclectic.5 @@ -2,13 +2,15 @@ .SH "NAME" blas.eclectic \- The BLAS management module for Gentoo's eclectic .SH "SYNOPSIS" -\fBeclectic blas\fR [\fIhelp\fR|\fIusage\fR] +\fBeclectic blas\fR [\fBhelp\fR|\fBusage\fR] .br -\fBeclectic blas\fR \fIlist\fR [\fIoptions\fR] +\fBeclectic blas\fR \fBlist\fR [\fIoptions\fR] .br -\fBeclectic blas\fR \fIshow\fR [\fIoptions\fR] +\fBeclectic blas\fR \fBset\fR \fIimplementation\fR [\fIoptions\fR] .br -\fBeclectic blas\fR \fIupdate\fR +\fBeclectic blas\fR \fBshow\fR [\fIoptions\fR] +.br +\fBeclectic blas\fR \fBupdate\fR .SH "DESCRIPTION" \fBeclectic\fR is Gentoo's configuration and management tool. It features modules that care for the individual administrative tasks. @@ -25,16 +27,16 @@ phi / # eclectic blas list \-\-\- Installed in /usr/lib \-\-\- .br C/C++ profiles - [1] ACML (sci\-libs/ACML) - [2] ATLAS (sci\-libs/blas\-atlas) + [1] ACML (sci\-libs/ACML) + [2] ATLAS (sci\-libs/blas\-atlas) FORTRAN 77 profiles - [1] ACML (sci\-libs/ACML) - [2] ATLAS (sci\-libs/blas\-atlas) - [3] reference (sci\-libs/blas\-reference) + [1] ACML (sci\-libs/ACML) + [2] ATLAS (sci\-libs/blas\-atlas) + [3] reference (sci\-libs/blas\-reference) -Possible \fIoptions\fR to the \fBlist\fR action are restriction to +Possible \fIoptions\fR to the \fBlist\fR action are restrictions to handle only certain profiles or ABI\-specific library directories. For example, \fBeclectic blas list lib64\fR @@ -51,11 +53,30 @@ and are located in \fB/usr/lib32\fR. Shows your system's currently active BLAS implementations. phi / # eclectic blas show -/usr/lib C Active BLAS is ACML (sci\-libs/ACML). -/usr/lib F77 Active BLAS is ACML (sci\-libs/ACML) +.br +Active BLAS implementations + /usr/lib (C) ACML (sci\-libs/ACML) + /usr/lib (F77) ACML (sci\-libs/ACML) + /usr/lib64 (C) ACML (sci\-libs/ACML) + /usr/lib64 (F77) ACML (sci\-libs/ACML) The same \fIoptions\fR that apply to the \fBlist\fR action can be used -with the \fBshow\fR action. +with the \fBshow\fR action to restrict it to given ABIs and language interfaces. +.SH "ACTION: SET" +\fBeclectic blas set\fR \fIimplementation\fR [\fIoptions\fR] +.br +Sets your system's currently active BLAS implementations to \fIimplementation\fR. +The same \fIoptions\fR that apply to the \fBlist\fR action can be used +with the \fBset\fR action to restrict it to given ABIs and language interfaces. + +phi / # eclectic blas set ACML +.br +Changing BLAS implementation to ACML in +.br + lib lib32 lib64 +.br +Affected language interfaces + C F77 .SH "ACTION: UPDATE" \fBeclectic blas update\fR .br diff --git a/man/eclectic.1 b/man/eclectic.1 index fdf2840..4abebee 100644 --- a/man/eclectic.1 +++ b/man/eclectic.1 @@ -1,6 +1,6 @@ .TH "ECLECTIC" "5" "April 2005" "Gentoo Linux" "eclectic" .SH "NAME" -eclectic \- Gentoo multipurpose configuration and managment tool +eclectic \- Gentoo's multipurpose configuration and managment tool .SH "SYNOPSIS" \fBeclectic\fR \fImodule\fR [\fIaction\fR [\fIoption(s)\fR]] .SH "DESCRIPTION" diff --git a/man/lapack.eclectic.5 b/man/lapack.eclectic.5 new file mode 100644 index 0000000..fff75b1 --- /dev/null +++ b/man/lapack.eclectic.5 @@ -0,0 +1,83 @@ +.TH "ECLECTIC" "5" "April 2005" "Gentoo Linux" "eclectic" +.SH "NAME" +lapack.eclectic \- The LAPACK management module for Gentoo's eclectic +.SH "SYNOPSIS" +\fBeclectic lapack\fR [\fBhelp\fR|\fBusage\fR] +.br +\fBeclectic lapack\fR \fBlist\fR [\fIoptions\fR] +.br +\fBeclectic lapack\fR \fBset\fR \fIimplementation\fR [\fIoptions\fR] +.br +\fBeclectic lapack\fR \fBshow\fR [\fIoptions\fR] +.br +\fBeclectic lapack\fR \fBupdate\fR +.SH "DESCRIPTION" +\fBeclectic\fR is Gentoo's configuration and management tool. It features +modules that care for the individual administrative tasks. +.SH "ACTION: LIST" +\fBeclectic lapack list\fR [\fIoptions\fR] +.br +Displays an orderd list of installed LAPACK implementations. It distinguishes between versions with different +Application Binary Interfaces (e.g. x86/AMD64). Further it distinguishes +between interfaces to highlevel programming languages. Each line holds +a number, the implementation's name and the providing package's name. + +phi / # eclectic lapack list +.br +\-\-\- Installed in /usr/lib \-\-\- +.br +FORTRAN 77 profiles + [1] ACML (sci\-libs/ACML) + [2] ATLAS (sci\-libs/lapack\-atlas) + [3] reference (sci\-libs/lapack\-reference) + + +Possible \fIoptions\fR to the \fBlist\fR action are restrictions to +handle only certain profiles or ABI\-specific library directories. For example, + +\fBeclectic lapack list lib64\fR + +lists only LAPACK implementations found in \fB/usr/lib64\fR while + +\fBeclectic lapack list lib32 F77\fR + +lists only LAPACK implementations that provide a FORTRAN 77 interface +and are located in \fB/usr/lib32\fR. +.SH "ACTION: SHOW" +\fBeclectic lapack show\fR [\fIoptions\fR] +.br +Shows your system's currently active LAPACK implementations. + +phi / # eclectic lapack show +.br +Active LAPACK implementations + /usr/lib (F77) ACML (sci\-libs/ACML) + /usr/lib64 (F77) ACML (sci\-libs/ACML) + +The same \fIoptions\fR that apply to the \fBlist\fR action can be used +with the \fBshow\fR action to restrict it to given ABIs and language interfaces. +.SH "ACTION: SET" +\fBeclectic lapack set\fR \fIimplementation\fR [\fIoptions\fR] +.br +Sets your system's currently active LAPACK implementations to \fIimplementation\fR. +The same \fIoptions\fR that apply to the \fBlist\fR action can be used +with the \fBset\fR action to restrict it to given ABIs and language interfaces. + +phi / # eclectic lapack set ACML +.br +Changing LAPACK implementation to ACML in +.br + lib lib32 lib64 +.br +Affected language interfaces + F77 +.SH "ACTION: UPDATE" +\fBeclectic lapack update\fR +.br +Browses your system for installed LAPACK implementations +and save the data for further actions. During this process it automatically +detects the currently active LAPACK implementation which will be memorized as well. +.SH "AUTHOR" +Danny van Dyk <kugelfang@gentoo.org> +.SH "REVISION" +$Id$ diff --git a/man/profile-symlink.eclectic.5 b/man/profile-symlink.eclectic.5 new file mode 100644 index 0000000..bafc5fe --- /dev/null +++ b/man/profile-symlink.eclectic.5 @@ -0,0 +1,40 @@ +.TH "ECLECTIC" "5" "April 2005" "Gentoo Linux" "eclectic" +.SH "NAME" +profile\-symlink.eclectic \- The profile management module for Gentoo's eclectic +.SH "SYNOPSIS" +\fBeclectic profile\-symlink\fR [\fBhelp\fR|\fBusage\fR] +.br +\fBeclectic profile\-symlink\fR \fBlist\fR +.br +\fBeclectic profile\-symlink\fR \fBset\fR \fIprofile\fR +.br +\fBeclectic profile\-symlink\fR \fBshow\fR + +.SH "DESCRIPTION" +\fBeclectic\fR is Gentoo's configuration and management tool. It features +modules that care for the individual administrative tasks. +.SH "ACTION: LIST" +\fBeclectic profile\-symlink list\fR +.br +Displays an orderd list of available and (for your architecture) valid profiles. + +phi / # eclectic profile\-symlink list +.br +Available profile symlink targets: + [1] default\-linux/amd64/2005.0 +.SH "ACTION: SET" +\fBeclectic profile\-symlink setup\fR [.fi profile\fR] +.br +Select a valid \fIprofile\fR for future use with portage. +.SH "ACTION: SHOW" +\fBeclectic profile\-symlink show\fR +.br +Shows your system's currently active BLAS implementations. + +phi / # eclectic profile\-symlink show +Current make.profile symlink: + /usr/portage/profiles/default\-linux/amd64/2005.0 +.SH "AUTHOR" +Danny van Dyk <kugelfang@gentoo.org> +.SH "REVISION" +$Id$ diff --git a/modules/Makefile.am b/modules/Makefile.am index 96033df..fcb9952 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -2,9 +2,10 @@ noinst_SCRIPTS = bashcomp.eclectic \ blas.eclectic \ cow.eclectic \ kernel-symlink.eclectic \ + lapack.eclectic \ + mailer-symlink.eclectic \ profile-symlink.eclectic \ - vi-symlink.eclectic \ - mailer-symlink.eclectic + vi-symlink.eclectic EXTRA_DIST = $(noinst_SCRIPTS) diff --git a/modules/blas.eclectic b/modules/blas.eclectic index 2838188..0b18b6c 100644 --- a/modules/blas.eclectic +++ b/modules/blas.eclectic @@ -127,30 +127,36 @@ describe_list() { } do_list() { - local libdirs libdir + local libdirs libdir n [[ -z "$@" ]] \ && libdirs="$(list_libdirs)" \ || libdirs="$@" for libdir in ${libdirs} ; do - C_PROFILES=() - for x in $(load_config blas C_${libdir}) ; do - C_PROFILES=("${C_PROFILES[@]}" "${x}\t($(package ${x}))") - done - F77_PROFILES=() - for x in $(load_config blas F77_${libdir}) ; do - F77_PROFILES=("${F77_PROFILES[@]}" "${x}\t($(package ${x}))") - done + C_PROFILES=$(load_config blas C_${libdir}) + F77_PROFILES=$(load_config blas F77_${libdir}) if [[ -n ${C_PROFILES} ]] || [[ -n ${F77_PROFILES} ]] ; then echo "--- Installed in ${ROOT}/usr/${libdir} ---" if [[ -n ${C_PROFILES} ]] ; then write_list_start "C/C++ profiles" - write_numbered_list ${C_PROFILES[@]} + n=1 + for x in ${C_PROFILES} ; do + write_numbered_list_entry \ + $n \ + "${x}$(space $((12 - ${#x})))($(package ${x}))" + n=$(( n + 1)) + done echo fi if [[ -n ${F77_PROFILES} ]] ; then write_list_start "FORTRAN 77 profiles" - write_numbered_list ${F77_PROFILES[@]} + n=1 + for x in ${F77_PROFILES} ; do + write_numbered_list_entry \ + $n \ + "${x}$(space $((12 - ${#x})))($(package ${x}))" + n=$(( n + 1)) + done echo fi fi @@ -159,11 +165,11 @@ do_list() { ### select action ### -describe_setup() { +describe_set() { echo "Setup one of the installed BLAS implementations as the active implementation." } -do_setup() { +do_set() { local libdirs=$(list_libdirs) profiles=${BLAS_PROFILES} impl libdir prof [[ ${#1} == 0 ]] && die -q "Please specify the implementation to setup as active." impl=${1} @@ -185,8 +191,10 @@ do_setup() { [[ -n ${mylibdirs[@]} ]] && libdirs=${mylibdirs[@]} [[ -n ${myprofiles[@]} ]] && profiles=${myprofiles[@]} - echo "libdirs: ${libdirs}" - echo "profiles: ${profiles}" + write_list_start "Changing BLAS implementation to ${impl} in" + echo " ${libdirs}" + write_list_start "Affected language interfaces" + echo " ${profiles}" for libdir in ${libdirs} ; do for prof in ${profiles} ; do setup_${impl} ${ROOT}/usr/${libdir} ${prof} @@ -205,18 +213,22 @@ do_show() { local libdirs=$(list_libdirs) profiles=${BLAS_PROFILES} libdir lib prefix [[ -n ${1} ]] && has "libdirs" ${1} && libdirs=${1} [[ -n ${2} ]] && has "profiles" ${2} && profiles=${2} + write_list_start "Active BLAS implementations" for libdir in ${libdirs} ; do [[ ${#libdirs} -eq 1 ]] || prefix="${ROOT}/usr/${libdir}" for prof in ${profiles} ; do - [[ ${#profiles} -eq 1 ]] || myprefix="${prefix}\t${prof}" [[ ${prof} == C ]] && lib=libcblas.so [[ ${prof} == F77 ]] && lib=libblas.so impl=$(load_config blas "${prof}_${libdir}_CURRENT") - [[ -z ${impl} ]] && die -q "Configuration file is broken. Please run update." - if is_active_${impl} ${ROOT}/usr/${libdir}/${lib} ; then - echo -e "${myprefix}\tActive BLAS is ${impl} ($(package ${impl}))." + if [[ -z ${impl} ]] ; then + [[ -n $(load_config lapack "${prof}_${libdir}") ]] \ + && die -q "Configuration file is broken. Please run update." else - die -q "Configuration file is out of date. Please run update." + if is_active_${impl} ${ROOT}/usr/${libdir}/${lib} ; then + write_kv_list_entry "${prefix} (${prof})" "${impl} ($(package ${impl}))" + else + die -q "Configuration file is out of date. Please run update." + fi fi done done diff --git a/modules/lapack.eclectic b/modules/lapack.eclectic new file mode 100644 index 0000000..398e996 --- /dev/null +++ b/modules/lapack.eclectic @@ -0,0 +1,226 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +DESCRIPTION="Manage installed LAPACK implementations. (virtual/lapack)" +VERSION="1.0" +MAINTAINER="Danny van Dyk <kugelfang@gentoo.org>" + +LAPACK_IMPLEMENTATIONS="ACML ATLAS reference" +LAPACK_PROFILES="F77" + +# check_* $libdir +# implementation specific check functions +check_ACML() { + # libacml.so provides FORTRAN 77 support + [[ -f ${1}/libacml.so ]] && echo "F77" +} + +check_ATLAS() { + [[ -d ${1}/lapack/atlas ]] || return + [[ -f ${1}/lapack/atlas/liblapack.so ]] && echo "F77" +} + +check_reference() { + [[ -d ${1}/lapack/reference ]] || return + [[ -f ${1}/lapack/reference/liblapack.so ]] && echo "F77" +} + +# package $impl +# Prints the name of the package providing $impl +package() { + case ${1} in + ACML) echo "sci-libs/ACML";; + ATLAS) echo "sci-libs/lapack-atlas";; + MKL) echo "sci-libs/mkl";; + reference) echo "sci-libs/lapack-reference";; + *) ;; + esac +} + +# is_active_* $lib +# return 0 if $lib points to an active LAPACK implementation of profile * +is_active_ACML() { + [[ -L ${1} ]] || return 1 + local lib=$(/bin/readlink -sn ${1}) + [[ $(basename ${lib}) == libacml.so ]] \ + && return 0 + return 1 +} + +is_active_ATLAS() { + [[ -L ${1} ]] || return 1 + local lib=$(/bin/readlink -sn ${1}) + local dir=${lib%/*} + [[ ${dir##*/} == atlas ]] \ + && return 0 + return 1 +} + +is_active_reference() { + [[ -L ${1} ]] || return 1 + local lib=$(/bin/readlink -sn ${1}) + local dir=${lib%/*} + [[ ${dir##*/} == reference ]] \ + && return 0 + return 1 +} + +# setup_* $libdir $profile +# Implementation specific activation/setup functions +setup_ACML() { + if [[ ${2} == F77 ]] ; then + ln -sf ${1}/libacml.so ${1}/liblapack.so + ln -sf ${1}/libacml.so ${1}/liblapack.so.0 + ln -sf ${1}/libacml.a ${1}/liblapack.a + else + die "Illegal profile: ${2}" + fi +} + +setup_ATLAS() { + if [[ ${2} == F77 ]] ; then + ln -sf ${1}/atlas/liblapack.so ${1}/liblapack.so + ln -sf ${1}/atlas/liblapack.so ${1}/liblapack.so.0 + ln -sf ${1}/atlas/liblapack.a ${1}/liblapack.a + else + die "Illegal profile: ${2}" + fi +} + +setup_reference() { + if [[ ${2} == F77 ]] ; then + ln -sf ${1}/reference/liblapack.so ${1}/liblapack.so + ln -sf ${1}/reference/liblapack.so ${1}/liblapack.so.0 + ln -sf ${1}/reference/liblapack.a ${1}/liblapack.a + else + die "Illegal profile: ${2}" + fi +} + +### list action ### + +describe_list() { + echo "List all installed LAPACK implementations." +} + +do_list() { + local libdirs libdir n + [[ -z "$@" ]] \ + && libdirs="$(list_libdirs)" \ + || libdirs="$@" + + for libdir in ${libdirs} ; do + F77_PROFILES=$(load_config lapack F77_${libdir}) + if [[ -n ${F77_PROFILES} ]] ; then + echo "--- Installed in ${ROOT}/usr/${libdir} ---" + write_list_start "FORTRAN 77 profiles" + n=1 + for x in ${F77_PROFILES} ; do + write_numbered_list_entry $n "${x}$(space $(( 12 - ${#x})))($(package ${x}))" + n=$(( n + 1)) + done + echo + fi + done +} + +### select action ### + +describe_set() { + echo "Setup one of the installed LAPACK implementations as the active implementation." +} + +do_set() { + local libdirs=$(list_libdirs) profiles=${LAPACK_PROFILES} impl libdir prof + [[ ${#1} == 0 ]] && die -q "Please specify the implementation to setup as active." + impl=${1} + shift + + has "LAPACK_IMPLEMENTATIONS" ${impl} \ + || die -q "Illegal implementation: ${impl}" + + for param in ${@} ; do + echo "param: ${param}" + if has "libdirs" ${param} ; then + mylibdirs=(${mylibdirs[@]} ${param}) + elif has "LAPACK_PROFILES" ${param} ; then + myprofiles=(${myprofiles[@]} ${param}) + else + die -q "Illegal parameter: ${param}." + fi + done + [[ -n ${mylibdirs[@]} ]] && libdirs=${mylibdirs[@]} + [[ -n ${myprofiles[@]} ]] && profiles=${myprofiles[@]} + + write_list_start "Changing LAPACK implementations to ${impl} in" + echo " ${libdirs}" + write_list_start "Affected language interfaces" + echo " ${profiles}" + for libdir in ${libdirs} ; do + for prof in ${profiles} ; do + setup_${impl} ${ROOT}/usr/${libdir} ${prof} + store_config lapack "${prof}_${libdir}_CURRENT" ${impl} + done + done +} + +### show action ### + +describe_show() { + echo "Show the currently active LAPACK implementations." +} + +do_show() { + local libdirs=$(list_libdirs) profiles=${LAPACK_PROFILES} libdir lib prefix + [[ -n ${1} ]] && has "libdirs" ${1} && libdirs=${1} + [[ -n ${2} ]] && has "profiles" ${1} && profiles=${1} + write_list_start "Active LAPACK implementations" + for libdir in ${libdirs} ; do + [[ ${#libdirs} -eq 1 ]] || prefix="${ROOT}/usr/${libdir}" + for prof in ${profiles} ; do + [[ ${#profiles} -eq 1 ]] || prefix="${prefix}:${prof}" + [[ ${prof} == F77 ]] && lib=liblapack.so + impl=$(load_config lapack "${prof}_${libdir}_CURRENT") + if [[ -z ${impl} ]] ; then + [[ -n $(load_config lapack "${prof}_${libdir}") ]] \ + && die -q "Configuration file is broken. Please run update." + else + if is_active_${impl} ${ROOT}/usr/${libdir}/${lib} ; then + write_kv_list_entry "${prefix} (${prof})" "${impl} ($(package ${impl}))" + else + die -q "Configuration file is out of date. Please run update." + fi + fi + done + done +} + +### update action ### + +describe_update() { + echo "Update the configuration file with data about all installed LAPACK implementations." +} + +do_update() { + local lib libdir impl prof + [[ -e ${ROOT}/etc/eclectic/lapack/lapack.config ]] \ + && rm ${ROOT}/etc/eclectic/lapack/lapack.config + for libdir in $(list_libdirs) ; do + [[ -e ${ROOT}/usr/${libdir}/ ]] || continue + for impl in ${LAPACK_IMPLEMENTATIONS} ; do + for prof in $(check_${impl} ${ROOT}/usr/${libdir}/) ; do + if has "LAPACK_PROFILES" ${prof} ; then + add_config lapack "${prof}_${libdir}" ${impl} + [[ ${prof} == F77 ]] && lib=${ROOT}/usr/${libdir}/liblapack.so + is_active_${impl} ${lib} \ + && store_config lapack "${prof}_${libdir}_CURRENT" ${impl} + else + die -q "Unknown profile: \"${prof}\". Valid profiles: ${LAPACK_PROFILES}" + fi + done + done + done +} + +# vim: set ft=ebuild |