TWRP_TOOLBOX_PATH := $(call my-dir) LOCAL_PATH := system/core/toolbox include $(CLEAR_VARS) OUR_TOOLS := ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) OUR_TOOLS := \ start \ stop endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) OUR_TOOLS += \ getprop \ setprop endif # If busybox does not have SELinux support, provide these tools with toolbox. # Note that RECOVERY_BUSYBOX_TOOLS will be empty if TW_USE_TOOLBOX == true. ifeq ($(TWHAVE_SELINUX), true) TOOLS_FOR_SELINUX := \ ls ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) TOOLS_FOR_SELINUX += \ load_policy \ getenforce \ chcon \ restorecon \ runcon \ getsebool \ setsebool endif OUR_TOOLS += $(filter-out $(RECOVERY_BUSYBOX_TOOLS), $(TOOLS_FOR_SELINUX)) # toolbox setenforce is used during init, so it needs to be included here # symlink is omitted at the very end if busybox already provides this ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) OUR_TOOLS += setenforce endif endif ifeq ($(TW_USE_TOOLBOX), true) ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0) # These are the only toolbox tools in M. The rest are now in toybox. BSD_TOOLS := \ dd \ du \ OUR_TOOLS := \ iftop \ ioctl \ log \ nandread \ newfs_msdos \ ps \ prlimit \ sendevent \ start \ stop \ top \ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 25; echo $$?),0) OUR_TOOLS += \ df \ ionice \ ls \ lsof \ mount \ renice \ uptime \ watchprops endif else ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22)) OUR_TOOLS += \ mknod \ nohup BSD_TOOLS := \ cat \ chown \ cp \ dd \ du \ grep \ kill \ ln \ mv \ printenv \ rm \ rmdir \ sleep \ sync else OUR_TOOLS += \ cat \ chown \ dd \ du \ kill \ ln \ mv \ printenv \ rm \ rmdir \ setconsole \ sleep \ sync endif OUR_TOOLS += \ chmod \ clear \ cmp \ date \ df \ dmesg \ getevent \ hd \ id \ ifconfig \ iftop \ insmod \ ioctl \ ionice \ log \ lsmod \ lsof \ md5 \ mkdir \ mkswap \ mount \ nandread \ netstat \ newfs_msdos \ notify \ ps \ readlink \ renice \ rmmod \ route \ schedtop \ sendevent \ smd \ swapoff \ swapon \ top \ touch \ umount \ uptime \ vmstat \ watchprops \ wipe ifneq ($(TWHAVE_SELINUX), true) OUR_TOOLS += ls endif endif endif ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22)) ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT))) OUR_TOOLS += r endif endif LOCAL_SRC_FILES := \ toolbox.c \ $(patsubst %,%.c,$(OUR_TOOLS)) ifneq ($(wildcard system/core/toolbox/dynarray.c),) LOCAL_SRC_FILES += dynarray.c endif ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22)) LOCAL_SRC_FILES += \ pwcache.c \ upstream-netbsd/lib/libc/gen/getbsize.c \ upstream-netbsd/lib/libc/gen/humanize_number.c \ upstream-netbsd/lib/libc/stdlib/strsuftoll.c \ upstream-netbsd/lib/libc/string/swab.c \ upstream-netbsd/lib/libutil/raise_default_signal.c endif ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22 23)) LOCAL_CFLAGS += \ -std=gnu99 \ -Werror -Wno-unused-parameter \ -I$(LOCAL_PATH)/upstream-netbsd/include \ -include bsd-compatibility.h endif ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22)) LOCAL_C_INCLUDES += external/openssl/include else LOCAL_C_INCLUDES += bionic/libc/bionic endif LOCAL_SHARED_LIBRARIES += libcutils ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22)) ifeq ($(TW_USE_TOOLBOX), true) LOCAL_SHARED_LIBRARIES += libcrypto endif else LOCAL_SHARED_LIBRARIES += \ libc \ liblog endif ifeq ($(TWHAVE_SELINUX), true) LOCAL_SHARED_LIBRARIES += libselinux endif ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22 23)) # libusbhost is only used by lsusb, and that isn't usually included in toolbox. # The linker strips out all the unused library code in the normal case. LOCAL_STATIC_LIBRARIES := libusbhost LOCAL_WHOLE_STATIC_LIBRARIES := $(patsubst %,libtoolbox_%,$(BSD_TOOLS)) endif ifneq (,$(filter $(PLATFORM_SDK_VERSION), 23 24)) # Rule to make getprop and setprop in M trees where toybox normally # provides these tools. Toybox does not allow for easy dynamic # configuration, so we would have to include the entire toybox binary # which takes up more space than is necessary so long as we are still # including busybox. LOCAL_SRC_FILES += \ ../../../$(TWRP_TOOLBOX_PATH)/getprop.c \ ../../../$(TWRP_TOOLBOX_PATH)/setprop.c OUR_TOOLS += getprop setprop ifneq ($(TW_USE_TOOLBOX), true) LOCAL_SRC_FILES += ../../../$(TWRP_TOOLBOX_PATH)/ls.c endif endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0) # Rule for making start and stop in N trees LOCAL_SRC_FILES += \ ../../../$(TWRP_TOOLBOX_PATH)/start.c \ ../../../$(TWRP_TOOLBOX_PATH)/stop.c OUR_TOOLS += start stop endif LOCAL_MODULE := toolbox_recovery LOCAL_MODULE_STEM := toolbox LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_MODULE_TAGS := optional # Including this will define $(intermediates) below include $(BUILD_EXECUTABLE) $(LOCAL_PATH)/toolbox.c: $(intermediates)/tools.h ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22 23)) ALL_TOOLS := $(BSD_TOOLS) $(OUR_TOOLS) else ALL_TOOLS := $(OUR_TOOLS) endif TOOLS_H := $(intermediates)/tools.h $(TOOLS_H): PRIVATE_TOOLS := $(ALL_TOOLS) $(TOOLS_H): PRIVATE_CUSTOM_TOOL = echo "/* file generated automatically */" > $@ ; for t in $(PRIVATE_TOOLS) ; do echo "TOOL($$t)" >> $@ ; done $(TOOLS_H): $(LOCAL_PATH)/Android.mk $(TOOLS_H): $(transform-generated-source) ifeq ($(TWHAVE_SELINUX), true) # toolbox setenforce is used during init in non-symlink form, so it was # required to be included as part of the suite above. if busybox already # provides setenforce, we can omit the toolbox symlink TEMP_TOOLS := $(filter-out $(RECOVERY_BUSYBOX_TOOLS), $(ALL_TOOLS)) ALL_TOOLS := $(TEMP_TOOLS) endif # Make /sbin/toolbox launchers for each tool SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/,$(ALL_TOOLS)) $(SYMLINKS): TOOLBOX_BINARY := $(LOCAL_MODULE_STEM) $(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk @echo "Symlink: $@ -> $(TOOLBOX_BINARY)" @mkdir -p $(dir $@) @rm -rf $@ $(hide) ln -sf $(TOOLBOX_BINARY) $@ include $(CLEAR_VARS) LOCAL_MODULE := toolbox_symlinks LOCAL_MODULE_TAGS := optional LOCAL_ADDITIONAL_DEPENDENCIES := $(SYMLINKS) include $(BUILD_PHONY_PACKAGE) ifneq (,$(filter $(PLATFORM_SDK_VERSION),16 17 18)) # Only needed if the build system lacks support for LOCAL_ADDITIONAL_DEPENDENCIES ALL_DEFAULT_INSTALLED_MODULES += $(SYMLINKS) ALL_MODULES.$(LOCAL_MODULE).INSTALLED := \ $(ALL_MODULES.$(LOCAL_MODULE).INSTALLED) $(SYMLINKS) endif SYMLINKS := ALL_TOOLS := BSD_TOOLS := OUR_TOOLS := TEMP_TOOLS := TOOLS_FOR_SELINUX :=