LOCAL_PATH := $(call my-dir)
+common_cflags := \
+ -std=c99 \
+ -Os \
+ -Wno-char-subscripts \
+ -Wno-sign-compare \
+ -Wno-string-plus-int \
+ -Wno-uninitialized \
+ -Wno-unused-parameter \
+ -funsigned-char \
+ -ffunction-sections -fdata-sections \
+ -fno-asynchronous-unwind-tables \
+
+toybox_upstream_version := $(shell grep -o 'TOYBOX_VERSION.*\".*\"' $(LOCAL_PATH)/main.c | cut -d'"' -f2)
+toybox_sha := $(shell git -C $(LOCAL_PATH) rev-parse --short=12 HEAD 2>/dev/null)
+
+toybox_version := $(toybox_upstream_version)-$(toybox_sha)-android
+common_cflags += -DTOYBOX_VERSION='"$(toybox_version)"'
+
#
# To update:
#
-# git remote add toybox https://github.com/gfto/toybox.git
+# git remote add toybox https://github.com/landley/toybox.git
# git fetch toybox
# git merge toybox/master
# mm -j32
# # (Make any necessary Android.mk changes and test the new toybox.)
+# repo upload .
+# git push aosp HEAD:refs/for/master # Push to gerrit for review.
# git push aosp HEAD:master # Push directly, avoiding gerrit.
-# git push aosp HEAD:refs/for/master # Push to gerrit.
#
# # Now commit any necessary Android.mk changes like normal:
# repo start post-sync .
lib/dirtree.c \
lib/getmountlist.c \
lib/help.c \
+ lib/interestingtimes.c \
lib/lib.c \
+ lib/linestack.c \
lib/llist.c \
lib/net.c \
+ lib/password.c \
lib/portability.c \
lib/xwrap.c \
main.c \
toys/android/getenforce.c \
+ toys/android/getprop.c \
toys/android/load_policy.c \
+ toys/android/restorecon.c \
toys/android/runcon.c \
toys/android/setenforce.c \
+ toys/android/setprop.c \
toys/lsb/dmesg.c \
toys/lsb/hostname.c \
toys/lsb/killall.c \
toys/other/bzcat.c \
toys/other/chcon.c \
toys/other/chroot.c \
- toys/other/chvt.c \
toys/other/clear.c \
toys/other/dos2unix.c \
toys/other/fallocate.c \
+ toys/other/flock.c \
toys/other/free.c \
toys/other/freeramdisk.c \
toys/other/fsfreeze.c \
toys/other/help.c \
+ toys/other/hwclock.c \
toys/other/ifconfig.c \
toys/other/inotifyd.c \
toys/other/insmod.c \
+ toys/other/ionice.c \
toys/other/losetup.c \
toys/other/lsattr.c \
toys/other/lsmod.c \
toys/other/pmap.c \
toys/other/printenv.c \
toys/other/pwdx.c \
+ toys/other/readahead.c \
toys/other/readlink.c \
toys/other/realpath.c \
+ toys/other/reset.c \
toys/other/rev.c \
toys/other/rfkill.c \
toys/other/rmmod.c \
toys/other/stat.c \
toys/other/swapoff.c \
toys/other/swapon.c \
- toys/other/switch_root.c \
toys/other/sysctl.c \
toys/other/tac.c \
toys/other/taskset.c \
toys/other/timeout.c \
toys/other/truncate.c \
+ toys/other/uptime.c \
toys/other/usleep.c \
toys/other/vconfig.c \
toys/other/vmstat.c \
toys/other/which.c \
+ toys/other/xxd.c \
toys/other/yes.c \
+ toys/pending/arp.c \
toys/pending/dd.c \
+ toys/pending/diff.c \
toys/pending/expr.c \
- toys/pending/hwclock.c \
+ toys/pending/fdisk.c \
+ toys/pending/file.c \
+ toys/pending/ftpget.c \
+ toys/pending/host.c \
+ toys/pending/lsof.c \
toys/pending/more.c \
- toys/pending/pgrep.c \
- toys/pending/ps.c \
toys/pending/netstat.c \
+ toys/pending/resize.c \
toys/pending/route.c \
toys/pending/tar.c \
- toys/pending/top.c \
+ toys/pending/telnet.c \
+ toys/pending/test.c \
toys/pending/tr.c \
toys/pending/traceroute.c \
+ toys/pending/watch.c \
+ toys/pending/xzcat.c \
toys/posix/basename.c \
toys/posix/cal.c \
toys/posix/cat.c \
toys/posix/paste.c \
toys/posix/patch.c \
toys/posix/printf.c \
+ toys/posix/ps.c \
toys/posix/pwd.c \
toys/posix/renice.c \
toys/posix/rm.c \
toys/posix/touch.c \
toys/posix/true.c \
toys/posix/tty.c \
+ toys/posix/ulimit.c \
toys/posix/uname.c \
toys/posix/uniq.c \
toys/posix/wc.c \
- toys/posix/xargs.c \
+ toys/posix/xargs.c
-LOCAL_CFLAGS += \
- -Os \
- -Wno-char-subscripts \
- -Wno-sign-compare \
- -Wno-string-plus-int \
- -Wno-uninitialized \
- -Wno-unused-parameter \
- -funsigned-char \
- -ffunction-sections -fdata-sections \
- -fno-asynchronous-unwind-tables \
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CLANG := true
+
+# This doesn't actually prevent us from dragging in libc++ at runtime
+# because libnetd_client.so is C++.
+LOCAL_CXX_STL := none
+
+LOCAL_C_INCLUDES += bionic/libc/dns/include
-LOCAL_SHARED_LIBRARIES := libselinux
+LOCAL_MODULE := libtoybox
+
+include $(BUILD_STATIC_LIBRARY)
+
+
+# Host binary to enumerate the toys
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := scripts/install.c
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CLANG := true
+LOCAL_MODULE := toybox-instlist
+include $(BUILD_HOST_EXECUTABLE)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := main.c
+LOCAL_STATIC_LIBRARIES := libtoybox
+LOCAL_SHARED_LIBRARIES := libcutils libselinux
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CXX_STL := none
+LOCAL_CLANG := true
LOCAL_MODULE := toybox
-# dupes: dd df du ls mount renice umount
-# useless?: chvt freeramdisk fsfreeze install makedevs mkfifo nbd-client
-# partprobe pivot_root pwdx rev rfkill switch_root tty vconfig
-# prefer BSD netcat instead?: nc netcat
-# prefer efs2progs instead?: blkid chattr lsattr
+# for dumping the list of toys
+TOYBOX_INSTLIST := $(HOST_OUT_EXECUTABLES)/toybox-instlist
+LOCAL_ADDITIONAL_DEPENDENCIES := $(TOYBOX_INSTLIST)
+
+# we still want a link for ls/ps, but the toolbox version needs to
+# stick around for compatibility reasons, for now.
+TOYS_FOR_XBIN := ls ps
+
+# skip links for these toys in the system image, they already have
+# a full-blown counterpart. we still want them for the recovery
+# image though.
+TOYS_WITHOUT_LINKS := blkid traceroute6
-ALL_TOOLS := \
- acpi \
- basename \
- blockdev \
- bzcat \
- cal \
- cat \
- chcon \
- chgrp \
- chmod \
- chown \
- chroot \
- cksum \
- clear \
- comm \
- cmp \
- cp \
- cpio \
- cut \
- date \
- dirname \
- dmesg \
- dos2unix \
- echo \
- env \
- expand \
- expr \
- fallocate \
- false \
- find \
- free \
- getenforce \
- groups \
- head \
- hostname \
- hwclock \
- id \
- ifconfig \
- inotifyd \
- insmod \
- kill \
- killall \
- load_policy \
- ln \
- logname \
- losetup \
- lsmod \
- lspci \
- lsusb \
- md5sum \
- mkdir \
- mknod \
- mkswap \
- mktemp \
- modinfo \
- more \
- mountpoint \
- mv \
- netstat \
- nice \
- nl \
- nohup \
- od \
- paste \
- patch \
- pgrep \
- pidof \
- pkill \
- pmap \
- printenv \
- printf \
- pwd \
- readlink \
- realpath \
- rm \
- rmdir \
- rmmod \
- runcon \
- sed \
- seq \
- setenforce \
- setsid \
- sha1sum \
- sleep \
- sort \
- split \
- stat \
- strings \
- swapoff \
- swapon \
- sync \
- sysctl \
- tac \
- tail \
- tar \
- taskset \
- tee \
- time \
- timeout \
- touch \
- tr \
- true \
- truncate \
- uname \
- uniq \
- unix2dos \
- usleep \
- vmstat \
- wc \
- which \
- whoami \
- xargs \
- yes \
+LOCAL_POST_INSTALL_CMD := $(hide) \
+ echo "Generate Toybox links:" $$($(TOYBOX_INSTLIST)); \
+ $(TOYBOX_INSTLIST) | grep -vFx -f <(tr ' ' '\n' <<< '$(TOYS_FOR_XBIN) $(TOYS_WITHOUT_LINKS)') | xargs -I'{}' ln -sf toybox '$(TARGET_OUT_EXECUTABLES)/{}'
-# Install the symlinks.
-LOCAL_POST_INSTALL_CMD := $(hide) $(foreach t,$(ALL_TOOLS),ln -sf toybox $(TARGET_OUT)/bin/$(t);)
+include $(BUILD_EXECUTABLE)
+
+# This is used by the recovery system
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := main.c
+LOCAL_WHOLE_STATIC_LIBRARIES := libtoybox
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CFLAGS += -Dmain=toybox_driver
+LOCAL_CXX_STL := none
+LOCAL_CLANG := true
+LOCAL_MODULE := libtoybox_driver
+include $(BUILD_STATIC_LIBRARY)
+# static executable for use in limited environments
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := main.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CXX_STL := none
+LOCAL_CLANG := true
+LOCAL_UNSTRIPPED_PATH := $(PRODUCT_OUT)/symbols/utilities
+LOCAL_MODULE := toybox_static
+LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_STEM := toybox
+LOCAL_STATIC_LIBRARIES := libc libtoybox libcutils libselinux libmincrypt liblog
+LOCAL_FORCE_STATIC_EXECUTABLE := true
include $(BUILD_EXECUTABLE)