|  | # | 
|  | # Copyright (c) 2020, Alliance for Open Media. All rights reserved | 
|  | # | 
|  | # This source code is subject to the terms of the BSD 2 Clause License and the | 
|  | # Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was | 
|  | # not distributed with this source code in the LICENSE file, you can obtain it | 
|  | # at www.aomedia.org/license/software. If the Alliance for Open Media Patent | 
|  | # License 1.0 was not distributed with this source code in the PATENTS file, you | 
|  | # can obtain it at www.aomedia.org/license/patent. | 
|  | # | 
|  | if(AOM_BUILD_CMAKE_TENSORFLOW_LITE_CMAKE_) | 
|  | return() | 
|  | endif() # AOM_BUILD_CMAKE_TENSORFLOW_LITE_CMAKE_ | 
|  | set(AOM_BUILD_CMAKE_TENSORFLOW_LITE_CMAKE_ 1) | 
|  |  | 
|  | include(FindGit) | 
|  |  | 
|  | # Checks if the dependencies on Tensorflow Lite are already checked out -- if | 
|  | # not, uses the git submodule command to fetch them. | 
|  | function(checkout_submodules_) | 
|  | # As a quick sanity check, see if at least 1 expected file or directory is | 
|  | # present in each submodule. If so, assume they are all checked out (if they | 
|  | # are not, then the base directory will be empty). | 
|  | if( | 
|  | (EXISTS "${AOM_ROOT}/third_party/tensorflow/tensorflow") | 
|  | AND (EXISTS | 
|  | "${AOM_ROOT}/third_party/tensorflow_dependencies/neon_2_sse/ReadMe.md") | 
|  | AND (EXISTS "${AOM_ROOT}/third_party/tensorflow_aom/absl/absl") | 
|  | AND (EXISTS "${AOM_ROOT}/third_party/tensorflow_aom/eigen/Eigen") | 
|  | AND (EXISTS "${AOM_ROOT}/third_party/tensorflow_aom/farmhash/Makefile.am") | 
|  | AND (EXISTS "${AOM_ROOT}/third_party/tensorflow_aom/flatbuffers/BUILD") | 
|  | AND (EXISTS "${AOM_ROOT}/third_party/tensorflow_aom/fp16/CMakeLists.txt") | 
|  | AND (EXISTS "${AOM_ROOT}/third_party/tensorflow_aom/gemmlowp/BUILD") | 
|  | AND (EXISTS "${AOM_ROOT}/third_party/tensorflow_aom/ruy/BUILD")) | 
|  | return() | 
|  | endif() | 
|  | if(NOT GIT_FOUND) | 
|  | message( | 
|  | FATAL_ERROR | 
|  | "Tensorflow-Lite/dependencies not present; " "git could not be found; " | 
|  | "please check out submodules with 'git submodule update --init'") | 
|  | endif() | 
|  | # Note that "git submodule update --init" must be run from inside the git | 
|  | # repository; the --git-dir flag does not work. | 
|  | message("Checking out Tensorflow-Lite submodule") | 
|  | execute_process(COMMAND "${GIT_EXECUTABLE}" submodule update --init | 
|  | WORKING_DIRECTORY "${AOM_ROOT}" | 
|  | OUTPUT_VARIABLE submodule_out | 
|  | ERROR_VARIABLE submodule_err | 
|  | RESULT_VARIABLE submodule_result) | 
|  | if(NOT ${submodule_result} EQUAL 0) | 
|  | message(FATAL_ERROR "Unable to run 'git submodule update --init': " | 
|  | "Return code: " ${submodule_result} ", STDOUT: " | 
|  | ${submodule_out} ", STDERR: " ${submodule_err}) | 
|  | endif() | 
|  | endfunction() | 
|  |  | 
|  | function(add_tensorflow_lite_dependency_) | 
|  | if(NOT AOM_APP_TARGETS) | 
|  | message(FATAL_ERROR "AOM_APP_TARGETS variable must not be empty.") | 
|  | endif() | 
|  | # Build the library. | 
|  | add_custom_command( | 
|  | OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/libtensorflow-lite.a" | 
|  | COMMAND "${AOM_ROOT}/third_party/tensorflow_dependencies/build.pl" | 
|  | "${AOM_ROOT}" "${CMAKE_CURRENT_BINARY_DIR}" | 
|  | WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") | 
|  | add_custom_target(tensorflowlite_a ALL | 
|  | DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libtensorflow-lite.a") | 
|  | include_directories("${AOM_ROOT}/third_party/tensorflow") | 
|  | include_directories( | 
|  | "${AOM_ROOT}/third_party/tensorflow_dependencies/flatbuffers/include/") | 
|  | # Add tensorflow-lite as a dependency on all AOM applications. | 
|  | foreach(aom_app ${AOM_APP_TARGETS}) | 
|  | add_dependencies(${aom_app} tensorflowlite_a) | 
|  | target_link_libraries( | 
|  | ${aom_app} | 
|  | PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libtensorflow-lite.a" | 
|  | ${AOM_LIB_LINK_TYPE} Threads::Threads | 
|  | PRIVATE ${CMAKE_DL_LIBS}) | 
|  | endforeach() | 
|  | endfunction() | 
|  |  | 
|  | # If Tensorflow-Lite should be enabled, adds appropriate build rules / targets. | 
|  | function(setup_tensorflow_lite) | 
|  | if("${AOM_ROOT}" STREQUAL "") | 
|  | message(FATAL_ERROR "AOM_ROOT variable must not be empty.") | 
|  | endif() | 
|  | # Cross-compile is not currently implemented. | 
|  | if(CMAKE_TOOLCHAIN_FILE) | 
|  | message("TOOLCHAIN: ${CMAKE_TOOLCHAIN_FILE}") | 
|  | message(WARNING "No cross-compile support for TensorFlow Lite; disabling") | 
|  | set(CONFIG_TENSORFLOW_LITE 0 PARENT_SCOPE) | 
|  | return() | 
|  | endif() | 
|  | checkout_submodules_() | 
|  | add_tensorflow_lite_dependency_() | 
|  | endfunction() | 
|  |  | 
|  | function(add_tf_lite_dependency experiment_name) | 
|  | # Experiment is not enabled, no need to include TF-Lite in the build. | 
|  | if(${${experiment_name}} EQUAL "0") | 
|  | return() | 
|  | endif() | 
|  | # Disable the experiment so Gerrit will not test this case. | 
|  | if(CMAKE_TOOLCHAIN_FILE) | 
|  | message(WARNING "--- Cross-compile support not implemented for TF-Lite. " | 
|  | "Disabling ${experiment_name}.") | 
|  | set(${experiment_name} 0 PARENT_SCOPE) | 
|  | return() | 
|  | endif() | 
|  | if(NOT CONFIG_TENSORFLOW_LITE) | 
|  | set(CONFIG_TENSORFLOW_LITE 1 PARENT_SCOPE) | 
|  | endif() | 
|  | endfunction() |