############################################################################
# Copyright 2016-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.
############################################################################
Import('*')

import os

env.PartVersion("2018.2.208")
env.PartName("ippcp")
ipp_libname = '${PART_SHORT_NAME}'

#includes to install
install_headers = Pattern(src_dir='include/',
                          includes=[
                              'ippcp.h',
                              'ippcpdefs.h',
                              'ippdefs.h',
                              'ippbase.h',
                              'ipptypes.h'
                          ],
                          excludes=[],
                          recursive=True)
source_headers = Pattern(src_dir='sources/include/',
                         includes=['*'],
                         excludes=[],
                         recursive=True)
# common headers, for SdkInclude
common_headers = Pattern(src_dir='include/',
                         includes=['ippdefs.h',
                                   'ippbase.h',
                                   'ipptypes.h'],
                         excludes=[],
                         recursive=True)
#files
ippcp_files = Pattern(src_dir='sources/ippcp/src/',
                      includes=[
                          '*.c',
                      ],
                      excludes=[],
                      recursive=True)

ippdir = ''

#prebuild installs prebuild headers instead of src headers.
#internal ipp includes src/primitives/ipp/
env.Append(CPPPATH=[AbsDir('sources/include/')])

# env.Append(CPPDEFINES = '_IPP_BE')  #only for BE targets

#internal ipp includes src/primitives/ipp/
env.Append(CPPPATH=[AbsDir('include/')])
env.Append(CPPPATH=[AbsDir('sources/ippcp/src/')])
#ipp defines
env.Append(CPPDEFINES='_IPP_v50_') #required for all ippcp

env.Append(CPPDEFINES='_IPP_DEBUG')  #enable function sanity checking

env.Append(CPPDEFINES=['_DISABLE_ALG_MD5_',
                       '_DISABLE_ALG_SM3_']) #disable unused hash alg

env.ExportCPPPATH([AbsDir('sources/include/')])

if 'install_package' in env['MODE']:
    # All files at /ext/ipp/source/include
    env.InstallTopLevel(install_headers, sub_dir='ext/ipp/include')
    src_files = Pattern(src_dir='sources/ippcp/src/',
                        includes=['*'],
                        excludes=[''],
                        recursive=True)
    env.InstallTopLevel(src_files, sub_dir='ext/ipp/sources/ippcp/src')
    this_file = Pattern(src_dir='.',
                        includes=['ippcp.parts'],
                        excludes=[],
                        recursive=True)
    env.InstallTopLevel(this_file, sub_dir='ext/ipp/')
    makefile = Pattern(src_dir='./sources/ippcp',
                        includes=['Makefile'],
                        excludes=[],
                        recursive=True)
    env.InstallTopLevel(makefile, sub_dir='ext/ipp/sources/ippcp')
    env.InstallTopLevel(source_headers, sub_dir='ext/ipp/sources/include')
else:
    env.SdkInclude(install_headers)
    env.SdkInclude(common_headers)
    if 'use_commercial_ipp' in env['MODE']:
        env['CCOPY_LOGIC'] = 'copy'
        try:
            IPPCRYPTOROOT = os.environ['IPPCRYPTOROOT']
        except KeyError, e:
            env.PrintError("Necessary environment variable not set: ",
                           e, show_stack=False)
        if env['TARGET_PLATFORM']['OS'] == 'win32':
            libpre = ''
            libpost = '.lib'
            IPP_TH_SYMBOL = 'mt'
        else:
            libpre = 'lib'
            libpost = '.a'
            IPP_TH_SYMBOL = ''
        if env['TARGET_PLATFORM']['ARCH'] == 'x86':
            archdir = 'ia32/'
        else:
            archdir = 'intel64/'

        ippcp_libname = libpre + 'ippcp' + IPP_TH_SYMBOL + libpost
        ippcp_libdir = IPPCRYPTOROOT + '/lib/' + archdir
        env.SdkLib(ippcp_libdir + ippcp_libname)

    else:
        all_c_files = ippcp_files.files()
        if 'build_ipp_shared' in env['MODE']:
            env.Append(CPPDEFINES=['IPP_W32DLL'])
            outputs = env.SharedLibrary(ipp_libname, all_c_files)
            env.InstallTarget(outputs)
        else:
            outputs = env.Library(ipp_libname, all_c_files)
            env.SdkLib(outputs)
            if 'install_lib' in env['MODE']:
                env.InstallLib(outputs)
