# Copyright (c) 2017 ARM Limited.
#
# SPDX-License-Identifier: MIT
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import SCons
import os.path

Import('env')

if env['opencl']:
    Import('opencl')

if env['gles_compute'] and env['os'] != 'android':
    Import('egl')
    Import('glesv2')

examples_env = env.Clone()

examples_env.Append(CPPPATH = ["#"])
examples_env.Append(LIBPATH = ["#build/%s/opencl-1.2-stubs" % env['build_dir']])

# Build examples
utils = examples_env.Object("../utils/Utils.cpp")

if env['os'] in ['android', 'bare_metal'] or env['standalone']:
    Import('arm_compute_a')
    Import('arm_compute_core_a')
    arm_compute_libs = [ arm_compute_a, arm_compute_core_a ]
    arm_compute_dependency = arm_compute_a
else:
    Import('arm_compute_so')
    arm_compute_libs = ["arm_compute", "arm_compute_core"]
    arm_compute_dependency = arm_compute_so

if env['opencl'] and env['neon']:
    for file in Glob("./neoncl_*.cpp"):
        example = os.path.basename(os.path.splitext(str(file))[0])
        prog = examples_env.Program(example, ["{}.cpp".format(example), utils], CPPDEFINES=['ARM_COMPUTE_CL'], LIBS = arm_compute_libs +["OpenCL"])
        Depends(prog, [arm_compute_dependency, opencl])
        alias = examples_env.Alias(example, prog)
        Default(alias)
    if env['os'] == 'android':
        Import('arm_compute_graph_a')
        Import('arm_compute_core_a')
        Import('arm_compute_a')
        arm_compute_graph_libs = [ arm_compute_a, arm_compute_core_a, "OpenCL"]
        graph_dependency = arm_compute_graph_a
    else:
        Import('arm_compute_graph_so')
        arm_compute_graph_libs = ["arm_compute_graph", "arm_compute", "arm_compute_core"]
        graph_dependency = arm_compute_graph_so

    graph_utils = examples_env.Object("../utils/GraphUtils.cpp")
    for file in Glob("./graph_*.cpp"):
        example = os.path.basename(os.path.splitext(str(file))[0])
        prog = None
        if env['os'] == 'android':
            prog = examples_env.Program(example, ["{}.cpp".format(example), utils, graph_utils], LIBS = arm_compute_graph_libs + ["OpenCL"], LINKFLAGS=examples_env["LINKFLAGS"]+['-Wl,--whole-archive',graph_dependency,'-Wl,--no-whole-archive'])
            Depends(prog, [graph_dependency, opencl])
        else:
            #-Wl,--allow-shlib-undefined: Ignore dependencies of dependencies
            prog = examples_env.Program(example, ["{}.cpp".format(example), utils, graph_utils], LIBS = arm_compute_graph_libs, LINKFLAGS=examples_env["LINKFLAGS"]+['-Wl,--allow-shlib-undefined'] )
            Depends(prog, graph_dependency)
        alias = examples_env.Alias(example, prog)
        Default(alias)

if env['opencl']:
    for file in Glob("./cl_*.cpp"):
        example = os.path.basename(os.path.splitext(str(file))[0])
        prog = examples_env.Program(example, ["{}.cpp".format(example), utils], CPPDEFINES=['ARM_COMPUTE_CL'], LIBS = arm_compute_libs +["OpenCL"])
        Depends(prog, [arm_compute_dependency, opencl])
        alias = examples_env.Alias(example, prog)
        Default(alias)

if env['neon']:
    for file in Glob("./neon_*.cpp"):
        example = os.path.basename(os.path.splitext(str(file))[0])
        prog = examples_env.Program(example, ["{}.cpp".format(example), utils], LIBS = arm_compute_libs)
        Depends(prog, arm_compute_dependency)
        alias = examples_env.Alias(example, prog)
        Default(alias)

if env['gles_compute']:
    for file in Glob("./gc_*.cpp"):
        example = os.path.basename(os.path.splitext(str(file))[0])
        if env['os'] != 'android':
            prog = examples_env.Program(example, ["{}.cpp".format(example), utils], CPPDEFINES=['ARM_COMPUTE_GC'], LIBS = [arm_compute_libs, "EGL", "GLESv2"])
            Depends(prog, [arm_compute_dependency, egl, glesv2])
        else:
            if env['arch'] != 'armv7a':
                prog = examples_env.Program(example, ["{}.cpp".format(example), utils], CPPDEFINES=['ARM_COMPUTE_GC'], LIBS = [arm_compute_libs, "EGL", "GLESv3"])
            else:
                prog = examples_env.Program(example, ["{}.cpp".format(example), utils], CPPDEFINES=['ARM_COMPUTE_GC'], LIBS = [arm_compute_libs, "EGL", "GLESv2"])
            Depends(prog, [arm_compute_dependency])
        alias = examples_env.Alias(example, prog)
        Default(alias)
