ラベル Wget の投稿を表示しています。 すべての投稿を表示
ラベル Wget の投稿を表示しています。 すべての投稿を表示

2017/11/20

Termuxの備忘録

昔書いた、
Android上で動くgccの導入
WgetをAndroid NDKでコンパイル
Android用のnkfをコンパイル
Android用のnkfをコンパイル その2
がたまにアクセスがあるので、自分の備忘録も兼ねて。

Android 5.0以上ならターミナルエミュレーターはTermuxの使用をお勧めします。


インストールと初期設定など


まずGoogle Playからインストール → Termux

使い方はTermuxのThe Termux Wikiを見ればOK

忘れがちなキーの割り当て(Touch Keyboardより)
・Volume Up + W → Up arrow key
・Volume Up + A → Left arrow key
・Volume Up + S → Down arrow key
・Volume Up + D → Right arrow key

ボリュームダウンが[Ctrl]キーに割り当てられてるけど、操作し辛いのでナビゲーションドロワーから「KEYBOARD」を長押しして、「Extra keys view」を表示しておく。(Touch Keyboardより)
バージョン 0.62から Extra keys view は Volume UP + Q で表示/非表示可能 (2018/06/24 追記)
Volume UP + Q での Extra keys view の表示/非表示は以前からあったようです(2018/06/27 追記)


Termux-setup-storage にある通り、ストレージの初期設定を行う。

あとはDebian系のディストリビューションと同じ感覚で、

$ apt update

で利用できるパッケージリストの更新。

$ apt upgrade

で新しいパッケージに更新。

以上で、Termuxの準備は完了。


パッケージのインストール


・Clang
以前はgccのパッケージがあったのですが、現在ではClangになっています。(clangのパッケージに含まれるgccはclangへのリンクになっています。)

$ apt install clang

でインストールされます。

・Wget
Termuxはbusyboxがインストールされているので、busyboxで機能が足りているならそのまま使用、機能が足りないようであれば、パッケージのインストール。

$ apt install wget

でインストールされます。

・nkf
Termuxのパッケージにはないので、コンパイルします。
nkf Network Kanji Filterからソースをダウンロードして、ファイルの展開後、config.h の

#define DEFAULT_CODE_UTF8

を有効にして

$ make

で実行ファイルが作成されます。

2018/06/16 追記
FDcloneのコンパイル、インストール方法は Termux上でFDcloneを動かす に書きました。

2012/05/19

WgetをAndroid NDKでコンパイル

2017/11/20 追記
Android 5.0以上ならTermuxでWgetを使用できます → Termuxの備忘録
追記ここまで

configureを使用してからmakeするソフトウェアをAndroid用にコンパイルできればなぁ、と。
間違っているところもあると思いますので注意してください。

こんな流れで作成してみる。

  • configureでコンパイル時に必要なファイル等を作成
  • Makefileと実際にmakeして、コンパイル対象となるソースやコンパイル時の定義を確認し、Android.mkを作成。(makeで作成されるバイナリでもAndroidで動くのですが、ndk-buildで作成したいので)
  • ndk-buildでAndroid用のバイナリを作成

Android用のWgetは既にバイナリが提供されているので(Android用のwgetを導入参照)、無駄に思えるけど、Wget(1.11.4)がコンパイルしやすかったので、NDK内のドキュメントSTANDALONE-TOOLCHAIN.htmlを読みながらコンパイルしてみる。
(CentOS 5.8上のAndroid NDK Revision 8で実行しています)

1.toolchainの選択
 使っているAndroidのCPUがARMなのでarm-linux-androideabi-4.4.3になる。
2.sysrootの設定
 NDKを$HOMEに展開しているので
$ NDK=${HOME}/android-ndk-r8
 とし、Android 2.3向けにコンパイルしたいので
$ SYSROOT=${NDK}/platforms/android-9/arch-arm
 とする。AndroidのバージョンとAPIレベルの対応はSTABLE-APIS.htmlを参照。
3.コンパイラの選択
$ export CC="${NDK}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=${SYSROOT}"
 CCに--sysrootまでを含める。
4.CFLAGSの設定
 CPUがAMRv7でVFPがあるのでドキュメントと同じ様に設定。ただし、この後に実行するconfigureでCFLAGSが反映されないのでexportしておく。
$ export CFLAGS='-march=armv7-a -mfloat-abi=softfp'

ここからドキュメントを離れて実際にconfigureとmake
$ tar zxf wget-1.11.4.tar.gz
$ cd wget-1.11.4
$ ./configure --without-ssl --disable-nls --build=i686-pc-linux --host=arm-none-linux-gnueabi
config.status: WARNING:  Makefile.in seems to ignore the --datarootdir setting
※2013/05/20 追記: configure時のオプション--hostはgccの前に付いているarm-linux-androideabiのほうがいいですね。

と警告が出るが、コンパイルしたいだけなので気にしない。
コンパイル時に必要なsrc/config.hが作成されるのでsrcディレクトリに移動してmake。
$ cd src
$ make
utils.c: In function 'get_grouping_data':
utils.c:1223: error: 'struct lconv' has no member named 'thousands_sep'
utils.c:1224: error: 'struct lconv' has no member named 'grouping'
utils.c:1238: error: 'struct lconv' has no member named 'decimal_point'
make: *** [utils.o] エラー 1
utils.cでエラーとなる。Android NDKのlocale.hではstruct lconvが定義されているがメンバーが無いので修正する。

--- utils.c.org 2008-04-27 13:48:24.000000000 +0900
+++ utils.c     2012-05-19 18:04:08.000000000 +0900
@@ -1213,6 +1213,10 @@
 static void
 get_grouping_data (const char **sep, const char **grouping)
 {
+#ifdef __ANDROID__
+  static const char *cached_sep = ",";
+  static const char *cached_grouping = "\x03";
+#else
   static const char *cached_sep;
   static const char *cached_grouping;
   static bool initialized;
@@ -1243,6 +1247,7 @@
         }
       initialized = true;
     }
+#endif
   *sep = cached_sep;
   *grouping = cached_grouping;
 }
変な直し方ですが、数値の桁区切りの文字と区切りを入れる桁数の設定をしているだけなので、こんな感じで。
utils.cの1箇所からしか呼ばれていないので、get_grouping_data()の呼び出し元を修正してget_grouping_data()を削除してもいいかも。
修正後、makeしなおしてwgetが作成されることを確認。

Android.mkとApplication.mkをwget-1.11.4/jni/に作成して、ndk-buildでもwgetが作成できることを確認。

以前Android用のwgetを導入した時は、修正パッチを見て結構修正する必要があると思ったのですが、Android向けの設定でconfigureが通れば、修正箇所はかなり減りますね。

2011/01/26

Android用のwgetを導入

以前インストールした Busybox for android のwgetでは名前解決ができないので、Android用にコンパイルされたwgetを Jacob Hoffman-Andrews' Android stuff からダウンロードしてIS01にインストール。

パッチを見ると思ったより修正が必要だな、と。

Zaurusではwgetのバージョンが1.10.2の時にクロスコンパイルをしてみたけど、当時のメモを見るとソースの修正はなく、configure時にいくつかオプションを指定してmakeしていた模様。

GNU関係のソフトをAndroidに入れようとすると、それなりに修正が必要なのかな。

#wgetを入れたのは、LWPを入れるのが大変そうだったので。