# Special script used to check that LOCAL_SHORT_COMMANDS works
# correctly even when using a very large number of source files
# when building a static or shared library.
#
# We're going to auto-generate all the files we need in a
# temporary directory, because that's how we roll.
#

PROGDIR=$(dirname $0)
PROGDIR=$(cd "$PROGDIR" && pwd)

# TODO: Increment this to 1000 for long test runs. For the simple unit test
#        suite, keep this just over 100
#
COUNT=110

# Generate all our source files
NUM=0

SRCDIR=$PROGDIR/jni
rm -rf "$SRCDIR" && mkdir -p "$SRCDIR"
if [ $? != 0 ]; then
    echo "ERROR: Could not create temporary source directory: $SRCDIR"
    exit 1
fi

CLEAN_FILES=

generate_source_files ()
{
    # Generate all temporary source files we need
    local NUM=0
    while [ $NUM -lt $COUNT ]; do
        SRCFILE=$SRCDIR/foo$NUM.c
    cat > $SRCFILE <<EOF
int foo$NUM (int x)
{
    return x + 1;
}
EOF
        NUM=$(( $NUM + 1 ))
        CLEAN_FILES=$CLEAN_FILES" $SRCFILE"
    done
}

generate_main_file ()
{
    cat > $SRCDIR/main.c <<EOF
#include <stdio.h>
EOF
    NUM=0
    while [ $NUM -lt $COUNT ]; do
        cat >> $SRCDIR/main.c <<EOF
extern int foo$NUM (int);
EOF
        NUM=$(( $NUM + 1 ))
    done
    cat >> $SRCDIR/main.c <<EOF
int main(void)
{
    int x = 0;
EOF
    NUM=0
    while [ $NUM -lt $COUNT ]; do
        cat >> $SRCDIR/main.c <<EOF
    x = foo$NUM(x);
EOF
        NUM=$(( $NUM + 1 ))
    done
cat >> $SRCDIR/main.c <<EOF
    return 0;
}
EOF
    CLEAN_FILES=$CLEAN_FILES" $SRCDIR/main.c"
}

generate_build_file ()
{
    local NUM

    # Generate the Android.mk
    cat > $SRCDIR/Android.mk <<EOF
# Auto-generated - do not edit
LOCAL_PATH := \$(call my-dir)
EOF

    # First, build a huge static library with all the files
    cat >> $SRCDIR/Android.mk <<EOF
include \$(CLEAR_VARS)
LOCAL_MODULE := libfoo_big
EOF

    NUM=0
    while [ $NUM -lt $COUNT ]; do
        cat >> $SRCDIR/Android.mk <<EOF
LOCAL_SRC_FILES += foo$NUM.c
EOF
        NUM=$(( $NUM + 1 ))
    done

    cat >> $SRCDIR/Android.mk <<EOF
LOCAL_SHORT_COMMANDS := true
include \$(BUILD_SHARED_LIBRARY)
EOF

    # Second, generate a large number of static libraries
    # Then an executable that use them all
    NUM=0
    while [ $NUM -lt $COUNT ]; do
        cat >> $SRCDIR/Android.mk <<EOF
include \$(CLEAR_VARS)
LOCAL_MODULE := foo$NUM
LOCAL_SRC_FILES := foo$NUM.c
include \$(BUILD_STATIC_LIBRARY)
EOF
        NUM=$(( $NUM + 1 ))
    done

        cat >> $SRCDIR/Android.mk <<EOF
include \$(CLEAR_VARS)
LOCAL_MODULE := test_linker_options_list
LOCAL_SRC_FILES := main.c
EOF

    NUM=0
    while [ $NUM -lt $COUNT ]; do
        cat >> $SRCDIR/Android.mk <<EOF
LOCAL_WHOLE_STATIC_LIBRARIES += foo$NUM
EOF
        NUM=$(( $NUM + 1 ))
    done

    cat >> $SRCDIR/Android.mk <<EOF
#LOCAL_SHORT_COMMANDS := true
include \$(BUILD_EXECUTABLE)
EOF
    CLEAN_FILES=$CLEAN_FILES" $SRCDIR/Android.mk"
}

generate_source_files && 
generate_main_file &&
generate_build_file
if [ $? != 0 ]; then
    echo "ERROR: Could not generate files for this test!"
    exit 1
fi

# Now run the build
$NDK/ndk-build -C "$PROGDIR" "$@"
RET=$?

# Clean everything we generated
rm -f $CLEAN_FILES
rm -rf "$PROGDIR/obj" "$PROGDIR/libs"
rm -rf jni

# Exit
exit $RET
