andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 1 | # Linux Chromium Arm Recipes |
| 2 | |
| 3 | [TOC] |
| 4 | |
| 5 | ## Recipe1: Building for an ARM CrOS device |
| 6 | |
| 7 | This recipe uses `ninja` (instead of `make`) so its startup time is much lower |
| 8 | (sub-1s, instead of tens of seconds), is integrated with goma (for |
| 9 | google-internal users) for very high parallelism, and uses `sshfs` instead of |
| 10 | `scp` to significantly speed up the compile-run cycle. It has moved to |
| 11 | https://sites.google.com/a/chromium.org/dev/developers/how-tos/-quickly-building-for-cros-arm-x64 |
| 12 | (mostly b/c of the ease of attaching files to sites). |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 13 | |
| 14 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 15 | ## Recipe2: Explicit Cross compiling |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 16 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 17 | Due to the lack of ARM hardware with the grunt to build Chromium native, cross |
| 18 | compiling is currently the recommended method of building for ARM. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 19 | |
| 20 | These instruction are designed to run on Ubuntu Precise. |
| 21 | |
| 22 | ### Installing the toolchain |
| 23 | |
| 24 | The install-build-deps script can be used to install all the compiler |
| 25 | and library dependencies directly from Ubuntu: |
| 26 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 27 | $ ./build/install-build-deps.sh --arm |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 28 | |
| 29 | ### Installing the rootfs |
| 30 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 31 | A prebuilt rootfs image is kept up-to-date on Cloud Storage. It will |
| 32 | automatically be installed by gclient runhooks installed if you have |
| 33 | `target_arch=arm` in your `GYP_DEFINES`. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 34 | |
| 35 | To install the sysroot manually you can run: |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 36 | |
| 37 | ./chrome/installer/linux/sysroot_scripts/install-debian.wheezy.sysroot.py \ |
| 38 | --arch=arm |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 39 | |
| 40 | ### Building |
| 41 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 42 | To build for ARM, using the clang binary in the chrome tree, use the following |
| 43 | settings: |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 44 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 45 | export GYP_CROSSCOMPILE=1 |
| 46 | export GYP_DEFINES="target_arch=arm" |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 47 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 48 | There variables need to be set at gyp-time (when you run `gyp_chromium`), |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 49 | but are not needed at build-time (when you run make/ninja). |
| 50 | |
| 51 | ## Testing |
| 52 | |
| 53 | ### Automated Build and Testing |
| 54 | |
| 55 | Chromium's testing infrastructure for ARM/Linux is (to say the least) |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 56 | in its infancy. There are currently two builders setup, one on the |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 57 | FYI waterfall and one the the trybot waterfall: |
| 58 | |
nodir | a6074d4c | 2015-09-01 04:26:45 | [diff] [blame^] | 59 | * [Linux ARM Cross-Compile](http://build.chromium.org/p/chromium.fyi/builders/Linux%20ARM%20Cross-Compile) |
| 60 | * [linux_arm](http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_arm) |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 61 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 62 | These builders cross compile on x86-64 and then trigger testing on real ARM hard |
| 63 | bots: |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 64 | |
nodir | a6074d4c | 2015-09-01 04:26:45 | [diff] [blame^] | 65 | * [Linux ARM Tests (Panda)](http://build.chromium.org/p/chromium.fyi/builders/Linux%20ARM%20Tests%20%28Panda%29/) |
| 66 | * [linux_arm_tester](http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_arm_tester) |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 67 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 68 | Unfortunately, even those the builders are usually green, the testers are not |
| 69 | yet well maintained or monitored. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 70 | |
| 71 | There is compile-only trybot and fyi bot also: |
| 72 | |
nodir | a6074d4c | 2015-09-01 04:26:45 | [diff] [blame^] | 73 | * [Linux ARM](http://build.chromium.org/p/chromium.fyi/builders/Linux%20ARM) |
| 74 | * [linux_arm_compile](http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_arm_compile) |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 75 | |
| 76 | ### Testing with QEMU |
| 77 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 78 | If you don't have a real ARM machine, you can test with QEMU. For instance, |
| 79 | there are some prebuilt QEMU Debian images here: |
| 80 | http://people.debian.org/~aurel32/qemu/. Another option is to use the rootfs |
| 81 | generated by rootstock, as mentioned above. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 82 | |
| 83 | Here's a minimal xorg.conf if needed: |
| 84 | |
| 85 | ``` |
| 86 | Section "InputDevice" |
| 87 | Identifier "Generic Keyboard" |
| 88 | Driver "kbd" |
| 89 | Option "XkbRules" "xorg" |
| 90 | Option "XkbModel" "pc105" |
| 91 | Option "XkbLayout" "us" |
| 92 | EndSection |
| 93 | |
| 94 | Section "InputDevice" |
| 95 | Identifier "Configured Mouse" |
| 96 | Driver "mouse" |
| 97 | EndSection |
| 98 | |
| 99 | Section "Device" |
| 100 | Identifier "Configured Video Device" |
| 101 | Driver "fbdev" |
| 102 | Option "UseFBDev" "true" |
| 103 | EndSection |
| 104 | |
| 105 | Section "Monitor" |
| 106 | Identifier "Configured Monitor" |
| 107 | EndSection |
| 108 | |
| 109 | Section "Screen" |
| 110 | Identifier "Default Screen" |
| 111 | Monitor "Configured Monitor" |
| 112 | Device "Configured Video Device" |
| 113 | DefaultDepth 8 |
| 114 | SubSection "Display" |
| 115 | Depth 8 |
| 116 | Modes "1024x768" "800x600" "640x480" |
| 117 | EndSubSection |
| 118 | EndSection |
| 119 | ``` |
| 120 | |
| 121 | ### Notes |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 122 | |
| 123 | * To building for thumb reduces the stripped release binary by around 9MB, |
| 124 | equating to ~33% of the binary size. To enable thumb, set `'arm_thumb': 1` |
| 125 | * TCmalloc does not have an ARM port, so it is disabled. |