NSIS/SConstruct
kichik c7d867861e no more need for MINGWPREFIX
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4034 212acab6-be3b-0410-9dea-997c60f758d6
2005-05-20 11:59:17 +00:00

343 lines
10 KiB
Python

## TODO
#
# * VPatch GenPat & distribution
# * 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)
#
##
VERSION = '2.06'
stubs = [
'bzip2',
'lzma',
'zlib'
]
plugins = [
'AdvSplash',
'Banner',
'BgImage',
'Dialer',
'InstallOptions',
'LangDLL',
'Library/TypeLib',
'Math',
'nsExec',
'NSISdl',
'Splash',
'StartMenu',
'System',
'UserInfo',
'VPatch/Source/Plugin'
]
utils = [
# special makensis 'Library',
'Library/LibraryLocal',
'MakeLangId',
'Makensisw',
# wxWidgets 'NSIS Menu',
'NSIS Update',
'zip2exe'
]
misc = [
'Graphics',
'Language files',
'Modern UI',
'UIs'
]
defenv = Environment()
defenv.SConsignFile()
Export('defenv')
defenv.Append(NSIS_VERSION = VERSION)
######################################################################
####### Options ###
######################################################################
opts = Options()
opts.Add(PathOption('PREFIX', 'Installation prefix', None))
opts.Add(BoolOption('MSTOOLKIT', 'Use Microsoft Visual C++ Toolkit', 'no'))
opts.Add(BoolOption('DEBUG', 'Build executables with debugging information', 'no'))
opts.Add(PathOption('CPPPATH', 'Path to search for include files', None))
opts.Add(PathOption('LIBPATH', 'Path to search for libraries', None))
opts.Update(defenv)
Help(opts.GenerateHelpText(defenv))
######################################################################
####### Functions ###
######################################################################
defenv['DISTDIR'] = '#nsis-%s' % VERSION
def Distribute(dir, files):
if defenv.has_key('PREFIX') and defenv['PREFIX']:
ins = defenv.Install('$PREFIX/%s' % dir, files)
return ins
defenv.Install('$DISTDIR/%s' % dir, files)
return []
def DistributeAs(path, file):
if defenv.has_key('PREFIX') and defenv['PREFIX']:
ins = defenv.InstallAs('$PREFIX/%s' % path, file)
return ins
defenv.InstallAs('$DISTDIR/%s' % path, file)
return []
def DistributeExamples(dir, examples):
return Distribute('Examples/%s' % dir, examples)
def DistributeDocs(dir, docs):
return Distribute('Docs/%s' % dir, docs)
def DistributeContribs(dir, contribs):
return Distribute('Contrib/%s' % dir, contribs)
defenv.Distribute = Distribute
defenv.DistributeAs = DistributeAs
defenv.DistributeExamples = DistributeExamples
defenv.DistributeDocs = DistributeDocs
defenv.DistributeContribs = DistributeContribs
######################################################################
####### Environments ###
######################################################################
if defenv['DEBUG']:
defenv.Replace(BUILD_PREFIX = 'build/debug')
else:
defenv.Replace(BUILD_PREFIX = 'build/release')
if defenv['MSTOOLKIT']:
defenv.Tool('mstoolkit', toolpath = ['SCons/Tools'])
Default(defenv['BUILD_PREFIX'])
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]
######################################################################
####### Aliases ###
######################################################################
defenv.Alias('install', '$PREFIX')
defenv.Alias('install-docs', '$PREFIX/NSIS.chm')
defenv.Alias('install-docs', '$PREFIX/Docs')
defenv.Alias('install-examples', '$PREFIX/Examples')
defenv.Alias('install-plugins', '$PREFIX/Plugins')
defenv.Alias('install-stubs', '$PREFIX/Stubs')
defenv.Alias('install-includes', '$PREFIX/Include')
# defined elsewhere:
# install-compiler
# install-utils
######################################################################
####### Distribution ###
######################################################################
dist_zip = 'nsis-%s.zip' % VERSION
defenv.Zip(dist_zip, '$DISTDIR')
defenv.Alias('dist', dist_zip)
######################################################################
####### Stubs ###
######################################################################
for stub in stubs:
build_dir = '$BUILD_PREFIX/stub_%s' % stub
env = stub_env.Copy()
env.Append(LINKFLAGS = '${MAP_FLAG("%s")}' % ('stub_' + stub))
exports = { 'env' : env, 'compression' : stub, 'solid_compression' : 0 }
target = defenv.SConscript(dirs = 'Source/exehead', build_dir = build_dir, duplicate = 0, exports = exports)
env.SideEffect('%s/stub_%s.map' % (build_dir, stub), target)
defenv.DistributeAs('Stubs/%s' % stub, target)
build_dir = '$BUILD_PREFIX/stub_%s_solid' % stub
env = stub_env.Copy()
env.Append(LINKFLAGS = '${MAP_FLAG("%s")}' % ('stub_' + stub))
exports = { 'env' : env, 'compression' : stub, 'solid_compression' : 1 }
solid_target = defenv.SConscript(dirs = 'Source/exehead', build_dir = build_dir, duplicate = 0, exports = exports)
env.SideEffect('%s/stub_%s.map' % (build_dir, stub), solid_target)
defenv.DistributeAs('Stubs/%s_solid' % stub, solid_target)
defenv.Alias(stub, target + solid_target)
defenv.Alias('stubs', target + solid_target)
defenv.DistributeAs('Stubs/uninst', 'Source/exehead/uninst.ico')
######################################################################
####### makensis ###
######################################################################
build_dir = '$BUILD_PREFIX/makensis'
exports = { 'env' : makensis_env }
makensis_env.Append(LINKFLAGS = '${MAP_FLAG("makensis")}')
makensis = defenv.SConscript(dirs = 'Source', build_dir = build_dir, duplicate = 0, exports = exports)
makensis_env.SideEffect('%s/makensis.map' % build_dir, makensis)
defenv.Alias('makensis', makensis)
ins = defenv.Distribute('', makensis)
defenv.Alias('install-compiler', ins)
######################################################################
####### Plug-ins ###
######################################################################
def BuildPlugin(target, source, libs, examples = None, docs = None,
entry = 'DllMain', res = None, res_target = None,
resources = None, defines = None, flags = None,
nodeflib = 1):
env = plugin_env.Copy()
if defines:
env.Append(CPPDEFINES = defines)
if flags:
env.Append(CCFLAGS = flags)
if entry:
env.Append(LINKFLAGS = '${ENTRY_FLAG("%s")}' % entry)
if nodeflib:
env.Append(LINKFLAGS = '$NODEFLIBS_FLAG') # no default libraries
env.Append(LINKFLAGS = '${MAP_FLAG("%s")}' % target)
if res:
target_res = env.RES(res_target, res)
if resources:
env.Depends(target_res, resources)
source = source + target_res
plugin = env.SharedLibrary(target, source, LIBS = libs)
defenv.Alias(target, plugin)
defenv.Alias('plugins', plugin)
env.Clean(plugin, File(target + '.map'))
env.Distribute('Plugins', plugin)
if examples:
env.DistributeExamples(target, examples)
if docs:
env.DistributeDocs(target, docs)
for plugin in plugins:
path = 'Contrib/' + plugin
build_dir = '$BUILD_PREFIX/' + plugin
exports = {'BuildPlugin' : BuildPlugin, 'env' : plugin_env.Copy()}
defenv.SConscript(dirs = path, build_dir = build_dir, duplicate = 0, exports = exports)
######################################################################
####### 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(CCFLAGS = 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)
defenv.Alias(target, util)
defenv.Alias('utils', util)
env.Clean(util, File(target + '.map'))
if install is not None:
ins = env.Distribute(install, util)
defenv.Alias('install-utils', ins)
for util in utils:
path = 'Contrib/' + util
build_dir = '$BUILD_PREFIX/' + util
exports = {'BuildUtil' : BuildUtil, 'env' : util_env.Copy()}
defenv.SConscript(dirs = path, build_dir = build_dir, duplicate = 0, exports = exports)
######################################################################
####### Documentation ###
######################################################################
halibut = defenv.SConscript(
dirs = 'Docs/src/bin/halibut',
build_dir = '$BUILD_PREFIX/halibut',
duplicate = 0,
exports = {'env' : defenv.Copy()}
)
defenv.SConscript(
dirs = 'Docs/src',
build_dir = '$BUILD_PREFIX/Docs',
duplicate = 0,
exports = {'halibut' : halibut, 'env' : defenv.Copy()}
)
######################################################################
####### Examples ###
######################################################################
defenv.SConscript(
dirs = 'Examples',
exports = {'env': defenv.Copy()}
)
######################################################################
####### Includes ###
######################################################################
defenv.SConscript(
dirs = 'Include',
exports = {'env': defenv.Copy()}
)
######################################################################
####### Miscellaneous ###
######################################################################
for i in misc:
defenv.SConscript(dirs = 'Contrib/%s' % i)