1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3 4# Copyright (c) 2017-2022 Arm Limited. 5# 6# SPDX-License-Identifier: MIT 7# 8# Permission is hereby granted, free of charge, to any person obtaining a copy 9# of this software and associated documentation files (the "Software"), to 10# deal in the Software without restriction, including without limitation the 11# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 12# sell copies of the Software, and to permit persons to whom the Software is 13# furnished to do so, subject to the following conditions: 14# 15# The above copyright notice and this permission notice shall be included in all 16# copies or substantial portions of the Software. 17# 18# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24# SOFTWARE. 25import SCons 26import os.path 27 28Import('env') 29Import('install_bin') 30 31examples_env = env.Clone() 32 33examples_env.Append(CPPPATH = ["#"]) 34 35# Build examples 36utils = examples_env.Object("../utils/Utils.cpp") 37 38if env['os'] in ['android', 'macos', 'bare_metal'] or env['standalone']: 39 Import('arm_compute_graph_a') 40 Import('arm_compute_a') 41 Import('arm_compute_core_a') 42 arm_compute_libs = [ arm_compute_a, arm_compute_core_a ] 43 arm_compute_graph_libs = arm_compute_libs # The graph library needs to be linked separately with --whole-archive 44 arm_compute_dependency = arm_compute_a 45 graph_dependency = [arm_compute_graph_a] 46else: 47 Import('arm_compute_graph_so') 48 Import('arm_compute_so') 49 arm_compute_libs = ["arm_compute", "arm_compute_core"] 50 arm_compute_graph_libs = [ "arm_compute_graph" ] + arm_compute_libs 51 arm_compute_dependency = arm_compute_so 52 graph_dependency = [arm_compute_graph_so] 53 54extra_link_flags = [] 55if env['os'] != 'bare_metal': 56 extra_link_flags += ['-fstack-protector-strong'] 57 58load_whole_archive = '-Wl,--whole-archive' 59noload_whole_archive = '-Wl,--no-whole-archive' 60if 'macos' in examples_env['os']: 61 load_whole_archive = '-Wl,-force_load' 62 noload_whole_archive = '-Wl,-noall_load' 63 64# Build graph examples 65graph_utils = examples_env.Object("../utils/GraphUtils.cpp") 66graph_utils += examples_env.Object("../utils/CommonGraphOptions.cpp") 67examples_libs = examples_env.get("LIBS",[]) 68for file in Glob("./graph_*.cpp"): 69 example = os.path.basename(os.path.splitext(str(file))[0]) 70 prog = None 71 if env['os'] in ['android', 'macos', 'bare_metal'] or env['standalone']: 72 prog = examples_env.Program(example, ["{}.cpp".format(example), utils, graph_utils], LIBS = examples_libs + arm_compute_graph_libs, LINKFLAGS=examples_env["LINKFLAGS"]+[load_whole_archive, graph_dependency, noload_whole_archive] + extra_link_flags) 73 Depends(prog, graph_dependency) 74 prog = install_bin(prog) 75 else: 76 #-Wl,--allow-shlib-undefined: Ignore dependencies of dependencies 77 prog = examples_env.Program(example, ["{}.cpp".format(example), utils, graph_utils], LIBS = examples_libs + arm_compute_graph_libs, LINKFLAGS=examples_env["LINKFLAGS"]+['-Wl,--allow-shlib-undefined'] ) 78 Depends(prog, graph_dependency) 79 prog = install_bin(prog) 80 alias = examples_env.Alias(example, prog) 81 Default(alias) 82 83if env['opencl'] and env['neon']: 84 examples_env.Append(CPPDEFINES = ['ARM_COMPUTE_CL']) 85 for file in Glob("./neoncl_*.cpp"): 86 example = os.path.basename(os.path.splitext(str(file))[0]) 87 prog = examples_env.Program(example, ["{}.cpp".format(example), utils], LIBS = examples_libs + arm_compute_libs) 88 Depends(prog, arm_compute_dependency) 89 prog = install_bin(prog) 90 alias = examples_env.Alias(example, prog) 91 Default(alias) 92 93if env['opencl']: 94 examples_env.Append(CPPDEFINES = ['ARM_COMPUTE_CL']) 95 for file in Glob("./cl_*.cpp"): 96 example = os.path.basename(os.path.splitext(str(file))[0]) 97 prog = examples_env.Program(example, ["{}.cpp".format(example), utils], LIBS = examples_libs + arm_compute_libs) 98 Depends(prog, arm_compute_dependency) 99 prog = install_bin(prog) 100 alias = examples_env.Alias(example, prog) 101 Default(alias) 102 103if env['gemm_tuner'] and env['opencl']: 104 gemm_tuner_common_options = examples_env.Object("./gemm_tuner/CommonGemmExampleOptions.cpp") 105 for file in Glob("./gemm_tuner/cl_*.cpp"): 106 example = os.path.basename(os.path.splitext(str(file))[0]) 107 example = os.path.join("gemm_tuner", example) 108 if env['os'] in ['android', 'macos', 'bare_metal'] or env['standalone']: 109 prog = examples_env.Program(example, ["{}.cpp".format(example), utils, gemm_tuner_common_options], LIBS = examples_libs + arm_compute_graph_libs, LINKFLAGS=examples_env["LINKFLAGS"]+[load_whole_archive, graph_dependency, noload_whole_archive, '-fstack-protector-strong'] ) 110 Depends(prog, graph_dependency) 111 prog = install_bin(prog) 112 else: 113 #-Wl,--allow-shlib-undefined: Ignore dependencies of dependencies 114 prog = examples_env.Program(example, ["{}.cpp".format(example), utils, gemm_tuner_common_options], LIBS = examples_libs + arm_compute_graph_libs, LINKFLAGS=examples_env["LINKFLAGS"]+['-Wl,--allow-shlib-undefined'] ) 115 Depends(prog, graph_dependency) 116 prog = install_bin(prog) 117 alias = examples_env.Alias(example, prog) 118 Default(alias) 119 120if env['neon']: 121 for file in Glob("./neon_*.cpp"): 122 example = os.path.basename(os.path.splitext(str(file))[0]) 123 124 prog = None 125 if env['os'] in ['bare_metal']: 126 prog = examples_env.Program(example, ["{}.cpp".format(example), utils], LINKFLAGS=examples_env["LINKFLAGS"], LIBS = examples_libs + arm_compute_libs) 127 else: 128 prog = examples_env.Program(example, ["{}.cpp".format(example), utils], LIBS = examples_libs + arm_compute_libs) 129 130 Depends(prog, arm_compute_dependency) 131 prog = install_bin(prog) 132 alias = examples_env.Alias(example, prog) 133 Default(alias) 134 135if env['external_tests_dir']: 136 for file in Glob(env['external_tests_dir'] + "/examples/graph_*.cpp"): 137 example = os.path.basename(os.path.splitext(str(file))[0]) 138 prog = None 139 140 if env['os'] in ['android', 'macos', 'bare_metal'] or env['standalone']: 141 prog = examples_env.Program(example, [examples_env.Object(source=file, target=example), utils, graph_utils], LIBS = examples_libs + arm_compute_graph_libs, LINKFLAGS=examples_env["LINKFLAGS"]+[load_whole_archive, graph_dependency, noload_whole_archive] + extra_link_flags) 142 Depends(prog, graph_dependency) 143 prog = install_bin(prog) 144 else: 145 #-Wl,--allow-shlib-undefined: Ignore dependencies of dependencies 146 prog = examples_env.Program(example, [examples_env.Object(source=file, target=example), utils, graph_utils], LIBS = examples_libs + arm_compute_graph_libs, LINKFLAGS=examples_env["LINKFLAGS"]+['-Wl,--allow-shlib-undefined'] ) 147 Depends(prog, graph_dependency) 148 prog = install_bin(prog) 149 alias = examples_env.Alias(example, prog) 150 Default(alias) 151