curl-8.2.1 on CentOS 5.8
- 홈페이지 : https://curl.se/
1. 준비작업
1.1. 다운로드
https://curl.se/download.html 에서 다운로드 한다.
CentOS 5.8 에서 직접 다운로드 할 수 없고, 다른 장비에서 다운로드 한 파일을 sftp 따위로 올려야 한다.
curl -O -L https://curl.se/download/curl-8.2.1.tar.gz
다만, 필자가 작성한 다른 글에 따라 wget 을 설치했다면, 다음과 같이 할 수도 있다.
/opt/wget-1.21.4/bin/wget \ --no-check-certificate \ https://curl.se/download/curl-8.2.1.tar.gz
1.2. make, gcc 설치
yum install make gcc -y
1.3. gnutls-3.7.10 혹은 openssl-1.1.1u (혹은 openssl-3.0.9 이나 openssl-3.1.1) 설치
openssl 혹은 gnutls 중 1개가 있으면 된다.
gnutls 는 다른 것들과 함께 설치되어야 한다.
- gmp-6.3.0
- nettle-3.6
- p11-kit-0.25.0 : 선택
- libffi-3.4.4 : p11-kit-0.25.0 가 의존
- libtasn1-4.19.0 : 선택, p11-kit-0.25.0 가 의존
gnutls-3.7.10 혹은 openssl-1.1.1u (혹은 openssl-3.0.9 이나 openssl-3.1.1) 설치에 대해서는 필자가 작성한 다른 글을 참조한다.
1.3. libssh-0.10.5 혹은 libssh2-1.11.0 설치
libssh-0.10.5 혹은 libssh2-1.11.0 는 선택사항이다. sftp 를 사용할 필요가 없다면, 생략해도 된다.
대부분의 2개 중에 1개만 설치해도 되고, 둘의 차이는 https://libssh2.org/libssh2-vs-libssh.html 를 참고한다.
1.3.1. libssh-0.10.5 설치
libssh-0.10.5 는 다음의 것들과 함께 설치되어야 한다.
- openssl-1.1.1u 혹은 libgcrypt-1.8.10( + libgpg-error-1.47)
- cmake-3.9.6
설치방법은 필자가 작성한 다른 글을 참조한다.
1.3.2. libssh2-1.11.0 설치
libssh2-1.11.0 는 다음의 것들과 함께 설치되어야 한다.
- openssl-1.1.1u 혹은 libgcrypt-1.8.10( + libgpg-error-1.47)
설치방법은 필자가 작성한 다른 글을 참조한다.
2. 컴파일 및 설치
설치 디렉토리(--prefix
) 는 알아서 변경한다.
대부분의 Linux 배포판들은 /usr 이 설치 디렉토리(
--prefix
)이지만, 컴파일해서 설치하는 것들은 /usr/local 이나 /opt 아래에 두는 경우가 많다.
2.1. gnutls-3.7.10 과 함께 설치
gnutls-3.7.10 와 libssh-0.10.5 와 함께 설치하는 방법은 다음과 같다.
$ mkdir -p logs/curl-8.2.1 $ tar xvfz curl-8.2.1.tar.gz > logs/curl-8.2.1/tar.`date +%Y%m%d.%H%M%S`.log 2>&1 $ cd curl-8.2.1 $ LDFLAGS="-L/opt/nettle-3.6/lib64" \ CFLAGS="-I/opt/nettle-3.6/include" \ LD_LIBRARY_PATH=/opt/nettle-3.6/lib64 \ ./configure \ --with-gnutls=/opt/gnutls-3.7.10 \ --with-libssh=/opt/libssh-0.10.5 \ --with-libssh2=/opt/libssh2-1.11.0 \ --prefix=/opt/curl-8.2.1 > ../logs/curl-8.2.1/config.`date +%Y%m%d.%H%M%S`.log 2>&1 $ LD_LIBRARY_PATH=/opt/nettle-3.6/lib64 make > ../logs/curl-8.2.1/make.`date +%Y%m%d.%H%M%S`.log 2>&1 $ make install > ../logs/curl-8.2.1/install.`date +%Y%m%d.%H%M%S`.log 2>&1
libssh-0.10.5 및 libssh2-1.11.0 를 제외하고 gnutls-3.7.10 와 함께 설치하는 방법은 다음과 같다.
$ LDFLAGS="-L/opt/nettle-3.6/lib64" \ CFLAGS="-I/opt/nettle-3.6/include" \ LD_LIBRARY_PATH=/opt/nettle-3.6/lib64 \ ./configure \ --with-gnutls=/opt/gnutls-3.7.10 \ --prefix=/opt/curl-8.2.1 > ../logs/curl-8.2.1/config.`date +%Y%m%d.%H%M%S`.log 2>&1
2.2. openssl-1.1.1u 과 함께 설치
openssl-1.1.1u 와 libssh-0.10.5 와 함께 설치하는 방법은 다음과 같다.
./configure \ --with-openssl=/opt/openssl-1.1.1u \ --with-libssh=/opt/libssh-0.10.5 \ --with-libssh2=/opt/libssh2-1.11.0 \ --prefix=/opt/curl-8.2.1 > ../logs/curl-8.2.1/config.`date +%Y%m%d.%H%M%S`.log 2>&1
libssh-0.10.5 및 libssh2-1.11.0 를 제외하고 openssl-1.1.1u 와 함께 설치하는 방법은 다음과 같다.
./configure \ --with-openssl=/opt/openssl-1.1.1u \ --prefix=/opt/curl-8.2.1 > ../logs/curl-8.2.1/config.`date +%Y%m%d.%H%M%S`.log 2>&1
3. 적용
3.1. 현재 환경에 적용
현재 환경에서는 다음과 같이 적용한다.
$ export PATH=/opt/curl-8.2.1/bin:${PATH}
gnutls 와 함께 컴파일 했다면, LD_LIBRARY_PATH 환경변수에 nettle-3.6 이 있어야 한다.
$ export LD_LIBRARY_PATH=/opt/nettle-3.6/lib64:${LD_LIBRARY_PATH}
curl 이 다른 응용프로그램의 라이브러리로 이용되고 있을 때는 다음도 추가한다.
$ export LD_LIBRARY_PATH=/opt/curl-8.2.1/lib:${LD_LIBRARY_PATH}
pkg-config 를 사용하는 경우 다음의 내용도 추가할 수 있다.
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/curl-8.2.1/lib/pkgconfig
다음과 같이 ACLOCAL_PATH 를 추가할 수도 있다.
export ACLOCAL_PATH=/opt/curl-8.2.1/share/aclocal:${ACLOCAL_PATH}
3.2. 현재 로그인한 사용자에게 적용
현재 로그인한 사용자에게 적용하려면, ".bash_profile" 파일의 끝에 위의 내용을 추가한다.
3.3. 시스템 전체에 적용
3.3.1. 환경변수 변경
"/etc/bashrc" 파일의 끝에 위의 내용을 추가한다.
4. 문제해결
4.1. libnettle.so.8 을 찾을 수 없다는 에러
다음과 같이 TLS 가 없다는 에러메시지가 출력된다.
checking for gnutls_x509_crt_get_dn2 in -lgnutls... no configure: error: TLS not detected, you will not be able to use HTTPS, FTPS, NTLM and more. Use --with-openssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-amissl, --with-bearssl or --with-rustls to address this.
(원인이 무엇이든) TLS 관련 테스트 코드를 컴파일 할 수 없다면, 위와 같은 메시지가 출력된다.
config.log 에 상세한 로그가 있다.
configure:27504: gcc -std=gnu99 -o conftest -Werror-implicit-function-declaration -O2 -Wno-system-headers -I/opt/gnutls-3.7.10/include -L/opt/gnutls-3.7.10/lib conftest.c -lgnutls -lgnutls -lz -lrt >&5 /usr/bin/ld: warning: libnettle.so.8, needed by /opt/gnutls-3.7.10/lib/libgnutls.so, not found (try using -rpath or -rpath-link) /usr/bin/ld: warning: libhogweed.so.6, needed by /opt/gnutls-3.7.10/lib/libgnutls.so, not found (try using -rpath or -rpath-link)
LD_LIBRARY_PATH=/opt/nettle-3.6/lib64
가 생략되었거나, 경로에 파일이 없다.
4.2. -lnettle 을 찾을 수 없다는 에러
다음과 같은 에러메시지가 출력된다.
configure: error: one or more libs available at link-time are not available run-time. Libs used at link-time: -lssh2 -lnettle -lgnutls -lz -lrt
config.log 에 상세한 에러 로그가 있다.
configure:34754: sh ./run-compiler -o conftest -Werror-implicit-function-declaration -O2 -Wno-system-headers -I/opt/gnutls-3.7.10/include -I/opt/libssh2-1.11.0/include -L/opt/gnutls-3.7.10/lib -L/opt/libssh2-1.11.0/lib conftest.c -lssh2 -lnettle -lgnutls -lz -lrt >&5 /usr/bin/ld: cannot find -lnettle
LDFLAGS="-L/opt/nettle-3.6/lib64"
가 생략되었거나, 경로에 파일이 없다.
4.3. nettle/des.h 을 찾을 수 없다는 에러
curl_ntlm_core.c:97:26: error: nettle/des.h: No such file or directory
CFLAGS="-I/opt/nettle-3.6/include"
가 생략되었거나, 경로에 파일이 없다.
4.4. libnettle.so.8 을 찾을 수 없다는 에러
make 할 때 발생한다.
/usr/bin/ld: warning: libnettle.so.8, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link) /usr/bin/ld: warning: libhogweed.so.6, needed by /opt/gnutls-3.7.10/lib/libgnutls.so.30, not found (try using -rpath or -rpath-link) ../lib/.libs/libcurl.so: undefined reference to `nettle_sha256_init@NETTLE_8'
make 앞에 LD_LIBRARY_PATH 환경변수를 확인한다.
4.5. libnettle.so.8 을 찾을 수 없다는 에러
gnutls 와 함께 컴파일 했다면, 설치를 완료하고 실행할 때도 LD_LIBRARY_PATH 환경변수에 nettle-3.6 이 있어야 한다.
curl: error while loading shared libraries: libnettle.so.8: cannot open shared object file: No such file or directory
다음과 같이 추가한다.
$ export LD_LIBRARY_PATH=/opt/nettle-3.6/lib64:${LD_LIBRARY_PATH}