ヤること

  • 無線 dongle
    • wpa_supplicant
  • GPS
    • libfreerunner_gps

両方が微妙に関係しているあたりが微妙なんですが。
gcj が邪魔をしているみたいなのでパケジ削除。

# apt-get remove java-gcj-compat java-gcj-compat-headless
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  ttf-devanagari-fonts ttf-punjabi-fonts ttf-indic-fonts ttf-kannada-fonts ttf-gujarati-fonts ttf-telugu-fonts ttf-tamil-fonts tzdata-java
  ttf-arphic-uming ttf-malayalam-fonts rhino ttf-oriya-fonts ttf-baekmuk ttf-bengali-fonts
Use 'apt-get autoremove' to remove them.
The following packages will be REMOVED:
  java-gcj-compat java-gcj-compat-headless openoffice.org-gcj
0 upgraded, 0 newly installed, 3 to remove and 149 not upgraded.
After this operation, 11.9MB disk space will be freed.
Do you want to continue [Y/n]?
(Reading database ... 202524 files and directories currently installed.)
Removing openoffice.org-gcj ...
Removing java-gcj-compat ...
Removing java-gcj-compat-headless ...
#

で、ようやくコンパイルが正常終了している臭いコトを確認。現時点で以下なカンジ。

$ ~/bin/repo status
# on branch a500fx
project external/webkit/                        branch a500fx
 -m     Android.jsc.mk
 --     Android.jsc.mk.orig
 -m     JavaScriptCore/Android.mk
 --     JavaScriptCore/Android.mk.orig
project frameworks/base/                        branch a500fx
 -m     graphics/jni/Android.mk
 --     graphics/jni/Android.mk.orig
 -m     libs/rs/Android.mk
 --     libs/rs/Android.mk.orig
project packages/providers/CalendarProvider/    branch a500fx
 -m     src/com/android/providers/calendar/CalendarSyncAdapter.java
 --     src/com/android/providers/calendar/CalendarSyncAdapter.java.orig
project system/core/                            branch a500fx
 -m     init/devices.c
 --     init/devices.c.orig
 -m     init/logo.c
 --     init/logo.c.orig
$

とりあえずこの状態で commit してさらに branch する形で動作を見てみる方向で。

$ ~/bin/repo status
# on branch a500fx
nothing to commit (working directory clean)
$ ~/bin/repo branches
*  a500fx                    | in all projects
   master                    | in all projects
$

で、a500fx を基に branch すれば良いのか。

$ ~/bin/repo start freerunner --all
Starting freerunner: 100% (152/152), done.  
$

で、mm とか mmm のナニをソレ。とりあえず

$ cd $ANDROID/external
$ git clone git://gitorious.org/android-on-freerunner/freerunner_platform_hardware_hw.git
$ cd freerunner_platform_hardware_hw

ええと、mm が_Builds all of the modules in the current directory._ってコトなので何も考えずにここで mm してみるか。

$  . /home/rms/armadillo500fx/build/envsetup.sh 
$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a500fx
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: ディレクトリ `/home/rms/armadillo500fx' に入ります
target thumb C: lights.gta02 <= external/freerunner_platform_hardware_hw/lights/lights_freerunner.c
target SharedLib: lights.gta02 (out/target/product/a500fx/obj/SHARED_LIBRARIES/lights.gta02_intermediates/LINKED/lights.gta02.so)
target Non-prelinked: lights.gta02 (out/target/product/a500fx/symbols/system/lib/lights.gta02.so)
target Strip: lights.gta02 (out/target/product/a500fx/obj/lib/lights.gta02.so)
Install: out/target/product/a500fx/system/lib/hw/lights.gta02.so
target thumb C: sensors.gta02 <= external/freerunner_platform_hardware_hw/sensors/sensors_freerunner.c
external/freerunner_platform_hardware_hw/sensors/sensors_freerunner.c:438: warning: initialization from incompatible pointer type
target SharedLib: sensors.gta02 (out/target/product/a500fx/obj/SHARED_LIBRARIES/sensors.gta02_intermediates/LINKED/sensors.gta02.so)
target Non-prelinked: sensors.gta02 (out/target/product/a500fx/symbols/system/lib/sensors.gta02.so)
target Strip: sensors.gta02 (out/target/product/a500fx/obj/lib/sensors.gta02.so)
Install: out/target/product/a500fx/system/lib/hw/sensors.gta02.so
make: ディレクトリ `/home/rms/armadillo500fx' から出ます
$

gps/Android.mk がこうなっているので、gps 配下は完全スルー。

$ cat gps/Android.mk
# hardware/libfreerunner_gps/Android.mk

ifeq ($(strip $(BOARD_HAVE_FREERUNNER_GPS)),true)

  LOCAL_PATH := $(call my-dir)

  include $(CLEAR_VARS)

  LOCAL_SRC_FILES := \
    gps_freerunner.c

  LOCAL_MODULE := libfreerunner_gps

  LOCAL_SHARED_LIBRARIES := \
    libutils \
    libcutils \
    libdl \
    libc

  include $(BUILD_SHARED_LIBRARY)

endif
$

$ANDROID/vendor/sola/a500fx/BoardConfig.mk に

BOARD_HAVE_FREERUNNER_GPS := true

を追加して再度 mm してみます。

$ echo "BOARD_HAVE_FREERUNNER_GPS := true" >> $ANDROID/vendor/sola/a500fx/BoardConfig.mk
$ cat $ANDROID/vendor/sola/a500fx/BoardConfig.mk
# config.mk
# 
# Product-specific compile-time definitions.
#

# The generic product target doesn't have any hardware-specific pieces.
USE_CAMERA_STUB := true
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true
TARGET_CPU_ABI := armeabi
HAVE_HTC_AUDIO_DRIVER := false
BOARD_USES_GENERIC_AUDIO := true

BOARD_HAVE_FREERUNNER_GPS := true
$ LANG=C mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a500fx
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: Entering directory `/home/rms/armadillo500fx'
target thumb C: libfreerunner_gps <= external/freerunner_platform_hardware_hw/gps/gps_freerunner.c
external/freerunner_platform_hardware_hw/gps/gps_freerunner.c:1290: warning: initialization from incompatible pointer type
external/freerunner_platform_hardware_hw/gps/gps_freerunner.c:1291: warning: initialization from incompatible pointer type
external/freerunner_platform_hardware_hw/gps/gps_freerunner.c:1292: warning: initialization from incompatible pointer type
target SharedLib: libfreerunner_gps (out/target/product/a500fx/obj/SHARED_LIBRARIES/libfreerunner_gps_intermediates/LINKED/libfreerunner_gps.so)
target Prelink: libfreerunner_gps (out/target/product/a500fx/symbols/system/lib/libfreerunner_gps.so)
build/tools/apriori/prelinkmap.c(168): library 'libfreerunner_gps.so' not in prelink map
make: *** [out/target/product/a500fx/symbols/system/lib/libfreerunner_gps.so] Error 1
make: Leaving directory `/home/rms/armadillo500fx'
$

む、build/tools/apriori/prelinkmap.c って何だ。

と言いつつ

build/core/prelink-linux-arm.map というテキストを発見。中身を見るに、こっちに情報を登録すべきなのか、AndroidでJNIを使う方法にある通り

LOCAL_PRELINK_MODULE := false

Android.mk に追加するべきなのかが微妙。
下記を確認したら

末端に追加されているな。という事は以下で良いのだろうか。

# libraries for specific apps or temporary libraries
--中略--
libcerttool_jni.so      0x9A100000
libfreerunner_gps.so    0x9A000000

これで再度 mm 実行してみたらどうか。

$ LANG=C mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a500fx
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: Entering directory `/home/rms/armadillo500fx'
target Prelink: libfreerunner_gps (out/target/product/a500fx/symbols/system/lib/libfreerunner_gps.so)
libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order!
libelfcopy: Warning: Range lists in .debug_ranges section start at 0x530
target Strip: libfreerunner_gps (out/target/product/a500fx/obj/lib/libfreerunner_gps.so)
Install: out/target/product/a500fx/system/lib/libfreerunner_gps.so
make: Leaving directory `/home/rms/armadillo500fx'
$

を、system/lib に入ったな。これでコンパイルから導入は大丈夫なので次は中身を触らないといけません。あ、良く考えたら BoardConfig.mk に以下も追加が必要なのかな。

BOARD_GPS_LIBRARIES := libfreerunner_gps

上記追加して mm してみたらどうなるのかな。

$ echo "BOARD_GPS_LIBRARIES := libfreerunner_gps" >> $ANDROID/vendor/sola/a500fx/BoardConfig.mk
$ cat $ANDROID/vendor/sola/a500fx/BoardConfig.mk
# config.mk
# 
# Product-specific compile-time definitions.
#

# The generic product target doesn't have any hardware-specific pieces.
USE_CAMERA_STUB := true
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true
TARGET_CPU_ABI := armeabi
HAVE_HTC_AUDIO_DRIVER := false
BOARD_USES_GENERIC_AUDIO := true

BOARD_HAVE_FREERUNNER_GPS := true
BOARD_GPS_LIBRARIES := libfreerunner_gps
$

で、mm したらどうなるか。

$ LANG=C mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a500fx
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: Entering directory `/home/rms/armadillo500fx'
target SharedLib: libhardware_legacy (out/target/product/a500fx/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/LINKED/libhardware_legacy.so)
target Prelink: libhardware_legacy (out/target/product/a500fx/symbols/system/lib/libhardware_legacy.so)
libelfcopy: Warning: DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8
libelfcopy: Warning: Location lists in .debug_info section aren't in ascending order!
libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order!
target Strip: libhardware_legacy (out/target/product/a500fx/obj/lib/libhardware_legacy.so)
Install: out/target/product/a500fx/system/lib/libhardware_legacy.so
make: Leaving directory `/home/rms/armadillo500fx'
$

なんとなく gps.cpp がリコンパイルされた風では無さげに見えるのは気のせいかなぁ。ライブラリを消してみて再度 mm してみます。

$ rm -f $ANDROID/out/target/product/a500fx/system/lib/libhardware_legacy.so
$ LANG=C mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a500fx
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: Entering directory `/home/rms/armadillo500fx'
Install: out/target/product/a500fx/system/lib/libhardware_legacy.so
make: Leaving directory `/home/rms/armadillo500fx'
$

げ。オブジェクトはどこにあるんだ、ってか clean するにはどうすりゃ良いのやら。ガイキチ技を発動させて以下をナニ。

$ mm clean
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a500fx
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: ディレクトリ `/home/rms/armadillo500fx' に入ります
make: `files' に対して行うべき事はありません.
Cleaning out/target/product/a500fx...
Cleaning out/target/common...
Cleaning out/host/linux-x86...
Cleaning out/host/common...
Clean.
make: ディレクトリ `/home/rms/armadillo500fx' から出ます
$

うーん。再度 mm してみる。つい LANG=C をつけるのを忘れるなぁ。

$ LANG=C mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a500fx
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: Entering directory `/home/rms/armadillo500fx'
Target buildinfo: out/target/product/a500fx/root/default.prop
Target buildinfo: out/target/product/a500fx/system/build.prop
make: *** No rule to make target `out/host/linux-x86/bin/acp', needed by `out/target/product/a500fx/system/etc/apns-conf.xml'.  Stop.
make: Leaving directory `/home/rms/armadillo500fx'
$

これ、全部が clean されちゃったクサいんですが (とほほ

という事でリコンパイル実施

駄目すぎる。なんとなく全部コンパイルしてそげに見えるんで今日はもう駄目かな。

追記

良く考えたら branch 作り直せば良いんだった。なるべく全コンパイルを避けるために branch 作る事にしたんだからこのあたりは上手に使わんとの。
とりあえず branch の削除の方法は分からんが作り直し。

$ ~/bin/repo branches
   a500fx                    | in all projects
*  freerunner                | in all projects
   master                    | in all projects
$ ~/bin/repo checkout a500fx
Checkout a500fx: 100% (152/152), done.  
$ ~/bin/repo branches
*  a500fx                    | in all projects
   freerunner                | in all projects
   master                    | in all projects
$ ~/bin/repo start freerunner2 --all
Starting freerunner2: 100% (152/152), done.  
$

元に戻せたんですが、どうするか考え中。

  • BOARD_HAVE_FREERUNNER_GPS := true を BoardConfig.mk に追加
  • build/core/prelink-linux-arm.map 末端にエントリ追加
  • BOARD_GPS_LIBRARIES := libfreerunner_gps を BoardConfig.mk に追加

で、今日の敗因は libhardware_legacy で mm しなかったのが悪かったのかなぁ。ターゲットを削除するだけではなくて .o なソレを削除しないと駄目、って事なのか。

あら?

新たに作成させて頂いた branch で mm できん。なんとなく out 配下が微妙だったので make し直してみます。若干 repo って微妙だなぁ。
とりあえず、あるプロジェクトのみリコンパイルって無理なのかどうなのか。