import os, glob

Import("env")
Import("configuredPackages")
Import("modules")

demos = []

for modName, mod in modules.items():
  libs, libPath, compileOpts, cppPath, frameworks = [], [], [], [], []
  
  for d in mod.dependencies:
    if d in modules:
      # Internal dependency
      libs.append(d)
      libPath.insert(0, modules[d].fullpath)
      cppPath.insert(0, modules[d].fullpath)
      
    elif d in configuredPackages:
      # External (configured) dependency
      dep = configuredPackages[d]
      libs += dep.libs[0]          # The libs
      frameworks += list(dep.libs[1])    # The frameworks (Darwin)
      libPath += dep.libPath
      cppPath += dep.cppPath
      compileOpts += dep.compileOpts
        
  modEnv = env.Clone(CXXFLAGS = mod.cxxFlags, LINKFLAGS = mod.linkFlags, CPPPATH = Dir("#"),\
                    LIBPATH = mod.fullpath, LIBS = modName)
  modEnv.Append(CXXFLAGS=compileOpts)
  modEnv.Append(LIBPATH = libPath)
  modEnv.Append(CPPPATH = cppPath)
  modEnv.Append(LIBS = libs)
  if env["PLATFORM"] == "darwin":
    modEnv.Append(FRAMEWORKS=frameworks)
    modEnv.Append(CXXFLAGS=" -bind_at_load")
    modEnv.Append(LDFLAGS=" -bind_at_load")

  # the cppdemos!
  for dpath, dnames, fnames in os.walk(modName):
    if os.path.basename(dpath) == 'cpp':
      if "main.cpp" in fnames:
        demoSource = os.path.join(dpath,"main.cpp")
        demos += modEnv.Program(target = os.path.join(dpath,"demo"),\
                                source = demoSource)
        # Adding the results from the cpp and python demos to clean target
        Clean(demos[-1],glob.glob(os.path.join(dpath,"result*")))
        Clean(demos[-1],glob.glob(os.path.join(dpath,os.pardir,"python","result*")))
        
Return("demos")
