2021년 6월 10일 목요일

홈디렉토리에 deb 설치하기

2022.10.11 추가
참고로 아래의 경우는 conda 를 사용하면 더 쉽게 해결된다.
miniforge 를 설치하고 가상 환경을 만들어 같은 기능을 하는 패키지를 설치한다.


$ python app.py
. . .
OSError: sndfile library not found

$ pip install sndfile
. . .
fatal error: sndfile.h: No such file or directory


위와 같이 sndfile 패키지가 없어 설치하려니 헤더파일이 없어 빌드가 안된다.
이 서버의 계정은 일반 사용자라 패키지 설치도 마음대로 할 수 없다.

패키지를 홈디렉토리에 설치하여 사용하려는데 ubuntu 에서는 이 기능을 지원하지 않는다고 한다.

검색 끝에 찾은 것이 https://serverfault.com/a/818025 방법이다.
이 스크립트는 패키지 파일을 풀어서 지정한 경로를 루트로 하여 파일을 복사한다.

% 두 군데 수정했다.
 file="${PREFIX}${f}"  => file="${PREFIX}/${f}"
vim ...  => sed 's#/usr#'$PREFIX'/usr#' "$file"

설치할 패키지는 https://pkgs.org/ 에서 검색한다.

먼저 필터 설정
Filter > Distros 클릭 > 다음과 같이 설정한다. (환경에 맞춰 선택) 
Distributions: Ubuntu 20.04 LTS (Focal Fossa)
Repository Architectures: Intel 64-bit
Repository Types: Official

sndfile.h 를 검색하니 다음과 같이 나왔다
libsndfile1-dev_1.0.28-7_amd64.deb

$ apt download libsndfile1-dev
$ install.sh libsndfile1-dev_1.0.28-7_amd64.deb
$ pip install sndfile
fatal error: sndfile.h: No such file or directory

파일은 설치 되었는데 여전히 에러가 난다. 
https://stackoverflow.com/a/28981343 과 같이 pip 에게 헤더의 경로를 알려줘야 한다.
$ export PKG_CONFIG_PATH=~/.local/user/lib/x86_64-linux-gnu/pkgconfig
$ pip install --global-option=build_ext --global-option="$(pkg-config --cflags-only-I sndfile)" sndfile
ld: cannot find -lsndfile

헤더파일은 해결되었고 이번엔 라이브러리의 경로를 추가한다.
$ pip install --global-option=build_ext --global-option="$(pkg-config --cflags-only-I sndfile)" --global-option="$(pkg-config --libs-only-L sndfile)" sndfile
ld: final link failed: bad value

라이브러리 경로를 확인해봐야 한다.
$ pkg-config --libs-only-L sndfile
$ ls -l ~/.local/usr/lib/x86_64-linux-gnu
libsndfile.so -> libsndfile.so.1.0.28

실제 파일이 없다. 실제 라이브러리가 있는 패키지를 받아 설치한다.
$ apt download libsndfile1
$ install.sh libsndfile1_1.0.28-7_amd64.deb
$ pip install --global-option=build_ext --global-option="$(pkg-config --cflags-only-I sndfile)" --global-option="$(pkg-config --libs-only-L sndfile)" sndfile

설치 되었다.
다시 실행시켜 본다.
$ python app.py
. . .
OSError: sndfile library not found

똑같다. 실행할 때도 라이브러리 경로를 줘야할 것 같다.
$ LD_LIBRARY_PATH=~/.local/usr/lib/x86_64-linux-gnu python app.py
OSError: cannot load library 'libsndfile.so.1': libFLAC.so.8: cannot open shared object file: No such file or directory

스크립트가 있던 페이지에도 써 있듯이 의존관계는 알아서 해결해야한다...
libflac8 와 libvorbisenc2 를 추가로 설치하고 동작했다.
LD_LIBRARY_PATH 는 .bashrc 에 추가해둔다.


참고:
- https://serverfault.com/a/818025
- https://stackoverflow.com/a/28981343
- https://pkgs.org/