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

if env['gles_compute'] and env['os'] != 'android':
    examples_env.Append(LIBPATH = ["#build/%s/opengles-3.1/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_graph_a, 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"])
            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':
            examples_env.Append(CPPPATH = ["#opengles-3.1/include", "#opengles-3.1/mali_include"])
            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)
