1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker# Build a standalone toybox command 4*cf5a6c84SAndroid Build Coastguard Worker 5*cf5a6c84SAndroid Build Coastguard Worker[ -z "$1" ] && { echo "usage: single.sh command..." >&2; exit 1; } 6*cf5a6c84SAndroid Build Coastguard Worker 7*cf5a6c84SAndroid Build Coastguard Workersource scripts/portability.sh 8*cf5a6c84SAndroid Build Coastguard Worker 9*cf5a6c84SAndroid Build Coastguard Worker# Add trailing / to PREFIX when it's set but hasn't got one 10*cf5a6c84SAndroid Build Coastguard Worker[ "$PREFIX" == "${PREFIX%/}" ] && PREFIX="${PREFIX:+$PREFIX/}" 11*cf5a6c84SAndroid Build Coastguard Worker 12*cf5a6c84SAndroid Build Coastguard Worker# Harvest TOYBOX_* symbols from .config, or fresh defconfig if none 13*cf5a6c84SAndroid Build Coastguard Workerexport KCONFIG_CONFIG 14*cf5a6c84SAndroid Build Coastguard Workerif [ ! -e ${KCONFIG_CONFIG:=.config} ] 15*cf5a6c84SAndroid Build Coastguard Workerthen 16*cf5a6c84SAndroid Build Coastguard Worker KCONFIG_CONFIG=.singleconfig 17*cf5a6c84SAndroid Build Coastguard Worker make defconfig 18*cf5a6c84SAndroid Build Coastguard Workerelse 19*cf5a6c84SAndroid Build Coastguard Worker # Force dependencies to rebuild headers if we build multiplexer after this. 20*cf5a6c84SAndroid Build Coastguard Worker touch "$KCONFIG_CONFIG" 21*cf5a6c84SAndroid Build Coastguard Workerfi 22*cf5a6c84SAndroid Build Coastguard WorkerGLOBDEP="$($SED -n 's/CONFIG_\(TOYBOX_[^=]*\)=y/\1/p' "$KCONFIG_CONFIG")" 23*cf5a6c84SAndroid Build Coastguard WorkerKCONFIG_CONFIG=.singleconfig 24*cf5a6c84SAndroid Build Coastguard Worker 25*cf5a6c84SAndroid Build Coastguard Workerfor i in "$@" 26*cf5a6c84SAndroid Build Coastguard Workerdo 27*cf5a6c84SAndroid Build Coastguard Worker echo -n "$i:" 28*cf5a6c84SAndroid Build Coastguard Worker TOYFILE="$(egrep -l "TOY[(]($i)[ ,]" toys/*/*.c)" 29*cf5a6c84SAndroid Build Coastguard Worker 30*cf5a6c84SAndroid Build Coastguard Worker if [ -z "$TOYFILE" ] 31*cf5a6c84SAndroid Build Coastguard Worker then 32*cf5a6c84SAndroid Build Coastguard Worker echo "Unknown command '$i'" >&2 33*cf5a6c84SAndroid Build Coastguard Worker exit 1 34*cf5a6c84SAndroid Build Coastguard Worker fi 35*cf5a6c84SAndroid Build Coastguard Worker 36*cf5a6c84SAndroid Build Coastguard Worker make allnoconfig > /dev/null || exit 1 37*cf5a6c84SAndroid Build Coastguard Worker 38*cf5a6c84SAndroid Build Coastguard Worker # For the shell pull in MAYFORK commands from other source files as builtins. 39*cf5a6c84SAndroid Build Coastguard Worker unset DEPENDS MPDEL 40*cf5a6c84SAndroid Build Coastguard Worker if [ "$i" == sh ] 41*cf5a6c84SAndroid Build Coastguard Worker then 42*cf5a6c84SAndroid Build Coastguard Worker DEPENDS="$($SED -n 's/USE_\([^(]*\)(...TOY([^,]*,.*TOYFLAG_MAYFORK.*/\1/p' toys/*/*.c)" 43*cf5a6c84SAndroid Build Coastguard Worker else 44*cf5a6c84SAndroid Build Coastguard Worker MPDEL='s/CONFIG_TOYBOX=y/# CONFIG_TOYBOX is not set/;t' 45*cf5a6c84SAndroid Build Coastguard Worker fi 46*cf5a6c84SAndroid Build Coastguard Worker 47*cf5a6c84SAndroid Build Coastguard Worker # Enable stuff this command depends on 48*cf5a6c84SAndroid Build Coastguard Worker DEPENDS="$({ echo $DEPENDS $GLOBDEP; $SED -n "/^config *$i"'$/,/^$/{s/^[ \t]*depends on //;T;s/[!][A-Z0-9_]*//g;s/ *&& */|/g;p}' $TOYFILE;}| xargs | tr ' ' '|')" 49*cf5a6c84SAndroid Build Coastguard Worker NAME=$(echo $i | tr a-z- A-Z_) 50*cf5a6c84SAndroid Build Coastguard Worker $SED -ri -e "$MPDEL" \ 51*cf5a6c84SAndroid Build Coastguard Worker -e "s/# (CONFIG_($NAME|${NAME}_.*${DEPENDS:+|$DEPENDS})) is not set/\1=y/" \ 52*cf5a6c84SAndroid Build Coastguard Worker "$KCONFIG_CONFIG" || exit 1 53*cf5a6c84SAndroid Build Coastguard Worker 54*cf5a6c84SAndroid Build Coastguard Worker export OUTNAME="$PREFIX$i" 55*cf5a6c84SAndroid Build Coastguard Worker rm -f "$OUTNAME" && 56*cf5a6c84SAndroid Build Coastguard Worker scripts/make.sh || exit 1 57*cf5a6c84SAndroid Build Coastguard Workerdone 58