1 # Used to check that ndk-build does a proper topological sort of 2 # module dependencies. 3 # 4 # Here's how this works: 5 # 6 # 1/ First, define a static library module named 'foo' with two source 7 # files (foo.c and foo2.c), which implement two functions 8 # (foo and foo2 respectively). 9 # 10 # 2/ Second, define another static library named 'bar' that depends on 11 # module 'foo' but only uses the 'foo2' function from it. 12 # 13 # 3/ Third, define an executable that depends on both 'foo' and 'bar', 14 # but only calls the 'foo' and 'bar' function (i.e. not foo2). 15 # Order is important, i.e. it should have a line that says: 16 # 17 # LOCAL_STATIC_LIBRARIES := foo bar 18 # 19 # With NDK r8b and earlier, the final link command for the executable 20 # will be like: 21 # 22 # <linker> -o <executable> main.o libfoo.a libbar.a 23 # 24 # Due to the way the linker works, this will fail. More specifically, 25 # when trying to add bar.o to the final image, it will not be able to 26 # find an object file that contains foo2(), because the search starts 27 # _after_ libbar.a on the command-line. 28 # 29 # With a NDK that implements correct topological dependency ordering, 30 # the link line should be instead: 31 # 32 # <linker> -o <executable> main.o libbar.a libfoo.a 33 # 34 # Which will link, and work, correctly. 35 # 36 37 LOCAL_PATH := $(call my-dir) 38 39 include $(CLEAR_VARS) 40 LOCAL_MODULE := foo 41 LOCAL_SRC_FILES := \ 42 foo.c \ 43 foo2.c 44 include $(BUILD_STATIC_LIBRARY) 45 46 include $(CLEAR_VARS) 47 LOCAL_MODULE := bar 48 LOCAL_SRC_FILES := bar.c 49 LOCAL_STATIC_LIBRARIES := foo 50 include $(BUILD_STATIC_LIBRARY) 51 52 include $(CLEAR_VARS) 53 LOCAL_MODULE := test_topological_sort 54 LOCAL_SRC_FILES := main.c 55 # IMPORTANT: foo must appear before bar here. 56 LOCAL_STATIC_LIBRARIES := foo bar 57 include $(BUILD_EXECUTABLE) 58