PQI Air Card向けにcURLをクロスコンパイル

新しい記事を書きました

前回の続きです。

また、実際に成功した記事は次回になります

目的

PQI Air Cardで動くSSL enabledなcurlを手に入れたい。

前回の記事で環境構築→Pythonをビルドできたので、今回はいよいよ本命のcurlをビルドします。

SSL無しで

まずは普通にconfigureしてみました。

エラーは出ませんでしたが、SSLのサポートが無いのがわかります。

  curl version:     7.37.1
  Host setup:       arm-none-linux-gnueabi
  Install prefix:   /usr
  Compiler:         arm-none-linux-gnueabi-gcc
  SSL support:      no      (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls,winssl,darwinssl} )
  SSH support:      no      (--with-libssh2)
  zlib support:     no      (--with-zlib)
  GSS-API support:  no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  no      (--enable-tls-srp)
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     no      (--enable-ipv6)
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=no
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   no
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  HTTP2 support:    disabled (--with-nghttp2)
  Protocols:        DICT FILE FTP GOPHER HTTP IMAP POP3 RTSP SMTP TELNET TFTP

zlibをビルド

紆余曲折しましたが、このページを参考にしました。

後のopensslのビルドもこれを参考にしています。

$ git clone git://github.com/madler/zlib.git
$ cd zlib
$ git checkout -b work_1.2.8 v1.2.8
$ CC=arm-none-linux-gnueabi-gcc
$ ./configure --prefix=$HOME/zlibArm
$ make 
$ make install

opensslをビルド

$ wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz
$ tar zxf openssl-1.0.2j.tar.gz
$ export cross=arm-none-linux-gnueabi-
$ cd openssl-1.0.2j
$ ./Configure dist --prefix=$HOME/opensslArm
$ make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
$ make install

cURLをビルド

いよいよcURLをビルドします。

ビルドにあたり、このページを参考にしました。

$ wget http://curl.haxx.se/download/curl-7.37.1.tar.gz
$ tar xzf curl-7.37.1.tar.gz
$ export ROOTDIR="${PWD}"
$ cd curl-7.37.1/
$ export CROSS_COMPILE="arm-none-linux-gnueabi"
$ export CPPFLAGS="-I${HOME}/opensslArm/include -I${HOME}/zlibArm/include"
$ export LDFLAGS="-L${HOME}/opensslArm/lib -L${HOME}/zlibArm/lib"
$ export AR=${CROSS_COMPILE}-ar
$ export AS=${CROSS_COMPILE}-as
$ export LD=${CROSS_COMPILE}-ld
$ export RANLIB=${CROSS_COMPILE}-ranlib
$ export CC=${CROSS_COMPILE}-gcc
$ export NM=${CROSS_COMPILE}-nm
$ export LIBS="-lssl -lcrypto"
$ ./configure --prefix=${HOME}/curlArm --target=${CROSS_COMPILE} --host=${CROSS_COMPILE} --build=x86_64-pc-linux-gnu --with-ssl --with-zlib

ちなみにcurl-7.50.3でビルドを試みましたが、謎のエラーで3回ほどつまづき、ビルドすることができませんでした。。

$ ./configure ~~~
(略)
configure: error: in `/home/sakaki/temp/curl-7.50.3':
$ vim configure
(4300行目あたりの-V -vquestionオプションを削除)
$ ./configure ~~~
(略)
configure: error: Unable to link function recv

curl-7.37.1だと素直にconfigureできました。

時間があったら他のバージョンも試してみようと思います。

で、configureの結果ですが、

  curl version:     7.37.1
  Host setup:       arm-none-linux-gnueabi
  Install prefix:   /home/sakaki/curlArm
  Compiler:         arm-none-linux-gnueabi-gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     no      (--with-zlib)
  GSS-API support:  no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     no      (--enable-ipv6)
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   no
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  HTTP2 support:    disabled (--with-nghttp2)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMTP SMTPS TELNET TFTP

これでSSLが有効になりました。

あれ、でもzlibが有効になっていませんね。どうしてでしょう。。

問題無さそうなので、そのまま進めます。

いよいよビルドです。

$ make
$ make install

ビルドの結果は問題無さそうです。

あとはこれを実機で試してみるのみとなりました。

ダメだったらどうしようかな(白目)


※追記(2016/10/10)※

やっぱりダメでした・・・でも最後は動いたよ→記事

参考

  • http://memo.saitodev.com/home/arm/arm_cross_compile/#openssl
  • http://www.matteomattei.com/how-to-cross-compile-curl-library-with-ssl-and-zlib-support/
  • http://yasuhide.blog.jp/archives/43019157.html
  • http://stackoverflow.com/questions/11841919/cross-compile-openssh-for-arm
  • http://stackoverflow.com/questions/7561509/how-to-add-include-and-lib-paths-to-configure-make-cycle
  • http://qiita.com/ksugawara61/items/2dc6abd50077fd4b0c87
  • http://stackoverflow.com/questions/25979525/cannot-find-lssl-cannot-find-lcrypto-when-installing-mysql-python-using-mar

所感

私はソースからのコンパイルは数回しか経験が無く、クロスコンパイルに至っては今回が初めての経験です。

この記事にはほとんど書きませんでしたが、成功するまでにかなりの紆余曲折があり、curlをビルドするだけなのにとても疲れました。

また、普段はaptなどのパッケージ管理ツールに慣れてしまいコンパイル力が欠けていましたので、今回はそれを痛感する形となってしまいました。。

それにしても、クロスコンパイルしてみて改めてビルド周りのツール群の強力さがわかった気がします。

無数にあるCPUで正常に動くバイナリをちゃんと作成できるって、すごい事だと思います(超小並

今回は良い経験をさせていただきました。

それでは!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする