NSIS/SConstruct
kichik b604cdfe3f new build system using SCons
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3969 212acab6-be3b-0410-9dea-997c60f758d6
2005-04-16 18:48:50 +00:00

214 lines
6 KiB
Python

## TODO
#
# * VPatch GenPat (wait for v3 written in C)
# * Get Math to Compile
# * Write SConscript for NSIS Menu
# - Use inheritance instead of current wxWidgets patches
# - Compile for POSIX too? wxWidgets is cross platform after all...
# * Write SConscript for Library RegTool (needs to compile makensis with smaller configuration)
#
##
stubs = [
'bzip2',
'lzma',
'zlib'
]
plugins = [
'AdvSplash',
'Banner',
'BgImage',
'Dialer',
'InstallOptions',
'LangDLL',
'Library/TypeLib',
# compile errors 'Math',
'nsExec',
'NSISdl',
'Splash',
'StartMenu',
'System',
'UserInfo',
'VPatch/Source/Plugin'
]
utils = [
# special makensis 'Library',
'Library/LibraryLocal',
'MakeLangId',
'Makensisw',
# wxWidgets 'NSIS Menu',
'NSIS Update',
'zip2exe'
]
import os
prefix = GetLaunchDir() + os.sep
build_prefix = 'build' + os.sep
######################################################################
####### environments ###
######################################################################
defenv = Environment()
Export('defenv')
opts = Options()
opts.Add(('MINGWPREFIX', 'MinGW toolset prefix'))
opts.Add(BoolOption('MSTOOLKIT', 'Use Microsoft Visual C++ Toolkit', 'no'))
opts.Add(BoolOption('DEBUG', 'Build executables with debugging information', 'no'))
opts.Update(defenv)
Help(opts.GenerateHelpText(defenv))
if defenv['MSTOOLKIT']:
defenv.Tool('mstoolkit', toolpath = ['SCons/Tools'])
tools = defenv['TOOLS']
envs = []
if 'msvc' in tools or 'mstoolkit' in tools:
envs = SConscript('SCons/Config/ms')
elif 'gcc' in tools:
envs = SConscript('SCons/Config/gnu')
else:
envs = SConscript('SCons/Config/default')
stub_env = envs[0]
makensis_env = envs[1]
plugin_env = envs[2]
util_env = envs[3]
######################################################################
####### stubs ###
######################################################################
for stub in stubs:
build_dir = build_prefix + 'stub_' + stub
env = stub_env.Copy()
env.Append(LINKFLAGS = '${MAP_FLAG("%s")}' % ('stub_' + stub))
exports = { 'env' : env, 'compression' : stub, 'solid_compression' : 0 }
target = SConscript(dirs = 'Source/exehead', build_dir = build_dir, duplicate = 0, exports = exports)
env.SideEffect(File(build_dir + os.sep + 'stub_' + stub + '.map'), target)
ins_target = InstallAs(prefix + '/Stubs/' + stub, target)
build_dir = build_prefix + 'stub_' + stub + '_solid'
env = stub_env.Copy()
env.Append(LINKFLAGS = '${MAP_FLAG("%s")}' % ('stub_' + stub))
exports = { 'env' : env, 'compression' : stub, 'solid_compression' : 1 }
solid_target = SConscript(dirs = 'Source/exehead', build_dir = build_dir, duplicate = 0, exports = exports)
env.SideEffect(File(build_dir + os.sep + 'stub_' + stub + '.map'), target)
ins_solid_target = InstallAs(prefix + '/Stubs/' + stub + '_solid', solid_target)
env.Alias(stub, ins_target + ins_solid_target)
uninst_icon = InstallAs(prefix + '/Stubs/' + 'uninst', 'Source/exehead/uninst.ico')
Alias('stubs', [stubs, uninst_icon])
######################################################################
####### makensis ###
######################################################################
build_dir = build_prefix + 'makensis'
exports = { 'env' : makensis_env }
makensis_env.Append(LINKFLAGS = '${MAP_FLAG("makensis")}')
makensis = SConscript(dirs = 'Source', build_dir = build_dir, duplicate = 0, exports = exports)
makensis_env.Clean(makensis, 'makensis.map')
Alias('makensis', Install(prefix, makensis))
######################################################################
####### Plug-ins ###
######################################################################
def PluginEnv(target, entry = 'DllMain', nodeflib = 1):
env = plugin_env.Copy()
if nodeflib:
env.Append(LINKFLAGS = '$NODEFLIBS_FLAG') # no default libraries
env.Append(LINKFLAGS = '${ENTRY_FLAG("%s")}' % entry) # entry function
env.Append(LINKFLAGS = '${MAP_FLAG("%s")}' % target) # generate map file
env.SideEffect(File(target + '.map'), target)
return env
for plugin in plugins:
path = 'Contrib' + os.sep + plugin
build_dir = build_prefix + plugin
exports = 'PluginEnv'
plugin_dll = SConscript(dirs = path, build_dir = build_dir, duplicate = 0, exports = exports)
Alias(plugin, Install(prefix + 'Plugins', plugin_dll))
######################################################################
####### Utilities ###
######################################################################
def BuildUtil(target, source, libs, entry = None, res = None,
resources = None, defines = None, flags = None,
install = None):
env = util_env.Copy()
if defines:
env.Append(CPPDEFINES = defines)
if flags:
env.Append(CPPFLAGS = flags)
if entry:
env.Append(LINKFLAGS = '${ENTRY_FLAG("%s")}' % entry)
env.Append(LINKFLAGS = '${MAP_FLAG("%s")}' % target)
if res:
target_res = env.RES(res)
if resources:
env.Depends(target_res, resources)
source = source + target_res
util = env.Program(target, source, LIBS = libs)
env.Clean(util, File(target + '.map'))
if install is not None:
ins = Install(prefix + install, util)
Alias(target, ins)
else:
Alias(target, util)
for util in utils:
path = 'Contrib' + os.sep + util
build_dir = build_prefix + util
exports = {'BuildUtil' : BuildUtil, 'env' : util_env.Copy()}
SConscript(dirs = path, build_dir = build_dir, duplicate = 0, exports = exports)
######################################################################
####### Documentation ###
######################################################################
halibut = SConscript(
dirs = 'Docs/src/bin/halibut',
build_dir = build_prefix + 'halibut',
duplicate = 0
)
SConscript(
dirs = 'Docs/src',
build_dir = build_prefix + 'Docs',
duplicate = 0,
exports = {'halibut' : halibut, 'prefix' : prefix}
)