Import(['env', 'InstallDirSbin', 'InstallDirLib', 'InstallDirLibBin', 'InternalModules', 'InstallDirInclude', 'AssemblyDir', 'ASMFunctionsAvailable', 'uname'])

import glob

AssemblyFunctions = []

for i in ASMFunctionsAvailable:
 AssemblyFunctions += [ AssemblyDir + '/' + i + '.S' ]

CodeSet = ['set-lowmem.c', 'set-common.c']
CodeITree = ['itree-trinary-splay.c']
CodeSTree = ['tree-itree.c']

CodeCoreObjects = ['einit-core.c', 'module.c', 'bitch.c', 'utility.c', 'event.c'] + CodeSet + CodeSTree + CodeITree
CodeCoreMonitorObjects = ['einit-monitor.c']

CodeLastRites = ['last-rites.c']
CodeEinitHelper = ['einit-helper.c']

CodeEinitFeedbackD = ['einit-feedback.c']
CodeEinitLogD = ['einit-log.c']

CodeEinitSysVD = ['tools/einit-sysvd.c']

CodeLibEinit = ['libraries/libeinit.c', 'bitch.c', 'event.c', 'utility.c'] + CodeSet + CodeSTree + CodeITree + AssemblyFunctions

linkCore = '-Wl,-export-dynamic'

if uname == 'Darwin':
 linkCore = ''

linkflagsLibEinit = ''
linkflagsLibEinitPP = ''

if uname == 'Linux':
 linkflagsLibEinit = '-shared -Wl,-soname,libeinit.so.3.0.0'
 linkflagsLibEinitPP = '-shared -Wl,-soname,libeinit++.so.3.0.0'

coreLibs = ['pthread', 'core-modules']

if 'module-so' in InternalModules:
 coreLibs += [ 'dl' ]

einitCore = env.Program ('einit-core', CodeCoreObjects + AssemblyFunctions, LIBS=coreLibs, LIBPATH=['modules'], CCFLAGS='-DEINIT_CORE', LINKFLAGS=linkCore)
einitMonitor = env.Program ('einit-monitor', CodeCoreMonitorObjects)

lastRites = env.Program ('last-rites', CodeLastRites, LIBS=['einit'], LIBPATH=['.'])
einitHelper = env.Program ('einit-helper', CodeEinitHelper, LIBS=['einit'], LIBPATH=['.'])

einitFeedbackD = env.Program ('einit-feedback', CodeEinitFeedbackD, LIBS=['einit', 'curses'], LIBPATH=['.'])
einitLogD = env.Program ('einit-log', CodeEinitLogD, LIBS=['einit'], LIBPATH=['.'])

einitSysVD = env.Program ('einit-sysvd', CodeEinitSysVD, LIBS=['einit'], LIBPATH=['.'])

libEinit = env.SharedLibrary ('einit', CodeLibEinit, LIBS=['ixp-local', 'pthread'], LIBPATH=['#libixp'], SHLINKFLAGS=linkflagsLibEinit)
libEinitPP = env.SharedLibrary ('einit++', 'libraries/libeinit++.c++', LIBS=['einit'], LIBPATH=['.'], SHLINKFLAGS=linkflagsLibEinitPP)

env.Install (InstallDirLibBin, einitCore)
env.Install (InstallDirLibBin, einitHelper)
env.Install (InstallDirLibBin, lastRites)
env.Install (InstallDirLibBin, einitFeedbackD)
env.Install (InstallDirLibBin, einitLogD)

env.InstallAs (InstallDirSbin + '/einit', einitMonitor)
env.Install (InstallDirLib, libEinit)
env.Install (InstallDirLib, libEinitPP)
env.Install (InstallDirSbin, einitSysVD)

env.Install (InstallDirInclude + '/einit', glob.glob ('include/einit/*'))
env.Install (InstallDirInclude + '/einit-modules', glob.glob ('include/einit-modules/*'))
