123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- Embedded Shell Scripts in BusyBox
- =================================
- BusyBox allows applets to be implemented as shell scripts. Since
- this obviously requires a shell to interpret the scripts the feature
- depends on having a shell built into the binary. Either ash or hush
- will do. If both are present ash will be used. Support for embedded
- scripts also has to be enabled.
- It's unlikely that your applet will be implemented as a pure shell
- script: it will probably need some external commands. If these are
- to be provided by BusyBox you'll need to ensure they're enabled too.
- There are two ways to include scripts in BusyBox: the quick-and-dirty
- custom script and the full-featured scripted applet.
- Custom Scripts
- --------------
- When embedded script support is enabled the BusyBox build process
- assumes that any files in the directory 'embed' at the top level of
- the source tree are scripts to be embedded.
- The embed directory isn't present in the BusyBox source tree and
- BusyBox itself will never put anything there: it's entirely for the
- use of third parties.
- Adding a custom script is as simple as running the following sequence
- of commands in the BusyBox source directory:
- mkdir embed
- echo 'echo foo' >embed/foo
- make defconfig
- make
- The resulting binary includes the new applet foo!
- Custom scripts have limited opportunities for configuration: the only
- control developers have is to put them in the embed directory, or not.
- Everything else takes default values. For more control you need the
- additional features provided by scripted applets.
- Scripted Applets
- ----------------
- Suppose we want to make a shell script version of the sample applet
- from the New Applet HOWTO. First we'd have to write a script (vaguely)
- equivalent to the C code:
- return $(($RANDOM%256))
- This should be placed in the file applets_sh/mu in the source tree.
- Next we need the configuration data. This is very similar to the example
- code for the native applet:
- //config:config MU
- //config: bool "MU"
- //config: default y
- //config: help
- //config: Returns an indeterminate value.
- //applet:IF_MU(APPLET_SCRIPTED(mu, scripted, BB_DIR_USR_BIN, BB_SUID_DROP, mu))
- //usage:#define mu_trivial_usage
- //usage: "[-abcde] FILE..."
- //usage:#define mu_full_usage
- //usage: "Returns an indeterminate value\n"
- //usage: "\n -a First function"
- //usage: "\n -b Second function"
- The only difference is that the applet is specified as being of type
- APPLET_SCRIPTED. It would also be useful to include details of any
- dependencies the script has. No external commands are used by our mu
- script, but it does depend on optional shell features. We can ensure
- these are selected by adding this to the configuration:
- //config:config MU_DEPENDENCIES
- //config: bool "Enable dependencies for mu"
- //config: default y
- //config: depends on MU
- //config: select ASH_RANDOM_SUPPORT
- //config: select FEATURE_SH_MATH
- //config: help
- //config: mu is implemented as a shell script. It requires support
- //config: for $RANDOM and arithmetic.
- The configuration data should be placed in a C file in an appropriate
- subdirectory. There isn't any C code, though! In this case the file
- could be miscutils/mu.c.
- Scripted applets are just as configurable as applets written in C.
- They can be enabled or disabled using the configuration menu; their
- install directory can be specified and their usage messages are stored
- along with those of all other applets.
- Additional Notes
- ----------------
- The source for embedded scripts can be displayed by running:
- busybox --show SCRIPT
- This can be disabled by turning off FEATURE_SHOW_SCRIPT in the
- configuration, though it won't prevent a determined user from
- extracting the source code.
- It can be argued that embedded scripts are linked into the BusyBox
- binary and are therefore not subject to the 'mere aggregation'
- exception in the GPL. If this is the case embedded scripts should
- have a licence compatible with BusyBox's GPL v2-only licence.
|