Merge patch for better installs on POSIX platforms.

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4486 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
pabs3 2006-01-21 09:54:23 +00:00
parent c16ca4f9fc
commit 0913023f33
25 changed files with 286 additions and 134 deletions

View file

@ -78,7 +78,7 @@ def join(prefix, list):
return map(lambda x: '%s/%s' % (prefix, x), list)
def dist(dir, files):
defenv.DistributeContribs('Graphics/%s' % dir, join(dir, files))
defenv.DistributeContrib(join(dir, files), path='Graphics/%s' % dir)
dist('Checks', checks)
dist('Header', headers)

View file

@ -52,4 +52,4 @@ languages = Split("""
Import('defenv')
defenv.DistributeContribs('Language files', languages)
defenv.DistributeContrib(languages, path='Language files')

View file

@ -12,4 +12,4 @@ libs = Split("""
Import('BuildUtil')
BuildUtil(target, files, libs, flags = ['$EXCEPTION_FLAG'], install = 'Bin')
BuildUtil(target, files, libs, flags = ['$EXCEPTION_FLAG'])

View file

@ -14,4 +14,4 @@ libs = Split("""
Import('BuildUtil')
BuildUtil(target, files, libs, entry = 'WinMain', nodeflib = True, install_as = 'Bin/RegTool.bin')
BuildUtil(target, files, libs, entry = 'WinMain', nodeflib = True, file_name = 'RegTool.bin')

View file

@ -19,5 +19,5 @@ libs = Split("""
Import('BuildUtil')
BuildUtil(target, files, libs, res = res, resources = resources, entry = 'WinMain', install = 'Bin')
BuildUtil(target, files, libs, res = res, resources = resources, entry = 'WinMain')

View file

@ -53,7 +53,7 @@ BuildUtil(
res = res,
resources = resources,
entry = 'WinMain',
install = '',
defines = ['WIN32_MEAN_AND_LEAN', 'RELEASE=2.0'],
docs = docs
docs = docs,
root_util = True
)

View file

@ -364,12 +364,12 @@ side.<br />
"parameter">ui_file</span><br />
The interface files with a customized dialog resource IDD_SELCOM
with a small description area.<br />
<em>Default: {NSISDIR}\Contrib\UIs\modern_smalldesc.exe</em></p>
<em>Default: ${NSISDIR}\Contrib\UIs\modern_smalldesc.exe</em></p>
<p><strong>MUI_UI_COMPONENTSPAGE_NODESC</strong> <span class=
"parameter">ui_file</span><br />
The interface files with a customized dialog resource IDD_SELCOM
without a description area.<br />
<em>Default: {NSISDIR}\Contrib\UIs\modern_nodesc.exe</em></p>
<em>Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe</em></p>
</div>
<h3><img class="trigger" alt="Open/Close section" id="trigger_inwf"
src="images/closed.gif" onclick=

View file

@ -77,7 +77,9 @@ Import('defenv')
def join(prefix, list):
return map(lambda x: '%s/%s' % (prefix, x), list)
defenv.DistributeDocs(target, docs)
defenv.DistributeDocs('%s/%s' % (target, 'images'), join('images', doc_images))
defenv.DistributeContribs(target, contribs)
defenv.DistributeContribs('%s/%s' % (target, 'Language files'), join('Language files', languages))
defenv.DistributeDocs(docs, path=target)
path = 'images'
defenv.DistributeDocs(join(path,doc_images), path='%s/%s'%(target,path))
defenv.DistributeContrib(contribs, path=target)
path = 'Language files'
defenv.DistributeContrib(join(path,languages), path='%s/%s'%(target,path))

View file

@ -36,6 +36,25 @@ libs = Split("""
wxzlib
""")
html = Split("""
#Menu/compiler.html
#Menu/docs.html
#Menu/index.html
#Menu/intro.html
#Menu/notinstalled.html
#Menu/update.html
#Menu/websites.html
""")
images = Split("""
#Menu/images/clear.gif
#Menu/images/header.gif
#Menu/images/line.gif
#Menu/images/menu.gif
#Menu/images/menud.gif
#Menu/images/site.gif
""")
Import('BuildUtil env')
import os
@ -46,24 +65,14 @@ import os
#BuildUtil(target, files, libs, libpath = wxlib, cpppath = wxinc, res = rc, resources = resources, install = '', flags = ['/MD'])
# install pre-built NSIS.exe
ins = env.Distribute('', '#NSIS.exe')
if env['PLATFORM'] == 'win32':
ins = env.DistributeBin('#NSIS.exe')
else:
ins = env.DistributeW32Bin('#NSIS.exe')
env.Alias('install-utils', ins)
# install menu files
env.Distribute('Menu', '#Menu/compiler.html')
env.Distribute('Menu', '#Menu/docs.html')
env.Distribute('Menu', '#Menu/index.html')
env.Distribute('Menu', '#Menu/intro.html')
env.Distribute('Menu', '#Menu/notinstalled.html')
env.Distribute('Menu', '#Menu/update.html')
env.Distribute('Menu', '#Menu/websites.html')
env.Distribute('Menu/images', '#Menu/images/clear.gif')
env.Distribute('Menu/images', '#Menu/images/header.gif')
env.Distribute('Menu/images', '#Menu/images/line.gif')
env.Distribute('Menu/images', '#Menu/images/menu.gif')
env.Distribute('Menu/images', '#Menu/images/menud.gif')
env.Distribute('Menu/images', '#Menu/images/site.gif')
env.Alias('install-utils', '$PREFIX/Menu')
env.DistributeMenu(html, alias='install-utils')
env.DistributeMenu(images, path='images', alias='install-utils')

View file

@ -22,5 +22,5 @@ Import('BuildUtil env')
code = env.Object(code)
for ui in uis:
ui = BuildUtil(ui, [code], libs, entry = 'WinMain', res = ui + '.rc', install = 'Contrib/UIs')
ui = BuildUtil(ui, [code], libs, entry = 'WinMain', res = ui + '.rc', contrib = True, path = 'UIs')
env.Alias('UIs', ui)

View file

@ -17,6 +17,6 @@ includes = Split("""
Import('defenv')
defenv.DistributeExamples(target, examples)
defenv.DistributeDocs(target, docs)
defenv.Distribute('Include', includes)
defenv.DistributeExamples(examples, path=target)
defenv.DistributeDocs(docs, path=target)
defenv.DistributeInclude(includes)

View file

@ -17,4 +17,4 @@ libs = Split("""
Import('BuildUtil')
BuildUtil(target, files, libs, flags = ['$EXCEPTION_FLAG'], install = 'Bin', cross_platform = True)
BuildUtil(target, files, libs, flags = ['$EXCEPTION_FLAG'], cross_platform = True)

View file

@ -36,6 +36,6 @@ headers = Split("""
Import('BuildUtil defenv')
BuildUtil(target, files, libs, res = rc, resources = resources, install = 'Bin')
BuildUtil(target, files, libs, res = rc, resources = resources)
defenv.DistributeContribs(target, headers)
defenv.DistributeContrib(headers,path=target)

View file

@ -6,6 +6,7 @@ appendices = 9
htmls = Split('IndexPage.html Contents.html') \
+ map(lambda ch: 'Chapter' + str(ch + 1) + '.html', range(chapters)) \
+ map(lambda ap: 'Appendix' + chr(ord('A') + ap) + '.html', range(appendices))
fixed_htmls = map(lambda fn: 'fixed/'+fn, htmls)
chm_config_but = 'chm_config.but'
@ -55,6 +56,7 @@ buts = Split("""
""")
import os
import re
Import('halibut env build_chm')
@ -62,6 +64,15 @@ env.Append(ENV = {'PATH' : os.environ['PATH']})
build_dir = Dir(GetBuildPath('.')).abspath
replacement = '<a href="%s/\\1/' % env.subst('$PREFIX_DATA')
def fix_html(target, source, env):
for i in range(len(source)):
data = open(str(source[i]),'rb').read()
data = re.sub('<a href="../(Include|Stubs|Plugins|Contrib)/', replacement, data)
open(str(target[i]),'wb').write(data)
return None
if build_chm:
hhc_action = Action('cd "%s" && hhc nsis.hhp' % (build_dir))
execute = hhc_action.execute
@ -83,7 +94,7 @@ if build_chm:
chm = env.HalibutCHM('NSIS.chm', [chm_config_but] + buts)
env.Depends(chm, halibut)
env.Distribute('', chm)
env.DistributeDoc(chm)
else:
html_builder = Builder(
@ -92,10 +103,14 @@ else:
Action('cd "%s" && "%s" ${SOURCES.abspath}' % (build_dir, halibut[0].abspath))
]
)
html_fixer = Builder(action = fix_html, suffix = '.html', src_suffix = '.html')
env.Append(BUILDERS = {'Halibut' : html_builder})
env.Append(BUILDERS = {'Halibut' : html_builder, 'FixHTML': html_fixer})
html = env.Halibut(htmls, [config_but] + buts)
fixed_html = env.FixHTML(fixed_htmls, htmls)
env.Depends(html, halibut)
env.DistributeDocs('', build_dir + '/style.css')
env.DistributeDocs('', htmls)
env.Depends(fixed_html, html)
env.DistributeDocs('#Docs/style.css')
env.DistributeDocs(fixed_html)

View file

@ -10,7 +10,7 @@ This callback will be called just before the first page is loaded and the instal
Example:
\c !include "${NSISDIR}\Include\WinMessages.nsh"
\c !include "WinMessages.nsh"
\c
\c Function .onGUIInit
\c # 1028 is the id of the branding text control

View file

@ -86,4 +86,4 @@ To extend a command over multiple lines, use a backslash (\\) at the end of the
\\<b\\>Configuration file\\</b\\>
If a file named "nsisconf.nsh" in the same directory as makensis.exe exists, it will be included by default before any scripts (unless the /NOCONFIG command line parameter is used).
If a file named "nsisconf.nsh" in the config directory exists, it will be included by default before any scripts (unless the /NOCONFIG command line parameter is used). The config directory on Windows is the same directory as makensis.exe is in. On other platforms this is set at install time and defaults to $PREFIX/etc/. You can alter this at runtime, see \k{usageenvironment} for more information.

View file

@ -19,7 +19,7 @@ If you want to use MakeNSIS on the command line, the syntax of the makensis comm
\b /PAUSE makes makensis pause before quitting, which is useful when executing directly from Windows.
\b /NOCONFIG disables inclusion of <path to makensis.exe>\\nsisconf.nsh. Without this parameter, installer defaults are set from nsisconf.nsh.
\b /NOCONFIG disables inclusion of nsisconf.nsh. Without this parameter, installer defaults are set from nsisconf.nsh.
\b /CMDHELP prints basic usage information for command (if specified), or all commands (if command is not specified).
@ -39,6 +39,14 @@ If you want to use MakeNSIS on the command line, the syntax of the makensis comm
\b If multiple scripts are specified, they are treated as one concatenated script.
\S1{usageenvironment} Environment variables
makensis checks a number of environment variables that tell it where to locate the things it needs in order to create installers. These variables include:
\b NSISDIR, NSISCONFDIR - Places where nsis data and config files are installed. NSISDIR alters the script variable $\{NSISDIR\}. See \k{varconstant} for more info.
\b APPDATA (on Windows) or HOME (on other platforms) - Location of the per-user configuration file.
\S1{usageexamples} Examples
Basic usage:

View file

@ -77,7 +77,9 @@ The location of the installer executable (technically you can modify this variab
\e{$\{NSISDIR\}}
A symbol that contains the path where NSIS is installed. Detected at compile time. Useful if you want to call resources that are in NSIS directory e.g. Icons, UIs...
A symbol that contains the path where NSIS is installed. Useful if you want to call resources that are in NSIS directory e.g. Icons, UIs etc.
When compiled with support for keeping makensis and the data in the same place (the default on Windows), it is in the same place as makensis, on other platforms it is set at compile time (See the INSTALL file for info). In both instances you can modify it at runtime by setting the NSISDIR environment variable. See \k{usageenvironment} for more info.
\e{$WINDIR}

View file

@ -42,5 +42,5 @@ mui_examples = [
Import('env')
env.DistributeExamples('', examples)
env.DistributeExamples('Modern UI', mui_examples)
env.DistributeExamples(examples)
env.DistributeExamples(mui_examples, path='Modern UI')

View file

@ -53,6 +53,15 @@ This is a trimmed version of Appendix "Building NSIS" of the documentation.
drop it in a downloaded precompiled package such as the nightly
build.
* Options for POSIX installs
PREFIX: defaults to /usr/local
PREFIX_BIN: Where to put native binaries. Defaults to $PREFIX/bin/
PREFIX_CONF: Where to put the config file. Defaults to $PREFIX/etc/
PREFIX_DATA: Where to put the plugins, stubs, etc. Defaults to $PREFIX/share/nsis/
PREFIX_DOC: Where to put the docs and examples. Defaults to $PREFIX/share/doc/nsis/
PREFIX_DEST: The install root Useful for packagers. Defaults to the root directory.
- Problems
* Get help in the forum:

View file

@ -14,5 +14,5 @@ includes = Split("""
Import('env')
env.Distribute('Include', includes)
env.DistributeDocs('StrFunc', 'StrFunc.txt')
env.DistributeInclude(includes)
env.DistributeDocs('StrFunc.txt', path='StrFunc')

View file

@ -399,6 +399,14 @@ cfg.Add(
)
)
cfg.Add(
BoolOption(
'NSIS_CONFIG_CONST_DATA_PATH',
'determines if plugins, includes, stubs etc. are located in a constant path set at build-time',
defenv['PLATFORM'] != 'win32'
)
)
### Generate help
Help(cfg.GenerateHelpText(defenv))
@ -467,3 +475,4 @@ AddBoolDefine('NSIS_SUPPORT_STANDARD_PREDEFINES')
AddBoolDefine('NSIS_LOCKWINDOW_SUPPORT')
AddBoolDefine('NSIS_CONFIG_PLUGIN_SUPPORT')
AddBoolDefine('NSIS_FIX_COMMENT_HANDLING')
AddBoolDefine('NSIS_CONFIG_CONST_DATA_PATH')

View file

@ -56,6 +56,11 @@ misc = [
'VPatch'
]
doc = [
'TODO.txt',
'license.txt'
]
defenv = Environment()
Export('defenv')
@ -79,6 +84,30 @@ cvs_version = strftime('%d-%b-%Y.cvs', gmtime())
opts = Options()
install_dirs = {
'win32': {
'dest': '',
'prefix': '',
'conf': '$PREFIX',
'bin': '$PREFIX',
'data': '$PREFIX',
'doc': '$PREFIX',
},
'default': {
'dest': '',
'prefix': '/usr/local',
'conf': '$PREFIX/etc',
'bin': '$PREFIX/bin',
'data': '$PREFIX/share/nsis',
'doc': '$PREFIX/share/doc/nsis',
}
}
if defenv['PLATFORM'] in install_dirs:
dirs = install_dirs[defenv['PLATFORM']]
else:
dirs = install_dirs['default']
# version
opts.Add(('VERSION', 'Version of NSIS', cvs_version))
opts.Add(('VER_MAJOR', 'Major version of NSIS (recommended for dist-installer)', None))
@ -86,11 +115,12 @@ opts.Add(('VER_MINOR', 'Minor version of NSIS (recommended for dist-installer)',
opts.Add(('VER_REVISION', 'Revision of NSIS (recommended for dist-installer)', None))
opts.Add(('VER_BUILD', 'Build version of NSIS (recommended for dist-installer)', None))
# installation
opts.Add(PathOption('PREFIX', 'Installation prefix', None))
opts.Add(('PREFIX', 'Installation prefix', dirs['prefix']))
opts.Add(ListOption('SKIPSTUBS', 'A list of stubs that will not be built', 'none', stubs))
opts.Add(ListOption('SKIPPLUGINS', 'A list of plug-ins that will not be built', 'none', plugins))
opts.Add(ListOption('SKIPUTILS', 'A list of utilities that will not be built', 'none', utils))
opts.Add(ListOption('SKIPMISC', 'A list of plug-ins that will not be built', 'none', misc))
opts.Add(ListOption('SKIPDOC', 'A list of doc files that will not be built/installed', 'none', doc))
# build tools
opts.Add(BoolOption('MSTOOLKIT', 'Use Microsoft Visual C++ Toolkit', 'no'))
opts.Add(BoolOption('CHMDOCS', 'Build CHM documentation, requires hhc.exe', hhc))
@ -99,6 +129,12 @@ opts.Add(PathOption('LIBPATH', 'Path to search for libraries', None))
# build options
opts.Add(BoolOption('DEBUG', 'Build executables with debugging information', 'no'))
opts.Add(PathOption('CODESIGNER', 'A program used to sign executables', None))
# path related build options
opts.Add(('PREFIX_DEST', 'Intermediate installation prefix (extra install time prefix)', dirs['dest']))
opts.Add(('PREFIX_CONF', 'Path to install nsisconf.nsh to', dirs['conf']))
opts.Add(('PREFIX_BIN', 'Path to install native binaries to', dirs['bin']))
opts.Add(('PREFIX_DATA', 'Path to install nsis data to (plugins, includes, stubs, contrib, win32 binaries)', dirs['data']))
opts.Add(('PREFIX_DOC','Path to install nsis README / INSTALL / TODO files to.', dirs['doc']))
opts.Update(defenv)
@ -123,36 +159,74 @@ defenv.Execute(Delete('$ZIPDISTDIR'))
defenv.Execute(Delete('$INSTDISTDIR'))
defenv.Execute(Delete('$TESTDISTDIR'))
def Distribute(dir, files):
defenv.Install('$ZIPDISTDIR/%s' % dir, files)
defenv.Install('$INSTDISTDIR/%s' % dir, files)
defenv.Install('$TESTDISTDIR/%s' % dir, files)
if defenv['PLATFORM'] != 'win32':
defenv.Append(NSIS_CPPDEFINES = [('PREFIX_CONF', defenv['PREFIX_CONF'])])
defenv.Append(NSIS_CPPDEFINES = [('PREFIX_DATA', defenv['PREFIX_DATA'])])
def Distribute(files, names, component, path, subpath, alias, install_alias=None):
if isinstance(files, (str, type(File('SConstruct')))):
files = [files]
files = map(File, files)
if isinstance(names, str):
names = [names]
if not names:
names = map(str, files)
names = map(os.path.basename, names)
for d in ('$ZIPDISTDIR', '$INSTDISTDIR', '$TESTDISTDIR'):
paths = map(lambda file: os.path.join(d, path, subpath, file), names)
defenv.InstallAs(paths, files)
if defenv.has_key('PREFIX') and defenv['PREFIX']:
ins = defenv.Install('$PREFIX/%s' % dir, files)
prefix = '${PREFIX_DEST}${PREFIX_%s}' % component.upper()
paths = map(lambda file: os.path.join(prefix, path, subpath, file), names)
ins = defenv.InstallAs(paths, files)
else:
ins = []
if ins:
defenv.Alias('install', ins)
defenv.Alias('install-%s' % component, ins)
if alias:
defenv.Alias(alias, ins)
if install_alias:
defenv.Alias('install-%s' % install_alias, ins)
return ins
return []
def DistributeBin(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'bin', '', path, alias)
def DistributeAs(path, file):
defenv.InstallAs('$ZIPDISTDIR/%s' % path, file)
defenv.InstallAs('$INSTDISTDIR/%s' % path, file)
defenv.InstallAs('$TESTDISTDIR/%s' % path, file)
def DistributeConf(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'conf', '', path, alias)
if defenv.has_key('PREFIX') and defenv['PREFIX']:
ins = defenv.InstallAs('$PREFIX/%s' % path, file)
return ins
def DistributeW32Bin(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'data', 'Bin', path, alias, 'w32bin')
return []
def DistributeStubs(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'data', 'Stubs', path, alias, 'stubs')
def DistributeExamples(dir, examples):
return Distribute('Examples/%s' % dir, examples)
def DistributePlugin(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'data', 'Plugins', path, alias, 'plugins')
def DistributeDocs(dir, docs):
return Distribute('Docs/%s' % dir, docs)
def DistributeContrib(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'data', 'Contrib', path, alias, 'contrib')
def DistributeContribs(dir, contribs):
return Distribute('Contrib/%s' % dir, contribs)
def DistributeMenu(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'data', 'Menu', path, alias, 'menu')
def DistributeInclude(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'data', 'Include', path, alias, 'includes')
def DistributeDoc(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'doc', '', path, alias)
def DistributeDocs(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'doc', 'Docs', path, alias, 'docs')
def DistributeExamples(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'doc', 'Examples', path, alias, 'examples')
def Sign(targets):
if defenv.has_key('CODESIGNER'):
@ -164,10 +238,17 @@ def TestScript(scripts):
defenv.Install('$TESTDISTDIR/Tests', scripts)
defenv.Distribute = Distribute
defenv.DistributeAs = DistributeAs
defenv.DistributeExamples = DistributeExamples
defenv.DistributeBin = DistributeBin
defenv.DistributeConf = DistributeConf
defenv.DistributeW32Bin = DistributeW32Bin
defenv.DistributeStubs = DistributeStubs
defenv.DistributePlugin = DistributePlugin
defenv.DistributeContrib = DistributeContrib
defenv.DistributeMenu = DistributeMenu
defenv.DistributeInclude = DistributeInclude
defenv.DistributeDoc = DistributeDoc
defenv.DistributeDocs = DistributeDocs
defenv.DistributeContribs = DistributeContribs
defenv.DistributeExamples = DistributeExamples
defenv.Sign = Sign
defenv.TestScript = TestScript
@ -202,22 +283,6 @@ plugin_env = envs[2]
util_env = envs[3]
cp_util_env = envs[4]
######################################################################
####### 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 ###
######################################################################
@ -228,18 +293,28 @@ defenv.Alias('dist-zip', zip_target)
AlwaysBuild(defenv.AddPostAction(zip_target, Delete('$ZIPDISTDIR')))
defenv['INSTVER'] = '/DVERSION=$VERSION'
if defenv['PLATFORM'] == 'win32':
optchar = '/'
else:
optchar = '-'
defenv['INSTVER'] = '%sDVERSION=$VERSION' % optchar
if defenv.has_key('VER_MAJOR') and defenv.has_key('VER_MINOR') \
and defenv.has_key('VER_REVISION') and defenv.has_key('VER_BUILD'):
defenv['INSTVER'] += ' /DVER_MAJOR=$VER_MAJOR'
defenv['INSTVER'] += ' /DVER_MINOR=$VER_MINOR'
defenv['INSTVER'] += ' /DVER_REVISION=$VER_REVISION'
defenv['INSTVER'] += ' /DVER_BUILD=$VER_BUILD'
defenv['INSTVER'] += ' %sDVER_MAJOR=$VER_MAJOR' % optchar
defenv['INSTVER'] += ' %sDVER_MINOR=$VER_MINOR' % optchar
defenv['INSTVER'] += ' %sDVER_REVISION=$VER_REVISION' % optchar
defenv['INSTVER'] += ' %sDVER_BUILD=$VER_BUILD' % optchar
inst_env = {}
inst_env['NSISDIR'] = os.path.abspath(str(defenv['INSTDISTDIR']))
inst_env['NSISCONFDIR'] = os.path.abspath(str(defenv['INSTDISTDIR']))
installer_target = defenv.Command('nsis-${VERSION}-setup${DISTSUFFIX}.exe',
'$INSTDISTDIR' + os.sep + 'Examples' + os.sep + 'makensis.nsi',
'$INSTDISTDIR' + os.sep + 'makensis$PROGSUFFIX ' +
'/DOUTFILE=$TARGET.abspath $INSTVER $SOURCE')
'%sDOUTFILE=$TARGET.abspath $INSTVER $SOURCE' % optchar,
ENV = inst_env)
defenv.Depends(installer_target, '$INSTDISTDIR')
defenv.Sign(installer_target)
defenv.Alias('dist-installer', installer_target)
@ -252,8 +327,12 @@ defenv.Alias('dist', ['dist-zip', 'dist-installer'])
####### Distribute Basics ###
######################################################################
defenv.Distribute('', 'license.txt')
defenv.Distribute('', 'nsisconf.nsh')
for d in doc:
if d in defenv['SKIPDOC']:
continue
defenv.DistributeDoc(d)
defenv.DistributeConf('nsisconf.nsh')
######################################################################
####### Stubs ###
@ -273,7 +352,7 @@ def BuildStub(compression, solid):
target = defenv.SConscript(dirs = 'Source/exehead', build_dir = build_dir, duplicate = False, exports = exports)
env.SideEffect('%s/stub_%s.map' % (build_dir, stub), target)
env.DistributeAs('Stubs/%s%s' % (compression, suffix), target)
env.DistributeStubs(target, names=compression+suffix)
defenv.Alias(compression, target)
defenv.Alias('stubs', target)
@ -285,7 +364,7 @@ for stub in stubs:
BuildStub(stub, False)
BuildStub(stub, True)
defenv.DistributeAs('Stubs/uninst', 'Source/exehead/uninst.ico')
defenv.DistributeStubs('Source/exehead/uninst.ico',names='uninst')
######################################################################
####### makensis ###
@ -300,8 +379,7 @@ makensis_env.SideEffect('%s/makensis.map' % build_dir, makensis)
defenv.Alias('makensis', makensis)
ins = defenv.Distribute('', makensis)
defenv.Alias('install-compiler', ins)
ins = defenv.DistributeBin(makensis,alias='install-compiler')
######################################################################
####### Common Functions ###
@ -331,9 +409,9 @@ def CleanMap(env, target, target_name):
def DistributeExtras(env, target, examples, docs):
if examples:
env.DistributeExamples(target, examples)
env.DistributeExamples(examples, path=target)
if docs:
env.DistributeDocs(target, docs)
env.DistributeDocs(docs, path=target)
######################################################################
####### Plug-ins ###
@ -360,7 +438,11 @@ def BuildPlugin(target, source, libs, examples = None, docs = None,
CleanMap(env, plugin, target)
env.Distribute('Plugins', plugin)
for i in plugin:
if str(i)[-4:].lower() == '.dll':
plugin = i
break
env.DistributePlugin(plugin)
DistributeExtras(env, target, examples, docs)
@ -380,8 +462,9 @@ for plugin in plugins:
def BuildUtil(target, source, libs, entry = None, res = None,
resources = None, defines = None, flags = None,
nodeflib = False, install = None, install_as = None,
examples = None, docs = None, cross_platform = False):
nodeflib = False, file_name = '', path='', contrib = False,
examples = None, docs = None, cross_platform = False,
root_util = False):
if not cross_platform:
env = util_env.Copy()
else:
@ -391,6 +474,9 @@ def BuildUtil(target, source, libs, entry = None, res = None,
AppendRES(env, source, res, resources)
if file_name != '':
target = "%s/%s" % (target, file_name)
util = env.Program(target, source, LIBS = libs)
defenv.Alias(target, util)
defenv.Alias('utils', util)
@ -399,13 +485,12 @@ def BuildUtil(target, source, libs, entry = None, res = None,
CleanMap(env, util, target)
if install is not None:
ins = env.Distribute(install, util)
defenv.Alias('install-utils', ins)
if install_as is not None:
ins = env.DistributeAs(install_as, util)
defenv.Alias('install-utils', ins)
if contrib:
ins = env.DistributeContrib(util, path=path, alias='install-utils')
elif cross_platform and not env['PLATFORM'] == 'win32' or root_util and env['PLATFORM'] == 'win32':
ins = env.DistributeBin(util, path=path, alias='install-utils')
else:
ins = env.DistributeW32Bin(util, path=path, alias='install-utils')
DistributeExtras(env, target, examples, docs)
@ -496,6 +581,8 @@ defenv.Ignore('$BUILD_PREFIX', '$BUILD_PREFIX/tests')
# test scripts
test_env = defenv.Copy(ENV = os.environ) # env needed for some scripts
test_env['ENV']['NSISDIR'] = os.path.abspath(str(defenv['TESTDISTDIR']))
test_env['ENV']['NSISCONFDIR'] = os.path.abspath(str(defenv['TESTDISTDIR']))
def test_scripts(target, source, env):
from os import walk, sep

View file

@ -243,6 +243,10 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS");
definedlist.add("NSIS_FIX_DEFINES_IN_STRINGS");
#endif
#ifdef NSIS_CONFIG_CONST_DATA_PATH
definedlist.add("NSIS_CONFIG_CONST_DATA_PATH");
#endif
db_opt_save=db_comp_save=db_full_size=db_opt_save_u=db_comp_save_u=db_full_size_u=0;
// Added by Amir Szekely 31st July 2002
@ -463,18 +467,24 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS");
void CEXEBuild::initialize(const char *makensis_path)
{
string nsis_dir = get_executable_dir(makensis_path);
definedlist.add("NSISDIR",nsis_dir.c_str());
string nsis_dir;
const char *dir = getenv("NSISDIR");
if (dir) nsis_dir = dir;
else {
#ifndef NSIS_CONFIG_CONST_DATA_PATH
nsis_dir = get_executable_dir(makensis_path);
#else
nsis_dir = CONST_STR(PREFIX_DATA);
#endif
}
definedlist.add("NSISDIR", nsis_dir.c_str());
string includes_dir = nsis_dir;
includes_dir += PLATFORM_PATH_SEPARATOR_STR;
includes_dir += "Include";
includes_dir += PLATFORM_PATH_SEPARATOR_STR"Include";
include_dirs.add(includes_dir.c_str(),0);
stubs_dir = nsis_dir;
stubs_dir += PLATFORM_PATH_SEPARATOR_STR;
stubs_dir += "Stubs";
stubs_dir += PLATFORM_PATH_SEPARATOR_STR"Stubs";
if (set_compressor("zlib", false) != PS_OK)
{
@ -3156,19 +3166,11 @@ void CEXEBuild::build_plugin_table(void)
plugin_used = false;
uninst_plugin_used = false;
char* nsisdir = definedlist.find("NSISDIR");
if (nsisdir)
{
char* searchPath = new char [strlen(nsisdir)+9];
if (searchPath)
{
sprintf(searchPath,"%s" PLATFORM_PATH_SEPARATOR_STR "Plugins",nsisdir);
INFO_MSG("Processing plugin dlls: \"%s" PLATFORM_PATH_SEPARATOR_STR "*.dll\"\n",searchPath);
m_plugins.FindCommands(searchPath, display_info?true:false);
INFO_MSG("\n");
delete[] searchPath;
}
}
string searchPath = definedlist.find("NSISDIR");
searchPath += PLATFORM_PATH_SEPARATOR_STR"Plugins";
INFO_MSG("Processing plugin dlls: \"%s" PLATFORM_PATH_SEPARATOR_STR "*.dll\"\n",searchPath.c_str());
m_plugins.FindCommands(searchPath, display_info?true:false);
INFO_MSG("\n");
}
#define FLAG_OFFSET(flag) (FIELD_OFFSET(exec_flags, flag)/sizeof(int))

View file

@ -390,8 +390,17 @@ int main(int argc, char **argv)
if (!g_noconfig)
{
g_noconfig=1;
string main_conf = get_executable_dir(argv[0]) + PLATFORM_PATH_SEPARATOR_STR + "nsisconf.nsh";
string main_conf;
char* env_var = getenv("NSISCONFDIR");
if(env_var == NULL)
#ifndef NSIS_CONFIG_CONST_DATA_PATH
main_conf = get_executable_dir(argv[0]);
#else
main_conf = CONST_STR(PREFIX_CONF);
#endif
else main_conf = env_var;
main_conf += PLATFORM_PATH_SEPARATOR_STR;
main_conf += "nsisconf.nsh";
if (process_config(build, main_conf))
return 1;