Home | History | Annotate | Download | only in jni
      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