167 lines
3.4 KiB
Bash
Executable file
167 lines
3.4 KiB
Bash
Executable file
# 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=$?
|
|
|
|
# check if linker.list is empty
|
|
ALL_LINKER_LIST=`find obj -name linker.list`
|
|
for LINKER_LIST in $ALL_LINKER_LIST; do
|
|
if [ ! -s $LINKER_LIST ]; then
|
|
echo "ERROR: linker list file $LINKER_LIST isn't generated!"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# Clean everything we generated
|
|
rm -f $CLEAN_FILES
|
|
rm -rf "$PROGDIR/obj" "$PROGDIR/libs"
|
|
rm -rf jni
|
|
|
|
# Exit
|
|
exit $RET
|