CURL 라이브러리 사용법 - 임베디드 플랫폼용으로 빌드하기(arm-cross-sysroot 활용)

반응형

    개요

    CURL 라이브러리는 URL 기반으로 데이터를 웹으로 전송하는 기능을 제공하는 라이브러리입니다. 웹으로 전송하기 위해 HTTP/TCP/IP 통신을 직접 구현할 수도 있지만, CURL 라이브러리를 사용하면 TCP/IP 소켓 제어 및 HTTP 통신을 직접 제어할 필요 없이 쉽게 수행할 수 있습니다.

    CURL 라이브러리의 공식 웹사이트는 아래와 같습니다.

     

    curl

    command line tool and library for transferring data with URLs (since 1998) Supports... DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP.

    curl.se

     

    CURL 소스패키지 다운로드

    CURLCURL 공식 웹사이트에서도 다운로드하여 사용할 수 있으나, 여기서는 arm-cross-sysroot를 이용해 빌드CURL 라이브러리를 사용합니다.

    arm-cross-sysroot은 다양한 리눅스 라이브러리(CURL 라이브러리 포함)들을 ARM기반 플랫폼에서 동작할 수 있도록 크로스컴파일 할 수 있는 기능을 제공합니다.

     

    1. 다음 명령으로 arm-cross-sysroot를 다운로드합니다.

    $ sudo apt install wget
    $ wget https://github.com/Illuminux/arm-cross-sysroot/archive/1.0.2.tar.gz
    $ tar zxf 1.0.2.tar.gz
    $ cd arm-cross-sysroot-1.0.2/

     

    2. config.cfg 파일을 작성합니다.

    arm-cross-sysroot 소스패키지 폴더 내에 config.cfg.sample 파일이 있으며, 이를 config.cfg 파일로 복사한 후 편집합니다.

    아래 내용의 밑줄 친 부분과 같이 수정합니다. arm-cross-sysroot 소스패키지의 경로 및 툴 체인 경로는 개발 환경에 맞도록 수정합니다.

    • UV_toolchain_dir은 실제 컴파일러 실행파일(gcc )이 들어 있는 bin 폴더의 상위폴더까지만 명시합니다. (: /opt/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/tq-linaro-toolchain)
    • UV_board: 본 예시에서 타겟 플랫폼은 Hard-floating 연산을 지원하므로 “hardfloat“으로 명시하였습니다.
    # The variable GV_base_dir is the directory in which the main script is located.

    GV_base_dir=/workspace/arm-cross-sysroot-1.0.2

    # Directory in which the sysroot should be installed
    UV_sysroot_dir="${GV_base_dir}/output"

    # Directory in which the downloads are to be loaded
    UV_download_dir="${GV_base_dir}/download"

    # Directory where the toolchain is located (exclude bin directory)
    UV_toolchain_dir="/usr/"

    # Target architecture
    UV_target="arm-linux-gnueabihf"

    # Target Board
    # softfloat: Default soft float boarde
    # hardfloat: Default hard float boarde
    # raspi: Raspberry PI
    # beaglebone: BeagleBone / Beglebone black
    #
    UV_board="hardfloat"

     

    3. 다음 명령을 이용하여 빌드합니다.

    참고로, 빌드하기 위해 개발머신에서 필요한 패키지는 arm-cross-sysroot 소스패키지 내의 README.md 파일에 명시되어 있으며, 개발 환경에 맞게 apt install 명령어 등을 이용하여 설치하면 됩니다.

    $ apt install gettext pkg-config libtool intltool intltool autogen autoconf automake cmake libxml2-dev curl
    $ ./sysroot --build

     

    빌드가 시작되면, 소스패키지 내 download output 폴더가 생성되며, download 폴더에는 각 라이브러리의 소스파일들이 다운로드 되고, output 폴더에는 각 라이브러리들의 빌드 결과물이 저장됩니다.

    빌드 되는 라이브러리들 중 CURL에 관련된 라이브러리들은 다음과 같습니다.

    • curl, ssl, ssh2, crypto, gcrypt, gpg-error, z

    이 라이브러리들은 어플리케이션 빌드 및 실행 시에 필요합니다.

     

    위 라이브러리 중 일부는 공유 라이브러리(.a 파일이 생성되지 않음)로 빌드 됩니다.

    위 라이브러리들을 사용하는 어플리케이션 빌드 시에는 정적 라이브러리 옵션(-static)을 사용해서는 안 됩니다.

    위 라이브러리들은 타겟 플랫폼의 라이브러리 폴더(/lib 또는 /usr/lib)에도 존재해야 해당 라이브러리를 포함한 어플리케이션이 실행될 수 있습니다.

     

     

     

    빌드 중 에러 메시지 처리

    빌드 중 특정 라이브러리의 소스패키지 파일을 다운로드할 수 없다는 에러가 발생할 수 있습니다.

    이는 해당 라이브러리 소스패키지 파일을 다운로드할 수 있는 서버에 접속할 수 없다는 의미이며, 이런 경우에는 웹 검색엔진(구글)에서 소스패키지 파일명을 검색하여 직접 다운로드해서 download 폴더 안에 복사한 후 다시 빌드 합니다.

    아래 내용은 한 예로 json-glib-0.14.2.tar.xz를 다운로드할 수 없다는 에러 메시지입니다.

    ...
    curl: (7) Failed to connect to ftp.gnome.org port 21: Connection refused
    Extract json-glib-0.14.2.tar.xz... /projects/essys_cloud/CURL/
    arm-cross-sysroot-master/download/json-glib-0.14.2.tar.xz: No such file or directory
    /projects/essys_cloud/CURL/arm-cross-sysroot-master/include/files.sh: line 97: [: 077c5a7bfabdaefba1f4472100e29add9aa910a4: unary operator expected
    faild
    json-glib: json-glib-0.14.2.tar.xz is not a valid archive!
    
    *** Error in json-glib ***

     

    아래는 직접 다운로드한 후 빌드했을 때의 메시지입니다. 빌드가 성공적으로 완료되고 다음 라이브러리 패키지의 빌드 절차로 넘어갔음을 알 수 있습니다.

    ...
    Build json-glib:
    Download json-glib-0.14.2.tar.xz... alredy loaded
    Extract json-glib-0.14.2.tar.xz... donne
    Configure json-glib... donne
    Make json-glib... donne
    Install json-glib... donne
    Build libsoup:
    Download libsoup-2.40.3.tar.xz...
    ...

     

     

     

    최신 버전의 라이브러리 소스패키지 빌드

    arm-cross-sysroot 패키지는 해당 버전의 패키지가 릴리즈 될 당시에 결정된 각 라이브러리 소스패키지의 버전으로 구성되어 있어, 각 라이브러리 별로 최신의 라이브러리 버전이 아닐 수 있습니다. 각 라이브러리에 대한 빌드 진행은 개략적으로 다음과 같이 진행됩니다.

    • include/settings.cfg 파일 내에 빌드 할 라이브러리들의 명칭이 GV_build_formulas 변수로 명시되어 있으며, 해당 라이브러리들에 대해 빌드가 진행됨
    GV_version="1.2.0"
    GV_build_date="22.04.2015"
    
    GV_host=$UV_target
    
    GV_source_dir="${GV_base_dir}/src"
    
    GV_log_dir="${GV_base_dir}/log"
    GV_log_file="${GV_log_dir}/build.log"
    
    GV_prefix="${UV_sysroot_dir}/${GV_host}"
    
    GV_src_img_name="sources.sparseimage"
    GV_src_img_size="20G"
    
    declare -a GV_version
    declare -a GV_url
    
    GV_build_formulas=(
    	"zlib"
    	"bzip2"
    	"liblzma"
    	"libffi"
    	"expat"
    	"tslib"
    	"glib"
    	"dbus"
    	"gsl"
    	"ncurses"
    	"gmp"
    	"mpfr"
    	"readline"
    	"sqlite"
    	"cryptodev"
    	"openssl"
    	"libgpg-error"
    	"libgcrypt"
    	"libssh"
    	"curl"
    	"libconfig"
    	"libxml2"
    	"json-glib"
    	"libsoup"
    	"libevent"
    	"xorg-macros"
    	"xtrans"
    	"xproto"
    	"xextproto"
    	"inputproto"
    	"xcb-proto"
    	"pthread-stubs"
    	"libXau"
    	"libxslt"
    	"libxcb"
    	"xcb-util"
    	"xcb-util-wm"
    	"xcb-util-image"
    	"xcb-util-keysyms"
    	"videoproto"
    	"kbproto"
    	"libpng"
    	"jpeg"
    	"jasper"
    	"libtiff"
    	"lcms2"
    	"libraw"
    	"freetype"
    	"fontconfig"
    	"libX11"
    	"libXext"
    	"libXv"
    	"lame"
    	"alsa-lib"
    	"ogg"
    	"libvorbis"
    	"directfb"
    	"pixman"
    	"cairo"
    	"theora"
    	"x264"
    	"libav"
    	"gstreamer"
    	"libvisual"
    	"orc"
    	"gst-plugins-base"
    	"wavpack"
    	"taglib"
    	"gst-plugins-good"
    	"libical"
    	"bluez"
    	"libusb"
    	"libmodbus"
    	"i2c-tools"
    	"liblqr"
    	"qt-everywhere"
    	"qjson"
    	"blacklib"
    	"wiringpi"
    	"opencv"
    )
    
    export PATH="${UV_toolchain_dir}/bin:${GV_prefix}/bin:${UV_sysroot_dir}/bin:${PATH}"
    export CFLAGS="-I${UV_sysroot_dir}/include"
    export CPPFLAGS=$CFLAGS
    export CXXFLAGS=$CPPFLAGS
    export LDFLAGS="-L${UV_sysroot_dir}/lib"
    export PKG_CONFIG_LIBDIR="${UV_sysroot_dir}/lib/pkgconfig"
    export PKG_CONFIG_SYSROOT_DIR="${UV_sysroot_dir}"
    export PKG_CONFIG_PATH="${UV_sysroot_dir}/lib/pkgconfig"

     

    formula 폴더 안에는 각 라이브러리들에 대한 빌드 스크립트가 라이브러리명.sh” 파일로 저장되어 있으며, 해당 스크립트에 따라 빌드가 진행됩니다.

    라이브러리의 버전을 변경하고 싶으면 해당 라이브러리 빌드 스크립트 파일의 GV_url 변수와 GV_sha1 변수를 수정합니다.

    • GV_url : 해당 라이브러리 소스패키지의 웹 다운로드 경로
    • GV_sha1 : 해당 파일의 SHA1 Checksum

    GV_sha1의 값은 임의로 알 수 없으므로, 해당 라이브러리 압축 파일을 웹에서 직접 다운로드하여 download 폴더에 복사한 후, “sha1sum” 유틸리티를 이용하여 해시 값을 획득한 후 해당 값을 적용합니다.

    아래 그림은 기존 7.26.0 버전의 CURL 라이브러리를 7.51.0 버전으로 변경한 내용을 나타냅니다.

    $ sha1sum curl-7.51.0.tar.bz2 
    f02a14bbe580d2a8cf3bf45a79d39eb595220ac7  curl-7.51.0.tar.bz2
    
    
    $ vi curl.sh
    #!/bin/bash
    
    #GV_url="http://curl.haxx.se/download/curl-7.26.0.tar.bz2"
    GV_url="http://curl.haxx.se/download/curl-7.51.0.tar.bz2"
    #GV_sha1="c2e62eaace2407d377bf544d1f808aea6dddf64c"
    GV_sha1="f02a14bbe580d2a8cf3bf45a79d39eb595220ac7"
    
    GV_depend=(
    	"zlib"
    	"openssl"
    	"libssh"
    )
    
    FU_tools_get_names_from_url
    FU_tools_installed "libcurl.pc"
    
    if [ $? == 1 ]; then
    	
    	FU_tools_check_depend
    	
    	export LIBS="-lssh2 -lcrypto -lgcrypt -lgpg-error -lz -ldl"
    
    	GV_args=(
    		"--host=${GV_host}"
    		"--prefix=${GV_prefix}" 
    		"--program-prefix=${UV_target}-"
    		"--libdir=${UV_sysroot_dir}/lib"
    		"--includedir=${UV_sysroot_dir}/include"
    		"--enable-shared"
    		"--disable-static"
    		"--enable-ipv6"
    	)
    	
    	FU_file_get_download
    	FU_file_extract_tar
    		
    	FU_build_configure
    	FU_build_make
    	FU_build_install "install-strip"
    	FU_build_finishinstall	
    fi

     

     

     

    어플리케이션 빌드 및 실행

    CURL 라이브러리를 포함하는 어플리케이션을 빌드하기 위해서는 arm-cross-sysroot-master에서 빌드 된 라이브러리들 중 다음 라이브러리들을 포함시켜야 합니다.

    • curl, ssl, ssh2, crypto, gcrypt, gpg-error, z (*.a, *.so*, *.la 파일)

    해당 라이브러리 파일들을 어플리케이션 소스패키지 특정폴더 내에 복사하고 어플리케이션 빌드 시 Makefile에 다음과 같이 명시하여 라이브러리를 링크하여 빌드하도록 합니다.

    • LIBS += -L특정폴더 -lcurl lssl lssh2 lcrypt lgcrypt lgpg-error lz

     

    위 라이브러리들 중 일부는 공유라이브러리 형식이므로, 어플리케이션을 타겟 플랫폼에서 실행시키기 위해 위 라이브러리(.so 파일)들을 모두 타겟 플랫폼의 라이브러리 폴더(/lib 또는 /usr/lib)에 다운로드해야 합니다.

    • libcrypt.so*, libcurl.so*, libgcrypt.so*, libgpg-error.so*, libssh2.so*, libssl.so*, libz.so*

    파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

     

     

     

     

     

    댓글

    Designed by JB FACTORY