aboutsummaryrefslogtreecommitdiff
path: root/scripts/individual
blob: 1463e0fc48ba8802aaff3e0e17cc974e68b047b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/bin/sh

# Compile individual versions of each busybox applet.

if [ $# -eq 0 ]
then

# Clear out the build directory.  (Make clean should do this instead of here.)

rm -rf build
mkdir build

# Make our prerequisites.

make busybox.links include/bb_config.h

# Adding "libbb/libbb.a" to the previous line doesn't work, nor does going
# "make libbb.a" in the libb directory.  The busybox makefile has layers and
# layers of overcomplicated brokenness...

cd libbb
make
cd ..

# Same problem.

cd archival/libunarchive
make
cd ../..

# And again

cd coreutils/libcoreutils
make
cd ../..

# Sensing a pattern here?

#cd networking/libiproute
#make
#cd ../..

fi

# About 3/5 of the applets build from one .c file (with the same name as the
# corresponding applet), and all it needs to link against.  However, to build
# them all we need more than that.

# Figure out which applets need extra libraries added to their command line.

function substithing()
{
  if [ "${1/ $3 //}" != "$1" ]
  then
    echo $2
  fi
}

function extra_libraries()
{
  # gzip needs gunzip.c (when gunzip is enabled, anyway).
  substithing " gzip " "archival/gunzip.c archival/uncompress.c" "$1"

  # init needs init_shared.c
  substithing " init " "init/init_shared.c" "$1"

  # ifconfig needs interface.c
  substithing " ifconfig " "networking/interface.c" "$1"

  # Applets that need libunarchive.a
  substithing " ar bunzip2 unlzma cpio dpkg gunzip rpm2cpio rpm tar uncompress unzip dpkg_deb gzip " "archival/libunarchive/libunarchive.a" "$1"

  # Applets that need libcoreutils.a
  substithing " cp mv " "coreutils/libcoreutils/libcoreutils.a" "$1"

  # Applets that need libiproute.a
  substithing " ip " "networking/libiproute/libiproute.a" "$1"

  # What needs -libm?
  substithing " awk dc " "-lm" "$1"

  # What needs -lcrypt?
  substithing " httpd vlock " "-lcrypt" "$1"
}

# Query applets.h to figure out which applets need special treatment

strange_names=`sed -rn -e 's/\#.*//' -e 's/.*APPLET_NOUSAGE\(([^,]*),([^,]*),.*/\1 \2/p' -e 's/.*APPLET_ODDNAME\(([^,]*),([^,]*),.*, *([^)]*).*/\1 \2@\3/p' include/applets.h`

function bonkname()
{
  while [ $# -gt 0 ]
  do
    if [ "$APPLET" == "$1" ]
    then
      APPFILT="${2/@*/}"
      if [ "${APPFILT}" == "$2" ]
      then
        HELPNAME='"nousage\n"'   # These should be _fixed_.
      else
        HELPNAME="${2/*@/}"_full_usage
      fi
      break
    fi
    shift 2
  done
#echo APPLET=${APPLET} APPFILT=${APPFILT} HELPNAME=${HELPNAME} 2=${2}
}

# Iterate through every name in busybox.links

function buildit ()
{
  export APPLET="$1"
  export APPFILT=${APPLET}
  export HELPNAME=${APPLET}_full_usage

  bonkname $strange_names

  j=`find archival console-tools coreutils debianutils editors findutils init loginutils miscutils modutils networking procps shell sysklogd util-linux -name "${APPFILT}.c"`
  if [ -z "$j" ]
  then
    echo no file for $APPLET
  else
    echo "Building $APPLET"
    gcc -Os -o build/$APPLET applets/individual.c $j \
	`extra_libraries $APPFILT` libbb/libbb.a -Iinclude \
	-DBUILD_INDIVIDUAL \
	'-Drun_applet_by_name(...)' '-Dfind_applet_by_name(...)=0' \
	-DAPPLET_main=${APPFILT}_main -DAPPLET_full_usage=${HELPNAME}
    if [ $? -ne 0 ];
    then
      echo "Failed $APPLET"
    fi
  fi
}

if [ $# -eq 0 ]
then
  for APPLET in `sed 's .*/  ' busybox.links`
  do
    buildit "$APPLET"
  done
else
  buildit "$1"
fi


strip build/*