xref: /aosp_15_r20/external/toybox/scripts/single.sh (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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