#get all the build variables we need
import os
import pdb
Import('env','conf','build_prefix','build_options')
localenv = env.Clone()

#add paths for nlopt
localenv.Append(CPPPATH = ['stogo','util','direct','cdirect','praxis','luksan','crs','mlsl','mma','cobyla','newuoa','neldermead','auglag','bobyqa','isres','slsqp','api'])
#add variant dir to path

#figure out target install path
abs_build_prefix = os.path.join('#',build_prefix)

localenv.Append(CPPPATH = [os.path.join(abs_build_prefix,'nlopt')])

#autoconf checkes
dict = {}
#default values if not present
dict['HAVE_UNISTD_H'] = ''
dict['HAVE_STRING_H'] = ''
dict['HAVE_STRINGS_H'] = ''
dict['HAVE_SYS_STAT_H'] = ''
dict['HAVE_INTTYPES_H'] = ''
dict['HAVE_MEMORY_H'] = ''
dict['HAVE_STDLIB_H'] = ''
dict['HAVE_STDINT_H'] = ''
dict['HAVE_SYS_TYPES_H'] = ''
dict['HAVE_ISINF'] = ''
dict['HAVE_ISNAN'] = ''
dict['HAVE_GETTIMEOFDAY'] = ''
dict['HAVE_QSORT_R'] = ''
dict['HAVE_TIME'] = ''
dict['HAVE_COPYSIGN'] = ''
dict['HAVE_UINT32_T'] = ''
#static replacements
dict['NLOPT_MAJOR_VERSION'] = '1.0'
dict['NLOPT_MINOR_VERSION'] = '0'
dict['NLOPT_BUGFIX_VERSION'] = '0'

#header checks
if conf.CheckCHeader('unistd.h'):
   dict['HAVE_UNISTD_H'] = "#define HAVE_UNISTD_H"
if conf.CheckCHeader('string.h'):
   dict['HAVE_STRING_H'] = "#define HAVE_STRING_H"
if conf.CheckCHeader('strings.h'):
   dict['HAVE_STRINGS_H'] = "#define HAVE_STRINGS_H"
if conf.CheckCHeader('sys/stat.h'):
   dict['HAVE_SYS_STAT_H'] = "#define HAVE_SYS_STAT_H"
if conf.CheckCHeader('inttypes.h'):
   dict['HAVE_INTTYPES_H'] = "#define HAVE_INTTYPES_H"
if conf.CheckCHeader('memory.h'):
   dict['HAVE_MEMORY_H'] = "#define HAVE_MEMORY_H"
if conf.CheckCHeader('stdlib.h'):
   dict['HAVE_STDLIB_H'] = "#define HAVE_STDLIB_H"
if conf.CheckCHeader('stdint.h'):
   dict['HAVE_STDINT_H'] = "#define HAVE_STDINT_H"
if conf.CheckCHeader('sys/types.h'):
   dict['HAVE_SYS_TYPES_H'] = "#define HAVE_SYS_TYPES_H"
#function checks
if conf.CheckFunc('isinf'):
   dict['HAVE_ISINF'] = "#define HAVE_ISINF"
if conf.CheckFunc('isnan'):
   dict['HAVE_ISINF'] = "#define HAVE_ISNAN"
if conf.CheckFunc('gettimeofday'):
   dict['HAVE_ISINF'] = "#define HAVE_GETTIMEOFDAY"
if conf.CheckFunc('qsort_r'):
   dict['HAVE_QSORT_R'] = "#define HAVE_QSORT_R"
if conf.CheckFunc('time'):
   dict['HAVE_TIME'] = "#define HAVE_TIME"
if conf.CheckFunc('copysign'):
   dict['HAVE_COPYSIGN'] = "#define HAVE_COPYSIGN"

#check uint23_t
uint32_t_header = '#include "stdint.h"'
# uint32_t_size = conf.CheckTypeSize('uint32_t',includes=uint32_t_header)
uint32_t_size = 4
if uint32_t_size:
   dict['SIZEOF_UNSIGNED_INT'] = str(uint32_t_size)
   dict['HAVE_UINT32_T'] = '#define HAVE_UINT32_T'
   dict['DEFINE_UINT32_T'] = ''
else:
   dict['SIZEOF_UNSIGNED_INT'] = '4'
   dict['DEFINE_UINT32_T'] = "#define uint32_t unsigned int"
   dict['HAVE_UINT32_T'] = '#define HAVE_UINT32_T'
#replace 
config=localenv.SubstInFile('config.h','config.scons.h.in',SUBST_DICT=dict)

srclst = ['direct/DIRect.c',
       'direct/direct_wrap.c',
       'direct/DIRserial.c',
       'direct/DIRsubrout.c',
       'cdirect/cdirect.c','cdirect/hybrid.c',
       'praxis/praxis.c','luksan/plis.c','luksan/plip.c','luksan/pnet.c', 'luksan/mssubs.c','luksan/pssubs.c',
       'crs/crs.c',
       'mlsl/mlsl.c',
       'mma/mma.c','mma/ccsa_quadratic.c',
       'cobyla/cobyla.c',
       'newuoa/newuoa.c',
       'neldermead/nldrmd.c','neldermead/sbplx.c',
       'auglag/auglag.c',
       'bobyqa/bobyqa.c',
       'isres/isres.c',
       'slsqp/slsqp.c',
       'api/general.c','api/options.c','api/optimize.c','api/deprecated.c','api/f77api.c',
       'util/mt19937ar.c','util/sobolseq.c','util/timer.c','util/stop.c','util/redblack.c','util/qsort_r.c','util/rescale.c',
       'stogo/global.cc','stogo/linalg.cc','stogo/local.cc','stogo/stogo.cc','stogo/tools.cc'       
       ]

#add dependency on generated header
localenv.Depends(srclst, config)

#srclst = Glob('*/*.c')
#srclst = ['api/f77api.c']

#add rpath support for mac osx
if(localenv['PLATFORM']=='darwin'):
  localenv.Append(LINKFLAGS = '-install_name @rpath/libnlopt.so')

#build nlopt statically or as dynamic lib?
if build_options['static_bind']:  
  lib=localenv.StaticLibrary('nlopt',srclst)
else:
  lib=localenv.SharedLibrary('nlopt',srclst)
Return('lib')
