# ******************************************************************************
# Copyright 2017-2018 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ******************************************************************************

# To build ngraph with Argon transformer using pre-build Argon API
# ```
# cmake -DNGRAPH_ARGON_ENABLE=True -DNGRAPH_PREBUILD_ARGON_API_PATH=$HOME/dev/system/_out/debug-x86_64-Linux ..
# make -j
# ```

# Enable ExternalProject CMake module
include(ExternalProject)

if (NGRAPH_ARGON_ENABLE)
    # We require pre-build Argon API library
    if (NOT DEFINED NGRAPH_PREBUILD_ARGON_API_PATH)
        message(FATAL_ERROR "NGRAPH_PREBUILD_ARGON_API_PATH not defined, set it with -DNGRAPH_PREBUILD_ARGON_API_PATH=")
    endif()

    # Repository
    if (DEFINED CUSTOM_ARGON_TRANSFORMER_GIT_REPOSITORY)
        set(ARGON_TRANSFORMER_GIT_REPOSITORY ${CUSTOM_ARGON_TRANSFORMER_GIT_REPOSITORY})
    else()
        set(ARGON_TRANSFORMER_GIT_REPOSITORY git@github.com:NervanaSystems/argon-transformer.git)
    endif()

    # Set argon_transformer tag
    # Notes:
    # - Before we have ngraph CI job for argon transformer, ngraph master might not be
    #   compatible with argon transformer. To ensure compatibility, checkout the ngraph commit point
    #   where the following `ARGON_TRANSFORMER_GIT_TAG` is set and build ngraph with argon using this
    #   commit.
    # - After we have ngraph CI job for argon transformer, ngraph master will be compatible with
    #   argon transformer guaranteed by CI.
    set(ARGON_TRANSFORMER_GIT_TAG cpp-master)

    # Determines where argon-transformer will be located
    set(ARGON_TRANSFORMER_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/argon_transformer)

    # Print
    message(STATUS "NGRAPH_INCLUDE_PATH: ${NGRAPH_INCLUDE_PATH}")
    message(STATUS "LLVM_INCLUDE_DIR: ${LLVM_INCLUDE_DIR}")
    message(STATUS "NGRAPH_PREBUILD_ARGON_API_PATH: ${NGRAPH_PREBUILD_ARGON_API_PATH}")

    # The 'BUILD_BYPRODUCTS' argument was introduced in CMake 3.2
    if (${CMAKE_VERSION} VERSION_LESS 3.2)
        if (DEFINED CUSTOM_ARGON_TRANSFORMER_DIR)
            ExternalProject_Add(
                ext_argon_transformer
                SOURCE_DIR ${CUSTOM_ARGON_TRANSFORMER_DIR}
                PREFIX ${ARGON_TRANSFORMER_PREFIX}
                UPDATE_COMMAND ""
                CMAKE_ARGS
                        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                        -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
                        -DNGRAPH_INSTALL_PREFIX=${ARGON_TRANSFORMER_PREFIX}
                        -DPREBUILD_ARGON_API_PATH=${NGRAPH_PREBUILD_ARGON_API_PATH}
                        -DEXTERNAL_NGRAPH_INCLUDE_DIR=${NGRAPH_INCLUDE_PATH}
                        -DINSTALLED_HEADERS_PATH=${CMAKE_INSTALL_PREFIX}/include
                        -DMKLDNN_INCLUDE_DIR=${MKLDNN_INCLUDE_DIR}
                BUILD_ALWAYS 1
            )
        else()
            ExternalProject_Add(
                ext_argon_transformer
                GIT_REPOSITORY ${ARGON_TRANSFORMER_GIT_REPOSITORY}
                GIT_TAG ${ARGON_TRANSFORMER_GIT_TAG}
                PREFIX ${ARGON_TRANSFORMER_PREFIX}
                UPDATE_COMMAND ""
                CMAKE_ARGS
                        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                        -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
                        -DNGRAPH_INSTALL_PREFIX=${ARGON_TRANSFORMER_PREFIX}
                        -DPREBUILD_ARGON_API_PATH=${NGRAPH_PREBUILD_ARGON_API_PATH}
                        -DEXTERNAL_NGRAPH_INCLUDE_DIR=${NGRAPH_INCLUDE_PATH}
                        -DINSTALLED_HEADERS_PATH=${CMAKE_INSTALL_PREFIX}/include
                        -DMKLDNN_INCLUDE_DIR=${MKLDNN_INCLUDE_DIR}
                BUILD_ALWAYS 1
            )
        endif()
    else()
        if (DEFINED CUSTOM_ARGON_TRANSFORMER_DIR)
            ExternalProject_Add(
                ext_argon_transformer
                SOURCE_DIR ${CUSTOM_ARGON_TRANSFORMER_DIR}
                PREFIX ${ARGON_TRANSFORMER_PREFIX}
                UPDATE_COMMAND ""
                CMAKE_ARGS
                        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                        -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
                        -DNGRAPH_INSTALL_PREFIX=${ARGON_TRANSFORMER_PREFIX}
                        -DPREBUILD_ARGON_API_PATH=${NGRAPH_PREBUILD_ARGON_API_PATH}
                        -DEXTERNAL_NGRAPH_INCLUDE_DIR=${NGRAPH_INCLUDE_PATH}
                        -DINSTALLED_HEADERS_PATH=${CMAKE_INSTALL_PREFIX}/include
                        -DMKLDNN_INCLUDE_DIR=${MKLDNN_INCLUDE_DIR}
                BUILD_BYPRODUCTS ${ARGON_TRANSFORMER_PREFIX}
                BUILD_ALWAYS 1
            )
        else()
            ExternalProject_Add(
                ext_argon_transformer
                GIT_REPOSITORY ${ARGON_TRANSFORMER_GIT_REPOSITORY}
                GIT_TAG ${ARGON_TRANSFORMER_GIT_TAG}
                PREFIX ${ARGON_TRANSFORMER_PREFIX}
                UPDATE_COMMAND ""
                CMAKE_ARGS
                        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                        -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
                        -DNGRAPH_INSTALL_PREFIX=${ARGON_TRANSFORMER_PREFIX}
                        -DPREBUILD_ARGON_API_PATH=${NGRAPH_PREBUILD_ARGON_API_PATH}
                        -DEXTERNAL_NGRAPH_INCLUDE_DIR=${NGRAPH_INCLUDE_PATH}
                        -DINSTALLED_HEADERS_PATH=${CMAKE_INSTALL_PREFIX}/include
                        -DMKLDNN_INCLUDE_DIR=${MKLDNN_INCLUDE_DIR}
                BUILD_BYPRODUCTS ${ARGON_TRANSFORMER_PREFIX}
                BUILD_ALWAYS 1
            )
        endif()
    endif()

    ExternalProject_Get_Property(ext_argon_transformer source_dir)
    set(ARGON_TRANSFORMER_SOURCE_DIR ${source_dir} PARENT_SCOPE)
    set(ARGON_TRANSFORMER_INCLUDE_DIR ${ARGON_TRANSFORMER_PREFIX}/include PARENT_SCOPE)
    set(ARGON_TRANSFORMER_LIB_DIR ${ARGON_TRANSFORMER_PREFIX}/lib PARENT_SCOPE)
    set(ARGON_API_INCLUDE_DIR ${NGRAPH_PREBUILD_ARGON_API_PATH}/include PARENT_SCOPE)
    set(ARGON_API_LIB_DIR ${NGRAPH_PREBUILD_ARGON_API_PATH}/lib) # Used by find_library below
    set(ARGON_API_LIB_DIR ${NGRAPH_PREBUILD_ARGON_API_PATH}/lib PARENT_SCOPE)

    # Find prebuild argon library
    find_library(ARGON_API_LIBS
        NAMES
        argon_api
        optimizer
        ir_builder
        umd
        flex
        disasm
        HINTS
        ${ARGON_API_LIB_DIR}
        $ENV{LD_LIBRARY_PATH}
    )

endif()