LOCAL_PATH := $(call my-dir)
-
-# /system/etc/mkshrc
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := mkshrc
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT)/etc
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-include $(BUILD_PREBUILT)
-
-
-# /system/bin/sh
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := sh
-LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
-
-# mksh source files
-LOCAL_SRC_FILES := \
- src/lalloc.c src/edit.c src/eval.c src/exec.c \
- src/expr.c src/funcs.c src/histrap.c src/jobs.c \
- src/lex.c src/main.c src/misc.c src/shf.c \
- src/syn.c src/tree.c src/var.c
-
-LOCAL_SYSTEM_SHARED_LIBRARIES := libc
-
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
-
-# Additional flags first...
-LOCAL_CFLAGS += \
- -DMKSH_DEFAULT_PROFILEDIR=\"/system/etc\" \
- -DMKSHRC_PATH=\"/system/etc/mkshrc\" \
- -DMKSH_DEFAULT_EXECSHELL=\"/system/bin/sh\" \
- -DMKSH_DEFAULT_TMPDIR=\"/data/local\" \
-
# ...then from Makefrag.inc: CFLAGS...
-LOCAL_CFLAGS += \
+common_cflags += \
-Wno-deprecated-declarations \
-fno-asynchronous-unwind-tables \
-fno-strict-aliasing \
-fstack-protector -fwrapv \
# ...and CPPFLAGS.
-LOCAL_CFLAGS += \
+common_cflags += \
-DDEBUG_LEAKS -DMKSH_ASSUME_UTF8 -DMKSH_CONSERVATIVE_FDS \
-DMKSH_DONT_EMIT_IDSTRING -DMKSH_NOPWNAM -DMKSH_BUILDSH \
-D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EAGAIN \
-DHAVE_SYS_ERRLIST_DECL=0 -DHAVE_SYS_SIGLIST_DECL=1 \
-DHAVE_PERSISTENT_HISTORY=0 -DMKSH_BUILD_R=521
+
+# /system/etc/mkshrc
+include $(CLEAR_VARS)
+LOCAL_MODULE := mkshrc
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT)/etc
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
+
+
+# build a static library first
+include $(CLEAR_VARS)
+LOCAL_MODULE := libmksh
+LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
+
+# mksh source files
+LOCAL_SRC_FILES := \
+ src/lalloc.c src/edit.c src/eval.c src/exec.c \
+ src/expr.c src/funcs.c src/histrap.c src/jobs.c \
+ src/lex.c src/misc.c src/shf.c \
+ src/syn.c src/tree.c src/var.c
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CLANG := true
+include $(BUILD_STATIC_LIBRARY)
+
+
+# /system/bin/sh
+include $(CLEAR_VARS)
+LOCAL_MODULE := sh
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := src/main.c
+LOCAL_STATIC_LIBRARIES := libmksh
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CFLAGS += \
+ -DMKSH_DEFAULT_PROFILEDIR=\"/system/etc\" \
+ -DMKSHRC_PATH=\"/system/etc/mkshrc\" \
+ -DMKSH_DEFAULT_EXECSHELL=\"/system/bin/sh\" \
+ -DMKSH_DEFAULT_TMPDIR=\"/data/local\"
+LOCAL_CLANG := true
include $(BUILD_EXECUTABLE)
+
+# recovery shell: /sbin/sh
+# this is built into a single-call binary
+include $(CLEAR_VARS)
+LOCAL_MODULE := libmksh_static
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := src/main.c
+LOCAL_WHOLE_STATIC_LIBRARIES := libmksh
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CFLAGS += -Dmain=mksh_main
+LOCAL_CFLAGS += \
+ -DMKSH_DEFAULT_PROFILEDIR=\"/etc\" \
+ -DMKSHRC_PATH=\"/etc/mkshrc\" \
+ -DMKSH_DEFAULT_EXECSHELL=\"/sbin/sh\" \
+ -DMKSH_DEFAULT_TMPDIR=\"/tmp\"
+LOCAL_CLANG := true
+include $(BUILD_STATIC_LIBRARY)