# This file is used to build the Bionic library with the Jam build
# tool. For info, see www.perforce.com/jam/jam.html
#

BIONIC_TOP ?= $(DOT) ;

DEBUG = 1 ;

# pattern used for automatic heade inclusion detection
HDRPATTERN = "^[ 	]*#[ 	]*include[ 	]*[<\"]([^\">]*)[\">].*$" ;


# debugging support, simply define the DEBUG variable to activate verbose output
rule Debug
{
    if $(DEBUG) {
        Echo $(1) ;
    }
}

# return all elements from $(1) that are not in $(2)
rule Filter  list : filter
{
    local result = ;
    local item ;
    for item in $(list) {
        if ! $(item) in $(filter) {
            result += $(item) ;
        }
    }
    return $(result) ;
}


# reverse a list of elements
rule Reverse  list
{
    local  result = ;
    local  item ;

    for item in $(list) {
        result = $(item) $(result) ;
    }
    return $(result) ;
}


# decompose a path into a list of elements
rule PathDecompose  dir
{
    local  result ;

    while $(dir:D)
    {
        if ! $(dir:BS) {  # for rooted paths like "/foo"
            break ;
        }
        result = $(dir:BS) $(result) ;
        dir    = $(dir:D) ;
    }
    result = $(dir) $(result) ;
    return $(result) ;
}


# simply a file path, i.e. get rid of . or .. when possible
rule _PathSimplify  dir
{
    local  result = ;
    local  dir2 d ;

    dir  = [ PathDecompose $(dir) ] ;

    # get rid of any single dot
    dir2 = ;
    for d in $(dir) {
        if $(d) = "." {
            continue ;
        }
        dir2 += $(d) ;
    }

    # get rid of .. when possible
    for d in $(dir2) {
        if $(d) = ".." && $(result) {
            result = $(result[2-]) ;
        }
        else
            result = $(d) $(result) ;
    }

    # now invert the result
    result = [ Reverse $(result) ] ;
    if ! $(result) {
        result = "." ;
    }
    return $(result:J="/") ;
}


rule PathSimplify  dirs
{
    local result ;
    local d ;
    for d in $(dirs) {
        result += [ _PathSimplify $(d) ] ;
    }
    return $(result) ;
}


# retrieve list of subdirectories
rule ListSubDirs  paths
{
    local  result  = ;
    local  entry ;
    for entry in [ Glob $(paths) : * ] {
        if ! $(entry:S) {
            result += $(entry) ;
        }
    }
    return [ PathSimplify $(result) ] ;
}


# retrieve list of sources in a given directory
rule ListSources  path
{
    return [ Glob $(path) : *.S *.c ] ;
}


# find the prebuilt directory
#
if ! $(TOP) {
    Echo "Please define TOP as the root of your device build tree" ;
    Exit ;
}

Debug "OS is" $(OS) ;
Debug "CPU is" $(CPU) ;

if $(OS) = LINUX
{
    PREBUILT = $(TOP)/prebuilt/Linux ;
}
else if $(OS) = MACOSX
{
    switch $(CPU) {
        case i386 : PREBUILT = $(TOP)/prebuilt/darwin-x86 ; break ;
        case ppc  : PREBUILT = $(TOP)/prebuilt/darwin-ppc ; break ;
        case *    : Echo "unsupported CPU" "$(CPU) !!" ;
                    Echo "Please contact digit@google.com for help" ;
                    Exit ;
    }
}
else
{
    Echo "Unsupported operating system" $(OS) ;
    Echo "Please contact digit@google.com for help" ;
    Exit ;
}

Debug "TOP is" $(TOP) ;
Debug "PREBUILT is" $(PREBUILT) ;


# check architectures and setup toolchain variables
#
SUPPORTED_ARCHS = x86 arm ;

ARCH ?= $(SUPPORTED_ARCHS) ;

if ! $(ARCH) in $(SUPPORTED_ARCHS) {
    Echo "The variable ARCH contains an unsupported value, use one or more of these instead" ;
    Echo "separated by spaces:" $(SUPPORTED_ARCHS) ;
    Exit ;
}

x86_TOOLSET_PREFIX ?= "" ;
arm_TOOLSET_PREFIX ?= $(TOP)/prebuilt/Linux/toolchain-4.1.1/bin/arm-elf- ;

for arch in $(ARCH) {
    CC_$(arch)  = $($(arch)_TOOLSET_PREFIX)gcc ;
    C++_$(arch) = $($(arch)_TOOLSET_PREFIX)g++ ;
    AR_$(arch)  = $($(arch)_TOOLSET_PREFIX)ar ;
}


# the list of arch-independent source subdirectories
BIONIC_SRC_SUBDIRS = string ;
BIONIC_x86_SUBDIRS = ;
BIONIC_arm_SUBDIRS = ;

CFLAGS   = -O0 -g -W ;



# find sources in a given list of subdirectories
rule FindSources  dirs
{
    local dir ;

    for dir in $(dirs)
    {
        local LOCAL_SRC NO_LOCAL_SRC ;

        if [ Glob $(dir) : rules.jam ] {
            include $(dir)/rules.jam ;
            if $(LOCAL_SRC) {
                _sources = $(LOCAL_SRC) ;
            }
            else {
                _sources = [ Glob $(dir) : *.S *.c ] ;
                _sources = $(_sources:BS) ;
            }
            if $(NO_LOCAL_SRC) {
                _sources = [ Filter $(_sources) : $(NO_LOCAL_SRC) ] ;
            }
            sources += $(dir)/$(_sources) ;
        }
        else
            sources += [ ListSources $(dir) ] ;
    }
}

# Compile a given object file from a source
rule Compile  object : source
{
    Depends $(object) : $(source) ;
    Depends bionic : $(object) ;
    Clean clean : $(object) ;

    MakeLocate $(object) : $(OUT) ;


    CC on $(object)       = $(CC_$(arch)) ;
    CFLAGS on $(object)   = $(CFLAGS) ;
    INCLUDES on $(object) = $(INCLUDES) ;
    DEFINES on $(object)  = $(DEFINES) ;

    HDRRULE on $(>) = HdrRule ;
    HDRSCAN on $(>) = $(HDRPATTERN) ;
    HDRSEARCH on $(>) = $(INCLUDES) ;
    HDRGRIST on $(>) = $(HDRGRIST) ;
}


actions Compile
{
    $(CC) -c -o $(1) $(CFLAGS) -I$(INCLUDES) -D$(DEFINES) $(2)
}


rule RmTemps
{
    Temporary $(2) ;
}

actions quietly updated piecemeal together RmTemps
{
    rm -f $(2)
}

actions Archive
{
    $(AR) ru $(1) $(2)
}

rule Library  library : objects
{
    local  obj ;

    if ! $(library:S) {
        library = $(library:S=.a) ;
    }
    library = $(library:G=<$(arch)>) ;

    Depends all : $(library) ;

    if ! $(library:D) {
        MakeLocate $(library) $(library)($(objects:BS)) : $(OUT) ;
    }

    Depends $(library) : $(library)($(objects:BS)) ;
    for obj in $(objects) {
        Depends $(library)($(obj:BS)) : $(obj) ;
    }

    Clean clean : $(library) ;

    AR on $(library) = $(AR_$(arch)) ;
    Archive $(library) : $(objects) ;

    RmTemps $(library) : $(objects) ;
}


rule  ProcessDir
{
    local CFLAGS   = $(CFLAGS) ;
    local DEFINES  = $(DEFINES) ;
    local INCLUDES = $(INCLUDES) ;
    local local_rules = [ Glob $(1) : rules.jam ] ;
    local source sources ;

    if $(local_rules) {
        local LOCAL_CFLAGS LOCAL_DEFINES LOCAL_INCLUDES LOCAL_SRC NO_LOCAL_SRC ;

        include $(local_rules) ;
        CFLAGS   += $(LOCAL_CFLAGS) ;
        DEFINES  += $(LOCAL_DEFINES) ;
        INCLUDES += $(LOCAL_INCLUDES) ;

        if $(LOCAL_SRC) {
            sources = $(LOCAL_SRC) ;
        }
        else {
            sources = [ Glob $(1) : *.S *.c ] ;
            sources = $(sources:BS) ;
        }

        if $(NO_LOCAL_SRC) {
            sources = [ Filter $(sources) : $(NO_LOCAL_SRC) ] ;
        }

        sources = $(1)/$(sources) ;
    }
    else
        sources = [ Glob $(1) : *.S *.c ] ;

    for source in $(sources) {
        local name = $(source:B) ;

        if $(source:S) = ".S" {
            # record the list of assembler sources
            ASSEMBLER_SOURCES += $(name) ;
        }
        else if $(source:S) = ".c" && $(name) in $(ASSEMBLER_SOURCES) {
            # skip C source file if corresponding assembler exists
            continue ;
        }

        objname = <$(arch)>$(name).o  ;

        Compile $(objname) : $(source) ;
        ALL_OBJECTS += $(objname) ;
    }
}

rule ProcessDirs
{
    local  dir ;
    for dir in $(1) {
        ProcessDir $(dir) ;
    }
}

INCLUDES_x86 = /usr/src/linux/include ;

INCLUDES_arm = ../kernel_headers
               include/arch/arm
               include/bits32
               ;

INCLUDES = include stdio string stdlib .
           ../msun/include
           ;

DEFINES  = ANDROID_CHANGES
           USE_LOCKS
           REALLOC_ZERO_BYTES_FREES
           _LIBC=1
           SOFTFLOAT
           FLOATING_POINT
           NEED_PSELECT=1
           ANDROID
           ;

CFLAGS_x86 = ;


for arch in $(ARCH)
{
    local ARCH_DIR = $(BIONIC_TOP)/arch-$(arch) ;
    local INCLUDES = $(INCLUDES_$(arch)) $(ARCH_DIR)/include $(INCLUDES) ;
    local DEFINES  = $(DEFINES_$(arch)) $(DEFINES) ARCH=$(arch)  ;
    local CFLAGS   = $(CFLAGS) $(CFLAGS_$(arch)) ;
    local OUT      = out/$(arch) ;
    local ASSEMBLER_SOURCES ALL_OBJECTS ;

    ProcessDirs [ ListSubDirs $(ARCH_DIR) ] ;
    ProcessDirs stdlib stdio unistd string tzcode inet ;
    ProcessDirs [ ListSubDirs netbsd ] ;
    ProcessDirs bionic ;

    Library bionic : $(ALL_OBJECTS) ;
}

BIONIC_SEARCH = $(BIONIC_TOP)/include ;



# /HdrRule source : headers ;
#
# Arranges the proper dependencies when the file _source_ includes the files
# _headers_ through the #include C preprocessor directive
#
# this rule is not intendend to be called explicitely. It is called
# automatically during header scanning on sources handled by the @Object
# rule (e.g. sources in @Main or @Library rules)
#
rule HdrRule
{
    # HdrRule source : headers ;

    # N.B.  This rule is called during binding, potentially after
    # the fate of many targets has been determined, and must be
    # used with caution: don't add dependencies to unrelated
    # targets, and don't set variables on $(<).

    # Tell Jam that anything depending on $(<) also depends on $(>),
    # set SEARCH so Jam can find the headers, but then say we don't
    # care if we can't actually find the headers (they may have been
    # within ifdefs),

    local s = $(>:G=$(HDRGRIST:E)) ;

    Includes $(<) : $(s) ;
    SEARCH on $(s) = $(HDRSEARCH) ;
    NoCare $(s) ;

    # Propagate on $(<) to $(>)

    HDRSEARCH on $(s) = $(HDRSEARCH) ;
    HDRSCAN on $(s) = $(HDRSCAN) ;
    HDRRULE on $(s) = $(HDRRULE) ;
    HDRGRIST on $(s) = $(HDRGRIST) ;
}


