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

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