# Sconstruct file for P4OFC

import string, os, re, glob

def filename(p):    # Return filename bit
    return os.path.split(p)[1]

MSDEV = '""C:\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE\\devenv.exe""'
VB6 = '"C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.exe"'
INNOSETUP = '"C:\Program Files (x86)\Inno Setup 5\iscc.exe"'

#---------------------------------
# Scan MSDEV DSP file for dependencies like:
# SOURCE=.\safearray.H

dsp_re = re.compile(r'^SOURCE=(\S+)$', re.M)

def dsp_scan(node, env, target, arg):
    contents = node.get_contents()
    includes = dsp_re.findall(contents)
    return includes

dspscan = Scanner(name = 'dsp',
                function = dsp_scan,
                argument = None,
                skeys = ['.dsp'])

#---------------------------------
# Scan MSDEV SLN file for dependencies like:
# SOURCE=.\safearray.H

vcproj_re = re.compile(r'<File\s+RelativePath="([^"]*)', re.M)
vcproj_re_exclude = re.compile(r'.*_i\..*')

def vcproj_scan(node, env, target, arg):
    # print "Node: " + node.name + ': ' + node.get_abspath()
    contents = node.get_contents()
    includes = vcproj_re.findall(contents)
    # print "Includes: " + ' '.join(includes)
    # Remove files generated by MIDL compiler (e.g. *_i.c or similar)
    includes = filter(lambda x:not vcproj_re_exclude.match(x), includes)
    # print "Filtered Includes: " + ' '.join(includes)
    return includes

vcprojscan = Scanner(name = 'vcproj',
                function = vcproj_scan,
                argument = None,
                skeys = ['.vcproj'])


#---------------------------------
# Also VB scanner for dependencies like:
# Module=Register; Register.bas
# Form=TimerForm.frm
# Form=p4vbTestForm.frm
# Class=WinHelp; WinHelp.cls

vbp_module_re = re.compile(r'^Module=\S+; (\S+)\s*$', re.M)
vbp_form_re = re.compile(r'^Form=(\S+)\s*$', re.M)
vbp_class_re = re.compile(r'^Class=\S+; (\S+)\s*$', re.M)

def vbp_scan(node, env, target, arg):
    contents = node.get_contents()
    includes = vbp_module_re.findall(contents)
    includes += vbp_form_re.findall(contents)
    includes += vbp_class_re.findall(contents)
    # print "Node: " + node.name
    # print "Includes: " + string.join(includes, ' ')
    # print "Change no: " + p4_change_no(1)
    return includes

vbpscan = Scanner(name = 'vbp',
                function = vbp_scan,
                argument = None,
                skeys = ['.vbp'])

scanners = Environment().Dictionary('SCANNERS')


#---------------------------------
# Builder for Setup compiler
mkinstall = Builder(action = INNOSETUP + ' $SOURCES')

msdev_mindep = Builder(action = [[MSDEV,
        '$SOURCES', '/build', 'Release MinDependency', '/out', 'log.txt']])
msdev_rel = Builder(action = [[MSDEV,
        '$SOURCES', '/build', 'Release']])
msvb = Builder(action = VB6 + ' /makedll $SOURCES')

def build_typelibs_cmd(target, source, env):
    # Code to build "target" from "source"
    os.system('p4comaddin\\powervb\\buildtypelibs.bat')
    return None
build_typelibs = Builder(action = build_typelibs_cmd)

files_dir = 'install/files'
setup = 'install/Output/P4OFC.exe'
p4com = 'p4com/src/ReleaseMinDependency/p4com.dll'
libeay32 = 'openssl-lib/libeay32.dll'
ssleay32 = 'openssl-lib/ssleay32.dll'
p4comaddin = 'p4comaddin/p4comaddin.dll'
libp4gt = 'libp4gt/release/libp4gt.lib'
p4dialogs = 'p4dialogs/release/p4dialogs.dll'
vboosttypes6 = 'references/VBoostTypes6.olb'
threadapi = 'references/ThreadAPI.olb'

# Files to remove when appropriate
clean_files = glob.glob('p4com/src/ReleaseMinDependency/*')
clean_files.extend(glob.glob('libp4gt/release/*'))
clean_files.extend(glob.glob('p4dialogs/release/*'))
#print "Clean: " + ' '.join(clean_files)
Clean(p4com, clean_files)

# Default target to build
Default(setup)

env = Environment(BUILDERS = {'mkinstall' : mkinstall,
                              'msdev_mindep' : msdev_mindep,
                              'msdev_rel' : msdev_rel,
                              'msvb' : msvb,
                              'build_typelibs' : build_typelibs},
                  SCANNERS = scanners + [dspscan, vcprojscan, vbpscan])

FILES = ['help/p4ofc.chm']

env.Install(dir = files_dir, source = FILES)

for f in FILES:
    env.Depends(setup, files_dir + '/' + filename(f))

env.msdev_mindep(target = p4com, source = 'p4com/src/p4com.vcxproj')
#env.msdev_rel(target = libp4gt, source = 'libp4gt/libp4gt.vcxproj')
env.msdev_rel(target = p4dialogs, source = 'p4dialogs/p4dialogs.vcxproj')
env.msvb(target = p4comaddin, source = 'p4comaddin/p4comaddin.vbp')
# env.build_typelibs(target = vboosttypes6, source = 'p4comaddin/PowerVB/VBoostTypes6.idl')
env.Depends(p4comaddin, vboosttypes6)
#env.Depends(p4dialogs, libp4gt)
env.Depends(p4comaddin, p4dialogs)

for f in [p4com, p4comaddin, vboosttypes6, threadapi, p4dialogs, libeay32, ssleay32]:
    env.Install(dir = files_dir, source = f)
    env.Depends(setup, files_dir + '/' + filename(f))

env.mkinstall(target = setup, source = 'install/P4ForOffice.iss')