import libtbx.load_env
import os
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.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 = 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"])
elif (env_etc.compiler.endswith("_mingw")):
  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")

env.StaticLibrary(target='#lib/cbf',
  source = [prefix+"/"+s for s in [
    "examples/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_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",
  ],
  CPPPATH=env_etc.cbflib_common_includes )

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_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"],
    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=env_etc.cbflib_common_includes
)
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)
