1 Toybox: all-in-one Linux command line.
2
3 --- Getting started
4
5 You can download static binaries for various targets from:
6
7 http://landley.net/toybox/bin
8
9 The special name "." indicates the current directory (just like ".." means
10 the parent directory), and you can run a program that isn't in the $PATH by
11 specifying a path to it, so this should work:
12
13 wget http://landley.net/toybox/bin/toybox-x86_64
14 chmod +x toybox-x86_64
15 ./toybox-x86_64 echo hello world
16
17 --- Building toybox
18
19 Type "make help" for build instructions.
20
21 Toybox uses the "make menuconfig; make; make install" idiom same as
22 the Linux kernel. Usually you want something like:
23
24 make defconfig
25 make
26 make install
27
28 Or maybe:
29
30 LDFLAGS="--static" CROSS_COMPILE=armv5l- make defconfig toybox
31 PREFIX=/path/to/root/filesystem/bin make install_flat
32
33 The file "configure" defines default values for many environment
34 variables that control the toybox build; if you set a value for any of
35 these, your value is used instead of the default in that file.
36
37 The CROSS_COMPILE argument above is optional, the default builds a version of
38 toybox to run on the current machine. Cross compiling requires an appropriately
39 prefixed cross compiler toolchain, several example toolchains are available at:
40
41 http;//landley.net/aboriginal/bin
42
43 For the "CROSS_COMPILE=armv5l-" example above, download
44 cross-compiler-armv5l.tar.bz2, extract it, and add its "bin" subdirectory to
45 your $PATH. (And yes, the trailing - is significant, because the prefix
46 includes a dash.)
47
48 For more about cross compiling, see:
49
50 http://landley.net/writing/docs/cross-compiling.html
51 http://landley.net/aboriginal/architectures.html
52
53 For a more thorough description of the toybox build process, see
54 http://landley.net/toybox/code.html#building
55
56 --- Using toybox
57
58 The toybox build produces a multicall binary, a "swiss-army-knife" program
59 that acts differently depending on the name it was called by (cp, mv, cat...).
60 Installing toybox adds symlinks for each command name to the $PATH.
61
62 The special "toybox" command treats its first argument as the command to run.
63 With no arguments, it lists available commands. This allows you to use toybox
64 without installing it. This is the only command that can have an arbitrary
65 suffix (hence "toybox-armv5l").
66
67 The "help" command provides information about each command (ala "help cat").
68
69 --- Configuring toybox
70
71 It works like the Linux kernel: allnoconfig, defconfig, and menuconfig edit
72 a ".config" file that selects which features to include in the resulting
73 binary. You can save and re-use your .config file, although may want to
74 run "make oldconfig" to re-run the dependency resolver when migrating to
75 new versions.
76
77 The maximum sane configuration is "make defconfig": allyesconfig isn't
78 recommended for toybox because it enables unfinished commands and debug code.
79
80 --- Creating a Toybox-based Linux system
81
82 Toybox is not a complete operating system, it's a program that runs under
83 an operating system. Booting a simple system to a shell prompt requires
84 three packages: an operating system kernel (Linux*) to drive the hardware,
85 one or more programs for the system to run (toybox), and a C library ("libc")
86 to tie them together (toybox has been tested with musl, uClibc, glibc,
87 and bionic).
88
89 The C library is part of a "toolchain", which is an integrated suite
90 of compiler, assembler, and linker, plus the standard headers and libraries
91 necessary to build C programs. (And miscellaneous binaries like nm and objdump.)
92
93 Static linking (with the --static option) copies the shared library contents
94 into the program, resulting in larger but more portable programs, which
95 can run even if they're the only file in the filesystem. Otherwise,
96 the "dynamically" linked programs require the library files to be present on
97 the target system ("man ldd" and "man ld.so" for details).
98
99 An example toybox-based system is Aboriginal Linux:
100
101 http://landley.net/aboriginal/about.html
102
103 That's designed to run under qemu, emulating several different hardware
104 architectures (x86, x86-64, arm, mips, sparc, powerpc, sh4). Each toybox
105 release is regression tested by building Linux From Scratch under this
106 toybox-based system on each supported architecture, using QEMU to emulate
107 big and little endian systems with different word size and alignment
108 requirements. (The eventual goal is to replace Linux From Scratch with
109 the Android Open Source Project.)
110
111 * Or something providing the same API such as FreeBSD's Linux emulation layer.
112
113 --- Presentations
114
115 1) "Why Toybox?" talk at the Embedded Linux Conference in 2013
116
117 video: http://youtu.be/SGmtP5Lg_t0
118 outline: http://landley.net/talks/celf-2013.txt
119 linked from http://landley.net/toybox/ in nav bar on left as "Why is it?"
120 - march 21, 2013 entry has section links.
121
122 2) "Why Public Domain?" The rise and fall of copyleft, Ohio LinuxFest 2013
123
124 audio: https://archive.org/download/OhioLinuxfest2013/24-Rob_Landley-The_Rise_and_Fall_of_Copyleft.mp3
125 outline: http://landley.net/talks/ohio-2013.txt
126
127 3) Why did I do Aboriginal Linux (which led me here)
128
129 260 slide presentation:
130 https://speakerdeck.com/landley/developing-for-non-x86-targets-using-qemu
131
132 How and why to make android self-hosting:
133 http://landley.net/aboriginal/about.html#selfhost
134
135 4) What's new with toybox (ELC 2015 status update):
136
137 video: http://elinux.org/ELC_2015_Presentations
138 outline: http://landley.net/talks/celf-2015.txt
139
140 --- Contributing
141
142 The three important URLs for communicating with the toybox project are:
143
144 web page: http://landley.net/toybox
145
146 mailing list: http://lists.landley.net/listinfo.cgi/toybox-landley.net
147
148 git repo: http://github.com/landley/toybox
149
150 The maintainer prefers patches be sent to the mailing list. If you use git,
151 the easy thing to do is:
152
153 git format-patch -1 $HASH
154
155 Then send a file attachment. The list holds messages from non-subscribers
156 for moderation, but I usually get to them in a day or two.
157
158 Although I do accept pull requests on github, I download the patches and
159 apply them with "git am" (which avoids gratuitous merge commits). Closing
160 the pull request is then the submitter's responsibility.
161
162 If I haven't responded to your patch after one week, feel free to remind
163 me of it.
164
165 Android's policy for toybox patches is that non-build patches should go
166 upstream first (into vanilla toybox, with discussion on the toybox mailing
167 list) and then be pulled into android's toybox repo from there. (They
168 generally resync on fridays). The exception is patches to their build scripts
169 (Android.mk and the checked-in generated/* files) which go directly to AOSP.
170
171 --- Code of conduct
172
173 We're using twitter's https://engineering.twitter.com/opensource/code-of-conduct
174 except email rob (a] landley.net with complaints.
175
176 (Yes, I try to pay more attention to marginalized programmers, which somehow
177 manages to include 51% of the population. If somebody has to be three times as
178 good to get half the recognition, why WOULDN'T you adjust for that?)
179