# pylint:disable=I0011,W0401,W0614,C0103,E0602
############################################################################
# Copyright 2016-2019 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.
############################################################################
"""Build configuration for Ipp Crypto
"""
import os
Import('*')

env.PartVersion("2019.0.1")
env.PartName("ippcp")
ippcp_libname = '${PART_SHORT_NAME}'

include_files = Pattern(
    src_dir='include/', includes=['*.h'], excludes=[], recursive=True)

src_files = Pattern(
    src_dir='sources/ippcp/',
    includes=[
        '*.c',
    ],
    excludes=[
        'pcparcfour*.c',
        'pcpmain.c',
        '*sm2.c',
        'pcpsha1ca.c',
        'pcpaes*.c',
        'pcpdes*.c',
        'pcpdlp*.c',
        'pcphmac*.c',
        'pcpmd5*.c',
        'pcpng*.c',
        'pcpprime*.c',
        'pcprij*.c',
        'pcprsa*.c',
        'pcpsm3*.c',
        'pcpsms4*.c',
        'pcptdes*.c',
        'pcpmont_expbinbnu_sscm.c',
        'pcpmont_expwinbnu.c',
        'pcpmont_expwinbnu_sscm.c',
    ],
    recursive=False)

env.Append(CPPPATH=[AbsDir('include/')])
env.ExportCPPPATH([AbsDir('include/')])
env.Append(CPPPATH=[AbsDir('sources/include/')])
env.Append(CPPPATH=[AbsDir('sources/ippcp/')])

# ipp defines
if env['TARGET_ARCH'] == 'x86':
    env.Append(CPPDEFINES='_ARCH_IA32')
else:
    env.Append(CPPDEFINES='_ARCH_EM64T')
# env.Append(CPPDEFINES = '_IPP_BE')  #only for BE targets
env.Append(CPPDEFINES='_IPP_DEBUG')  #enable function sanity checking
env.Append(CPPDEFINES='_IPP_C99')
env.Append(CPPDEFINES='_IPP_v50_')
env.Append(CPPDEFINES='_PX')
env.Append(CPPDEFINES='_ABL_')

env.Append(CPPDEFINES=['_DISABLE_ECP_SM2_'])
env.Append(CPPDEFINES=[
    '_DISABLE_ALG_SHA224_', '_DISABLE_ALG_SHA512_224_', '_DISABLE_ALG_MD5_',
    '_DISABLE_ALG_SM3_'
])  #disable unused hash algs

env.SdkInclude(include_files)

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_dir = IPPCRYPTOROOT + '/lib/' + archdir
    env.SdkLib(ippcp_dir + ippcp_libname)
else:
    all_c_files = src_files.files()
    if 'build_ipp_shared' in env['MODE']:
        env.Append(CPPDEFINES=['IPP_W32DLL'])
        outputs = env.SharedLibrary(ippcp_libname, all_c_files)
        env.InstallTarget(outputs)
    else:
        outputs = env.Library(ippcp_libname, all_c_files)
        env.SdkLib(outputs)
        if 'install_lib' in env['MODE']:
            env.InstallLib(outputs)
