Userkent feltett libek

Fórumok

Hi!

Az lenne a kerdesem, hogy userkent tudok-e hasznalni shared libeket. Konkretan arrol lenne szo, hogy van egy program, amihez kellenek olyan libek, amik altalaban nincsenek fent egy atlagos Linux rendszeren. Es valahogy ra kellene venni a programot, hogy azokat a libeket is hasznalja, amiket nem a /lib, /usr/lib stb konyvtarba tettem, de termeszetesen root jogosultsag nelkul.

Ez megoldhato?

By(t)e
TBS::Antiemes

Hozzászólások

Most fejből sajna nem tudom megmondani, hogy melyik környezeti változóban lehet megadni (talán LD_PATH de sorry ha nagy hülyeséget írtam, most nem tudom megnézni és ritkán használom), hogy hol keresse a libeket. Ezt meg a home könyvtáradban lévő általában .bashrc (ha bash -t használsz) fájlban lehet megadni. Remélem egy kicsit tudtam segíteni!

Hi!

Koszi a valaszokat.

By(t)e
TBS::Antiemes

Ha minden user számára telepítek a disztribúcióban meg nem található csomagot, akkor kb.


# mkdir /home/installed/package-major.minor.patchlevel
# chown admin_user /home/installed/package-major.minor.patchlevel
# chmod 700 /home/installed/package-major.minor.patchlevel
# su - admin_user
$ cd ~/tmp/package-major.minor.patchlevel
$ ./configure \
  --prefix=/home/installed/package-major.minor.patchlevel \
  --enable-shared --disable-static --satöbbi \
  && make \
  && make install \
  && exit
# chown -Rc root:root /home/installed/package-major.minor.patchlevel
# chmod -Rc u=rwX,g=rX,o=rX \
  /home/installed/package-major.minor.patchlevel

Ha adott user telepít a maga számára, akkor ott nem kell root, és nyilván --prefix=$HOME/installed/package-major.minor.patchlevel.

A .so végű symlinkeket kézzel szoktam létrehozni szükség esetén (ezek nem a futáskori dinamikus betöltéshez kellenek, hanem az adott lib-re hivatkozó futtatható file linker általi létrehozásához).

Így nagyon könnyű megakadályozni, hogy a csomagok összekeveredjenek - könnyű külön-külön törölni. Használhatóvá így válnak (mind futtatás, mind fejlesztés):

A ~/.bashrc-ből:


. $HOME/bin/scripts/pathsetup

A pathsetup script (mindenki azt csinál vele, amit akar, ezennel public domain :))


# Source this. Unsets BASE. Defines function pathappend().

function pathappend()
{
  local PATHVAR="$1"
  local DIR="$2"
  local CURVAL=$(eval "echo \"\$$PATHVAR\"")
  local CURVAL_EMB=":$CURVAL:"

  if [[ "$CURVAL_EMB" != *:"$DIR":* ]] \
      && [ "/" = "${DIR:0:1}" -a -d "$DIR" -a -x "$DIR" ]; then
    if [ ! -z "$CURVAL" -a ":" != "${CURVAL:$((${#CURVAL} - 1)):1}" ]; then
      DIR=":$DIR"
    fi
    eval "export $PATHVAR=\"\$CURVAL\$DIR\""
  fi
}

pathappend PATH "$HOME/bin/scripts"
pathappend PATH "$HOME/bin/standalone"

export MANPATH=$(manpath -g -q)

for BASE in /home/installed/* "$HOME"/installed/*; do
  pathappend CPLUS_INCLUDE_PATH "$BASE"/include
  pathappend C_INCLUDE_PATH     "$BASE"/include
  pathappend INFOPATH           "$BASE"/info
  pathappend LD_LIBRARY_PATH    "$BASE"/lib
  pathappend LIBRARY_PATH       "$BASE"/lib
  pathappend MANPATH            "$BASE"/man
  pathappend PATH               "$BASE"/bin
  pathappend PATH               "$BASE"/libexec
  pathappend PATH               "$BASE"/sbin
  pathappend PKG_CONFIG_PATH    "$BASE"/lib/pkgconfig
done

unset BASE

Máshol sokkal jobban kifejtik, tömören:

gcc számára include file-ok: C_INCLUDE_PATH
g++ -||-: CPLUS_INCLUDE_PATH
info oldalak (info -f OLDAL): INFOPATH
man oldalak: MANPATH
futtatáshoz/dlopen()-hez .so.major-ök: LD_LIBRARY_PATH
futtatható létrehozásához .so-k: LIBRARY_PATH
futtatáshoz: PATH
egyéb agyrémek, pl. pkgconfig: PKG_CONFIG_PATH

Kieg.: a pathsetup be van source-olva a ~/.Xsession-be is, még a session manager / window manager elindítását megelőzően, ui. a kézzel feltett lib-ekre hivatkozhatnak olyan programok is, amiket a user nem kézzel indít el parancssorból (terminálból), hanem közvetlenül a wm-ből (benyom egy ikont). A .bashrc-t a .bash_profile source-olja (debian), ezért ssh-val vagy VT-ről bejelentkezve érvényesül a pathsetup. Amikor viszont a bash xterm alól indul, akkor a ~/.Xsession-ből (a wm-en és az xterm-en keresztül) már örökli a pathsetup hatását, és a .bashrc-ből a pathsetup már másodjára fut, de ez nem gond, mert a pathappend() csak új könyvtárakat ragaszt az adott útváltozóhoz, nincs duplázás. Egy PATHSETUP_GUARD változóval még gyors is lenne.