from __future__ import print_function

import libtbx.load_env
import os
import sys
Import("env_base","env_etc")

env_etc.cbflib_dist = libtbx.env.dist_path("cbflib")
env_etc.cbflib_include = [env_etc.norm_join(env_etc.cbflib_dist,"examples"),
                          env_etc.norm_join(env_etc.cbflib_dist,"include"),
                          ]
env_etc.cbflib_adaptbx_dist = libtbx.env.dist_path("cbflib_adaptbx")

env_etc.cbflib_common_includes = [
  env_etc.base_include,
  env_etc.libtbx_include,
  env_etc.scitbx_include,
  env_etc.boost_adaptbx_include,
  env_etc.boost_include,
  env_etc.cbflib_dist,    # for the adaptor cpp files
  env_etc.cbflib_include[0], # for the cbflib c-files
  env_etc.cbflib_include[1], # for the cbflib c-files
  env_etc.cbflib_adaptbx_dist,
]
# for the hdf5.h file - look at where Python is coming from unless is OS X
# framework build... messy but appears to work on Linux and OS X
include_root = os.path.split(env_etc.python_include)[0]
if 'Python.framework' in include_root:
  include_root = os.path.join(
    include_root.split('Python.framework')[0], 'include')
if os.path.exists(os.path.join(include_root, 'hdf5.h')):
  env_etc.cbflib_common_includes.append(include_root)
else:
  # check for PSDM installation. Example:
  # /reg/g/psdm/sw/external/hdf5/1.8.6/x86_64-rhel5-gcc41-opt/include
  psdm_hdf5_path = os.path.join(os.environ.get('SIT_ROOT',""),
                                'sw', 'external', 'hdf5', '1.8.6',
                                os.environ.get('SIT_ARCH',""), 'include')
  if os.path.exists(psdm_hdf5_path):
    print("Using HDF5 include folder:", psdm_hdf5_path)
    env_etc.cbflib_common_includes.append(psdm_hdf5_path)
  #else:
    # if you have CBFlib from bleeding edge this will not work, but an old version
    # may be fine...
    # raise RuntimeError, 'cannot build CBFlib without hdf5.h'
    #pass
if (sys.platform == "win32" and env_etc.compiler == "win32_cl"):
  env_etc.cbflib_common_includes.append(libtbx.env.under_base(os.path.join('HDF5-1.8.16', 'include')))
  env_etc.cbflib_common_includes.append(libtbx.env.under_dist("cbflib_adaptbx","../msvc9.0_include"))

env = env_base.Clone(
  SHLINKFLAGS=env_etc.shlinkflags)
if (env_etc.compiler == "win32_cl"):
  env.Append(CCFLAGS=[
    "/DCBF_NO_REGEX",
    "/Dmalloc=malloc", # work around problem in bison-generated cbf_stx.c
    "/Dfree=free"])
else :
  env.Append(CCFLAGS=["-DCBF_NO_REGEX"])

prefix = "#"+os.path.basename(env_etc.cbflib_dist)

cbflib_092_forward = []
if os.path.isfile( os.path.join(env_etc.cbflib_dist,"src","cbf_ws.c") ):
  cbflib_092_forward.append("src/cbf_ws.c")

cpppath = env_etc.cbflib_common_includes
if (libtbx.env.build_options.use_conda):
  cpppath += env_etc.conda_cpppath

env.Append(CPPPATH=cpppath)
env.StaticLibrary(target='#lib/cbf',
  source = [prefix+"/"+s for s in [
    "src/img.c",
    "src/cbf.c",
    "src/cbf_alloc.c",
    "src/cbf_ascii.c",
    "src/cbf_binary.c",
    "src/cbf_byte_offset.c",
    "src/cbf_canonical.c",
    "src/cbf_codes.c",
    "src/cbf_compress.c",
    "src/cbf_context.c",
    "src/cbf_file.c",
    "src/cbf_lex.c",
    "src/cbf_nibble_offset.c",
    "src/cbf_packed.c",
    "src/cbf_predictor.c",
    "src/cbf_read_binary.c",
    "src/cbf_read_mime.c",
    "src/cbf_simple.c",
    "src/cbf_string.c",
    "src/cbf_stx.c",
    "src/cbf_tree.c",
    "src/cbf_uncompressed.c",
    "src/cbf_write.c",
    "src/cbf_write_binary.c",
    "src/md5c.c",
  ] + cbflib_092_forward ] + [
    "detectors/mar_adaptor.cpp",
    "detectors/cbf_adaptor.cpp",
    "detectors/cbf_byte_offset_optimized.cpp",
    "detectors/buffer_based_service.cpp",
  ])

if (not env_etc.no_boost_python):
  Import("env_no_includes_boost_python_ext")

  env_cbflib_boost_python_ext = env_no_includes_boost_python_ext.Clone()
  env_cbflib_boost_python_ext.Prepend(CPPFLAGS=["-DSWIG_PYTHON_STRICT_BYTE_CHAR"])

  env_etc.include_registry.append(
    env=env_cbflib_boost_python_ext,
    paths=env_etc.cbflib_common_includes + [env_etc.python_include])

  env_cbflib_boost_python_ext.SharedLibrary(
    target='#lib/_pycbf',
    source=[prefix+"/pycbf/pycbf_wrap.c",
            prefix+"/src/cbf_airy_disk.c"],
    LIBS=["cbf"]+env_etc.libs_python+env_etc.libm)

  Export("env_cbflib_boost_python_ext")

  SConscript("detectors/boost_python/SConscript")

env_standalone = env.Clone(LIBS = [env_etc.libm,],CPPPATH=cpppath)
env_standalone.Prepend(LIBS=["cbf",])

for source in ["detectors/tst_memory",]:
  target = "cbflib."+os.path.basename(source)
  exe = env_standalone.Program(
    target="#exe_dev/"+env["PROGPREFIX"]+target+env["PROGSUFFIX"],
    source=source+".cpp")
  libtbx.env.write_dispatcher_in_bin(
    source_file=exe[0].get_abspath(),
    target_file=target)
