# Used to check that ndk-build does a proper topological sort of
# module dependencies.
#
# Here's how this works:
#
# 1/ First, define a static library module named 'foo' with two source
# files (foo.c and foo2.c), which implement two functions
# (foo and foo2 respectively).
#
# 2/ Second, define another static library named 'bar' that depends on
# module 'foo' but only uses the 'foo2' function from it.
#
# 3/ Third, define an executable that depends on both 'foo' and 'bar',
# but only calls the 'foo' and 'bar' function (i.e. not foo2).
# Order is important, i.e. it should have a line that says:
#
# LOCAL_STATIC_LIBRARIES := foo bar
#
# With NDK r8b and earlier, the final link command for the executable
# will be like:
#
# <linker> -o <executable> main.o libfoo.a libbar.a
#
# Due to the way the linker works, this will fail. More specifically,
# when trying to add bar.o to the final image, it will not be able to
# find an object file that contains foo2(), because the search starts
# _after_ libbar.a on the command-line.
#
# With a NDK that implements correct topological dependency ordering,
# the link line should be instead:
#
# <linker> -o <executable> main.o libbar.a libfoo.a
#
# Which will link, and work, correctly.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := \
foo.c \
foo2.c
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := test_topological_sort
LOCAL_SRC_FILES := main.c
# IMPORTANT: foo must appear before bar here.
LOCAL_STATIC_LIBRARIES := foo bar
include $(BUILD_EXECUTABLE)