Makefile文件  |  58行  |  1.76 KB

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