# 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]
        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 = examples_env.Program(example, ["{}.cpp".format(example), utils, graph_utils], CPPDEFINES=['ARM_COMPUTE_CL'], LIBS = arm_compute_graph_libs + ["OpenCL"])
        Depends(prog, [graph_dependency, opencl])
        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)
