| # 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) |