import	os
import	string
import	re
import	rkConfig
import	rkBuilder
import	rkWalker

rkBuilder.setCommandLine (COMMAND_LINE_TARGETS, ARGUMENTS)


def build_manextract (target, source, env) :


    if rkConfig.cygdir is not None :

        tgtdir  = str(target[0])[0 : string.rfind(str(target[0]), '\\')]
        tgtdir  = string.replace(tgtdir, '\\', '/')
        tar     = rkConfig.cygdir + '\\bin\\' + 'tar'
        gzip    = rkConfig.cygdir + '/bin/'   + 'gzip'
        print '%s -xf doc/rekall/manual.tgz --use-compress-program=%s -C %s' % (tar, gzip, tgtdir)
        os.system ('%s -xf doc/rekall/manual.tgz --use-compress-program=%s -C %s' % (tar, gzip, tgtdir))

    else :

        tgtdir  = str(target[0])[0 : string.rfind(str(target[0]), '/')]
        print 'tar -xzvf doc/rekall/manual.tgz -C %s' % (tgtdir)
        os.system ('tar -xzvf doc/rekall/manual.tgz -C %s' % (tgtdir))



if rkConfig.xmllint :
       check = '--check' 
else : check = ''


# Construct three builders:
#
#	app4Builder
#		: Generates the Appendix 4 DocBook-XML from the
#		: property dictionaries modules.
#	app5Builder
#		: Generates the Appendix 5 DocBook-XML from the
#		: python interface modules.
#	docBuilder
#		: Generates the KDE-style documentation from the
#		: DocBook-XML sources.
#	manBuilder
#		: Generates the manual files from the DocBook-XML
#		: sources.
#	manExtract
#		: Extracts the manual files from the manual.tgz
#		: tarball. Used where the platform cannot build the
#		: manual.
#
app4Builder = Builder \
(
	action = 'doc/rekall/extract_dict.sh $TARGET $SOURCES'
)

app4Skipper = Builder \
(
	action = 'doc/rekall/extract_dict.sh $TARGET /dev/null'
)

app5Builder = Builder \
(
	action = 'doc/rekall/extract_doc.sh  $TARGET $SOURCES'
)

app5Skipper = Builder \
(
	action = 'doc/rekall/extract_doc.sh  $TARGET /dev/null'
)

docBuilder = Builder \
(
	action = 'meinproc %s --cache $TARGET $SOURCE' % (check)
)

manBuilder = Builder \
(
	action = 'doc/rekall/mkman.sh $TARGET'
)

manExtract = Builder \
(
	action = build_manextract, suffix = '.xml', src_suffix = '.tgz'
)


#  If present, meinproc will need the HOME environment variable, but
#  this may not exist on Windows.
#
try    : home = os.environ['HOME']
except : home = None


pyEnv   = Environment \
	(
		ENV		=
			{ 	'PATH'		: os.environ['PATH'],
				'HOME'		: home,
				'KDEDIR'	: rkConfig.prefix
			},
		BUILDERS	=
			{
				'App4Builder'	: app4Builder,
				'App4Skipper'	: app4Skipper,
				'App5Builder'	: app5Builder,
				'App5Skipper'	: app5Skipper,
				'DocBuilder'	: docBuilder,
				'ManBuilder'	: manBuilder,
				'ManExtract'	: manExtract
			}
	   )


sp = rkBuilder.getSourcePath()

sources = [ 'index.docbook' ]
for [ dir, tgt, file ] in rkWalker.rkWalker (sp, '.*\.sgml') :
     sources.append (tgt + '/' + file)
for [ dir, tgt, file ] in rkWalker.rkWalker (sp, '.*\.png' ) :
     sources.append (tgt + '/' + file)


# If the KDE document processor "meinproc" is available then make
# 'app5.sgml' from the python interface modules, and the KDE
# manual from the set of DocBook-XML sources (including 'app5.sgml')
#
if rkConfig.meinproc and rkConfig.xsltproc:

    dictXML = [ '../../libs/kbase/dict.xml', 'extract_dict.xsl' ]
    app4 = pyEnv.App4Builder (target = 'app4.sgml', source = dictXML)
    sources.append ('app4.sgml')

    if rkConfig.pythonBuild :
        dictXML_py  = [ '../../script/python/doc/dict.xml', 'extract_dict_py.xsl'  ]
        app4_py     = pyEnv.App4Builder (target = 'app4_py.sgml',  source = dictXML_py )
    else :
        app4_py     = pyEnv.App4Skipper (target = 'app4_py.sgml',  source = "/dev/null")

    if rkConfig.kjsBuild :
        dictXML_kjs = [ '../../script/kjs/doc/dict.xml',    'extract_dict_kjs.xsl' ]
        app4_kjs    = pyEnv.App4Builder (target = 'app4_kjs.sgml', source = dictXML_kjs)
    else :
        app4_kjs    = pyEnv.App4Skipper (target = 'app4_kjs.sgml', source = "/dev/null")

    sources.append('app4_kjs.sgml')
    sources.append('app4_py.sgml' )

    if rkConfig.pythonBuild :
        app5_py  = pyEnv.App5Builder (target = 'app5_py.sgml',   source = [ '../../script/python/doc/doc.xml', 'extract_py.xsl'  ])
    else :
        app5_py  = pyEnv.App5Skipper (target = 'app5_py.sgml',   source = "/dev/null")

    if rkConfig.kjsBuild :
        app5_kjs = pyEnv.App5Builder (target = 'app5_kjs.sgml',  source = [ '../../script/kjs/doc/doc.xml',    'extract_kjs.xsl' ])
    else :
        app5_kjs = pyEnv.App5Skipper (target = 'app5_kjs.sgml',  source = "/dev/null")

    sources.append('app4_kjs.sgml')
    sources.append('app4_py.sgml' )

    doc  = pyEnv.DocBuilder  (target = 'index.cache.bz2', source = sources)


# If both "meinproc" is available and the python XML libraries are 
# avaialable (and sufficiently functional) then we can generate the
# manual. The nominal target is 'index.xml' but the builder will
# actually generate the complete "manual" directory.
#
manGen = None

if rkConfig.meinproc and rkConfig.pythonXML and not rkConfig.quickDocs :

    mansrc = [ s for s in sources ]
    mansrc.append ('m_flat.xsl'   )
    mansrc.append ('m_section.xsl')
    mansrc.append ('m_chapter.xsl')
    mansrc.append ('m_common.xsl' )
    mansrc.append ('mkman.sh'     )
    mansrc.append ('mkman.py'     )

    manGen = pyEnv.ManBuilder (target = 'index.xml', source = mansrc)

else :

    manGen = pyEnv.ManExtract (target = 'index.xml', source = 'manual.tgz')


ins  = rkBuilder.installer()
if ins :

    if rkConfig.meinproc and rkConfig.kdedocdir :

        enDir = rkConfig.kdedocdir + '/en/' + rkConfig.appName
        ins.Alias ('install', pyEnv.Install (enDir, 'index.cache.bz2'))
        ins.Alias ('install', pyEnv.Install (enDir, 'index.docbook'  ))

        for [dir, tgt, file] in rkWalker.rkWalker('.', '.*\.png') :
            if dir[0: 6] == "./chap" or dir[0: 5] == "./app" :
                ins.Alias ('install', pyEnv.Install (os.path.join (enDir, dir), os.path.join (dir, file)))

        try    : os.unlink  (os.path.join (enDir, 'common'))
        except : pass

    for [dir, tgt, file] in rkWalker.rkWalker('manual', '.*\.xml') :
        ins.Alias ('install', pyEnv.Install (os.path.join (rkBuilder.appDir, dir), os.path.join (dir, file)))
        pyEnv.SideEffect (os.path.join (dir, file), manGen)
    for [dir, tgt, file] in rkWalker.rkWalker('manual', '.*\.html') :
        ins.Alias ('install', pyEnv.Install (os.path.join (rkBuilder.appDir, dir), os.path.join (dir, file)))
        pyEnv.SideEffect (os.path.join (dir, file), manGen)
    for [dir, tgt, file] in rkWalker.rkWalker('manual', '.*\.png') :
        ins.Alias ('install', pyEnv.Install (os.path.join (rkBuilder.appDir, dir), os.path.join (dir, file)))
        pyEnv.SideEffect (os.path.join (dir, file), manGen)
