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) return map(lambda x: '%s/%s' % (prefix, x), list)
def dist(dir, files): 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('Checks', checks)
dist('Header', headers) dist('Header', headers)

View file

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

View file

@ -12,4 +12,4 @@ libs = Split("""
Import('BuildUtil') 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') 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') 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, res = res,
resources = resources, resources = resources,
entry = 'WinMain', entry = 'WinMain',
install = '',
defines = ['WIN32_MEAN_AND_LEAN', 'RELEASE=2.0'], 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 /> "parameter">ui_file</span><br />
The interface files with a customized dialog resource IDD_SELCOM The interface files with a customized dialog resource IDD_SELCOM
with a small description area.<br /> 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= <p><strong>MUI_UI_COMPONENTSPAGE_NODESC</strong> <span class=
"parameter">ui_file</span><br /> "parameter">ui_file</span><br />
The interface files with a customized dialog resource IDD_SELCOM The interface files with a customized dialog resource IDD_SELCOM
without a description area.<br /> 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> </div>
<h3><img class="trigger" alt="Open/Close section" id="trigger_inwf" <h3><img class="trigger" alt="Open/Close section" id="trigger_inwf"
src="images/closed.gif" onclick= src="images/closed.gif" onclick=

View file

@ -77,7 +77,9 @@ Import('defenv')
def join(prefix, list): def join(prefix, list):
return map(lambda x: '%s/%s' % (prefix, x), list) return map(lambda x: '%s/%s' % (prefix, x), list)
defenv.DistributeDocs(target, docs) defenv.DistributeDocs(docs, path=target)
defenv.DistributeDocs('%s/%s' % (target, 'images'), join('images', doc_images)) path = 'images'
defenv.DistributeContribs(target, contribs) defenv.DistributeDocs(join(path,doc_images), path='%s/%s'%(target,path))
defenv.DistributeContribs('%s/%s' % (target, 'Language files'), join('Language files', languages)) 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 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('BuildUtil env')
import os import os
@ -46,24 +65,14 @@ import os
#BuildUtil(target, files, libs, libpath = wxlib, cpppath = wxinc, res = rc, resources = resources, install = '', flags = ['/MD']) #BuildUtil(target, files, libs, libpath = wxlib, cpppath = wxinc, res = rc, resources = resources, install = '', flags = ['/MD'])
# install pre-built NSIS.exe # 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) env.Alias('install-utils', ins)
# install menu files # 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.DistributeMenu(html, alias='install-utils')
env.Distribute('Menu/images', '#Menu/images/header.gif') env.DistributeMenu(images, path='images', alias='install-utils')
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')

View file

@ -22,5 +22,5 @@ Import('BuildUtil env')
code = env.Object(code) code = env.Object(code)
for ui in uis: 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) env.Alias('UIs', ui)

View file

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

View file

@ -17,4 +17,4 @@ libs = Split("""
Import('BuildUtil') 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') 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') \ htmls = Split('IndexPage.html Contents.html') \
+ map(lambda ch: 'Chapter' + str(ch + 1) + '.html', range(chapters)) \ + map(lambda ch: 'Chapter' + str(ch + 1) + '.html', range(chapters)) \
+ map(lambda ap: 'Appendix' + chr(ord('A') + ap) + '.html', range(appendices)) + 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' chm_config_but = 'chm_config.but'
@ -55,6 +56,7 @@ buts = Split("""
""") """)
import os import os
import re
Import('halibut env build_chm') Import('halibut env build_chm')
@ -62,6 +64,15 @@ env.Append(ENV = {'PATH' : os.environ['PATH']})
build_dir = Dir(GetBuildPath('.')).abspath 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: if build_chm:
hhc_action = Action('cd "%s" && hhc nsis.hhp' % (build_dir)) hhc_action = Action('cd "%s" && hhc nsis.hhp' % (build_dir))
execute = hhc_action.execute execute = hhc_action.execute
@ -83,7 +94,7 @@ if build_chm:
chm = env.HalibutCHM('NSIS.chm', [chm_config_but] + buts) chm = env.HalibutCHM('NSIS.chm', [chm_config_but] + buts)
env.Depends(chm, halibut) env.Depends(chm, halibut)
env.Distribute('', chm) env.DistributeDoc(chm)
else: else:
html_builder = Builder( html_builder = Builder(
@ -92,10 +103,14 @@ else:
Action('cd "%s" && "%s" ${SOURCES.abspath}' % (build_dir, halibut[0].abspath)) 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) html = env.Halibut(htmls, [config_but] + buts)
fixed_html = env.FixHTML(fixed_htmls, htmls)
env.Depends(html, halibut) env.Depends(html, halibut)
env.DistributeDocs('', build_dir + '/style.css') env.Depends(fixed_html, html)
env.DistributeDocs('', htmls) 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: Example:
\c !include "${NSISDIR}\Include\WinMessages.nsh" \c !include "WinMessages.nsh"
\c \c
\c Function .onGUIInit \c Function .onGUIInit
\c # 1028 is the id of the branding text control \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\\> \\<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 /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). \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. \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 \S1{usageexamples} Examples
Basic usage: Basic usage:

View file

@ -77,7 +77,9 @@ The location of the installer executable (technically you can modify this variab
\e{$\{NSISDIR\}} \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} \e{$WINDIR}

View file

@ -42,5 +42,5 @@ mui_examples = [
Import('env') Import('env')
env.DistributeExamples('', examples) env.DistributeExamples(examples)
env.DistributeExamples('Modern UI', mui_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 drop it in a downloaded precompiled package such as the nightly
build. 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 - Problems
* Get help in the forum: * Get help in the forum:

View file

@ -14,5 +14,5 @@ includes = Split("""
Import('env') Import('env')
env.Distribute('Include', includes) env.DistributeInclude(includes)
env.DistributeDocs('StrFunc', 'StrFunc.txt') 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 ### Generate help
Help(cfg.GenerateHelpText(defenv)) Help(cfg.GenerateHelpText(defenv))
@ -467,3 +475,4 @@ AddBoolDefine('NSIS_SUPPORT_STANDARD_PREDEFINES')
AddBoolDefine('NSIS_LOCKWINDOW_SUPPORT') AddBoolDefine('NSIS_LOCKWINDOW_SUPPORT')
AddBoolDefine('NSIS_CONFIG_PLUGIN_SUPPORT') AddBoolDefine('NSIS_CONFIG_PLUGIN_SUPPORT')
AddBoolDefine('NSIS_FIX_COMMENT_HANDLING') AddBoolDefine('NSIS_FIX_COMMENT_HANDLING')
AddBoolDefine('NSIS_CONFIG_CONST_DATA_PATH')

View file

@ -56,6 +56,11 @@ misc = [
'VPatch' 'VPatch'
] ]
doc = [
'TODO.txt',
'license.txt'
]
defenv = Environment() defenv = Environment()
Export('defenv') Export('defenv')
@ -79,6 +84,30 @@ cvs_version = strftime('%d-%b-%Y.cvs', gmtime())
opts = Options() 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 # version
opts.Add(('VERSION', 'Version of NSIS', cvs_version)) opts.Add(('VERSION', 'Version of NSIS', cvs_version))
opts.Add(('VER_MAJOR', 'Major version of NSIS (recommended for dist-installer)', None)) 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_REVISION', 'Revision of NSIS (recommended for dist-installer)', None))
opts.Add(('VER_BUILD', 'Build version of NSIS (recommended for dist-installer)', None)) opts.Add(('VER_BUILD', 'Build version of NSIS (recommended for dist-installer)', None))
# installation # 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('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('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('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('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 # build tools
opts.Add(BoolOption('MSTOOLKIT', 'Use Microsoft Visual C++ Toolkit', 'no')) opts.Add(BoolOption('MSTOOLKIT', 'Use Microsoft Visual C++ Toolkit', 'no'))
opts.Add(BoolOption('CHMDOCS', 'Build CHM documentation, requires hhc.exe', hhc)) 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 # build options
opts.Add(BoolOption('DEBUG', 'Build executables with debugging information', 'no')) opts.Add(BoolOption('DEBUG', 'Build executables with debugging information', 'no'))
opts.Add(PathOption('CODESIGNER', 'A program used to sign executables', None)) 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) opts.Update(defenv)
@ -123,36 +159,74 @@ defenv.Execute(Delete('$ZIPDISTDIR'))
defenv.Execute(Delete('$INSTDISTDIR')) defenv.Execute(Delete('$INSTDISTDIR'))
defenv.Execute(Delete('$TESTDISTDIR')) defenv.Execute(Delete('$TESTDISTDIR'))
def Distribute(dir, files): if defenv['PLATFORM'] != 'win32':
defenv.Install('$ZIPDISTDIR/%s' % dir, files) defenv.Append(NSIS_CPPDEFINES = [('PREFIX_CONF', defenv['PREFIX_CONF'])])
defenv.Install('$INSTDISTDIR/%s' % dir, files) defenv.Append(NSIS_CPPDEFINES = [('PREFIX_DATA', defenv['PREFIX_DATA'])])
defenv.Install('$TESTDISTDIR/%s' % dir, files)
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']: 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 ins
return [] def DistributeBin(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'bin', '', path, alias)
def DistributeAs(path, file): def DistributeConf(files, names=[], path='', alias=None):
defenv.InstallAs('$ZIPDISTDIR/%s' % path, file) return defenv.Distribute(files, names, 'conf', '', path, alias)
defenv.InstallAs('$INSTDISTDIR/%s' % path, file)
defenv.InstallAs('$TESTDISTDIR/%s' % path, file)
if defenv.has_key('PREFIX') and defenv['PREFIX']: def DistributeW32Bin(files, names=[], path='', alias=None):
ins = defenv.InstallAs('$PREFIX/%s' % path, file) return defenv.Distribute(files, names, 'data', 'Bin', path, alias, 'w32bin')
return ins
return [] def DistributeStubs(files, names=[], path='', alias=None):
return defenv.Distribute(files, names, 'data', 'Stubs', path, alias, 'stubs')
def DistributeExamples(dir, examples): def DistributePlugin(files, names=[], path='', alias=None):
return Distribute('Examples/%s' % dir, examples) return defenv.Distribute(files, names, 'data', 'Plugins', path, alias, 'plugins')
def DistributeDocs(dir, docs): def DistributeContrib(files, names=[], path='', alias=None):
return Distribute('Docs/%s' % dir, docs) return defenv.Distribute(files, names, 'data', 'Contrib', path, alias, 'contrib')
def DistributeContribs(dir, contribs): def DistributeMenu(files, names=[], path='', alias=None):
return Distribute('Contrib/%s' % dir, contribs) 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): def Sign(targets):
if defenv.has_key('CODESIGNER'): if defenv.has_key('CODESIGNER'):
@ -164,10 +238,17 @@ def TestScript(scripts):
defenv.Install('$TESTDISTDIR/Tests', scripts) defenv.Install('$TESTDISTDIR/Tests', scripts)
defenv.Distribute = Distribute defenv.Distribute = Distribute
defenv.DistributeAs = DistributeAs defenv.DistributeBin = DistributeBin
defenv.DistributeExamples = DistributeExamples 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.DistributeDocs = DistributeDocs
defenv.DistributeContribs = DistributeContribs defenv.DistributeExamples = DistributeExamples
defenv.Sign = Sign defenv.Sign = Sign
defenv.TestScript = TestScript defenv.TestScript = TestScript
@ -202,22 +283,6 @@ plugin_env = envs[2]
util_env = envs[3] util_env = envs[3]
cp_util_env = envs[4] 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 ### ####### Distribution ###
###################################################################### ######################################################################
@ -228,18 +293,28 @@ defenv.Alias('dist-zip', zip_target)
AlwaysBuild(defenv.AddPostAction(zip_target, Delete('$ZIPDISTDIR'))) 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') \ if defenv.has_key('VER_MAJOR') and defenv.has_key('VER_MINOR') \
and defenv.has_key('VER_REVISION') and defenv.has_key('VER_BUILD'): and defenv.has_key('VER_REVISION') and defenv.has_key('VER_BUILD'):
defenv['INSTVER'] += ' /DVER_MAJOR=$VER_MAJOR' defenv['INSTVER'] += ' %sDVER_MAJOR=$VER_MAJOR' % optchar
defenv['INSTVER'] += ' /DVER_MINOR=$VER_MINOR' defenv['INSTVER'] += ' %sDVER_MINOR=$VER_MINOR' % optchar
defenv['INSTVER'] += ' /DVER_REVISION=$VER_REVISION' defenv['INSTVER'] += ' %sDVER_REVISION=$VER_REVISION' % optchar
defenv['INSTVER'] += ' /DVER_BUILD=$VER_BUILD' 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', installer_target = defenv.Command('nsis-${VERSION}-setup${DISTSUFFIX}.exe',
'$INSTDISTDIR' + os.sep + 'Examples' + os.sep + 'makensis.nsi', '$INSTDISTDIR' + os.sep + 'Examples' + os.sep + 'makensis.nsi',
'$INSTDISTDIR' + os.sep + 'makensis$PROGSUFFIX ' + '$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.Depends(installer_target, '$INSTDISTDIR')
defenv.Sign(installer_target) defenv.Sign(installer_target)
defenv.Alias('dist-installer', installer_target) defenv.Alias('dist-installer', installer_target)
@ -252,8 +327,12 @@ defenv.Alias('dist', ['dist-zip', 'dist-installer'])
####### Distribute Basics ### ####### Distribute Basics ###
###################################################################### ######################################################################
defenv.Distribute('', 'license.txt') for d in doc:
defenv.Distribute('', 'nsisconf.nsh') if d in defenv['SKIPDOC']:
continue
defenv.DistributeDoc(d)
defenv.DistributeConf('nsisconf.nsh')
###################################################################### ######################################################################
####### Stubs ### ####### Stubs ###
@ -273,7 +352,7 @@ def BuildStub(compression, solid):
target = defenv.SConscript(dirs = 'Source/exehead', build_dir = build_dir, duplicate = False, exports = exports) 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.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(compression, target)
defenv.Alias('stubs', target) defenv.Alias('stubs', target)
@ -285,7 +364,7 @@ for stub in stubs:
BuildStub(stub, False) BuildStub(stub, False)
BuildStub(stub, True) BuildStub(stub, True)
defenv.DistributeAs('Stubs/uninst', 'Source/exehead/uninst.ico') defenv.DistributeStubs('Source/exehead/uninst.ico',names='uninst')
###################################################################### ######################################################################
####### makensis ### ####### makensis ###
@ -300,8 +379,7 @@ makensis_env.SideEffect('%s/makensis.map' % build_dir, makensis)
defenv.Alias('makensis', makensis) defenv.Alias('makensis', makensis)
ins = defenv.Distribute('', makensis) ins = defenv.DistributeBin(makensis,alias='install-compiler')
defenv.Alias('install-compiler', ins)
###################################################################### ######################################################################
####### Common Functions ### ####### Common Functions ###
@ -331,9 +409,9 @@ def CleanMap(env, target, target_name):
def DistributeExtras(env, target, examples, docs): def DistributeExtras(env, target, examples, docs):
if examples: if examples:
env.DistributeExamples(target, examples) env.DistributeExamples(examples, path=target)
if docs: if docs:
env.DistributeDocs(target, docs) env.DistributeDocs(docs, path=target)
###################################################################### ######################################################################
####### Plug-ins ### ####### Plug-ins ###
@ -360,7 +438,11 @@ def BuildPlugin(target, source, libs, examples = None, docs = None,
CleanMap(env, plugin, target) 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) DistributeExtras(env, target, examples, docs)
@ -380,8 +462,9 @@ for plugin in plugins:
def BuildUtil(target, source, libs, entry = None, res = None, def BuildUtil(target, source, libs, entry = None, res = None,
resources = None, defines = None, flags = None, resources = None, defines = None, flags = None,
nodeflib = False, install = None, install_as = None, nodeflib = False, file_name = '', path='', contrib = False,
examples = None, docs = None, cross_platform = False): examples = None, docs = None, cross_platform = False,
root_util = False):
if not cross_platform: if not cross_platform:
env = util_env.Copy() env = util_env.Copy()
else: else:
@ -391,6 +474,9 @@ def BuildUtil(target, source, libs, entry = None, res = None,
AppendRES(env, source, res, resources) AppendRES(env, source, res, resources)
if file_name != '':
target = "%s/%s" % (target, file_name)
util = env.Program(target, source, LIBS = libs) util = env.Program(target, source, LIBS = libs)
defenv.Alias(target, util) defenv.Alias(target, util)
defenv.Alias('utils', util) defenv.Alias('utils', util)
@ -399,13 +485,12 @@ def BuildUtil(target, source, libs, entry = None, res = None,
CleanMap(env, util, target) CleanMap(env, util, target)
if install is not None: if contrib:
ins = env.Distribute(install, util) ins = env.DistributeContrib(util, path=path, alias='install-utils')
defenv.Alias('install-utils', ins) elif cross_platform and not env['PLATFORM'] == 'win32' or root_util and env['PLATFORM'] == 'win32':
ins = env.DistributeBin(util, path=path, alias='install-utils')
if install_as is not None: else:
ins = env.DistributeAs(install_as, util) ins = env.DistributeW32Bin(util, path=path, alias='install-utils')
defenv.Alias('install-utils', ins)
DistributeExtras(env, target, examples, docs) DistributeExtras(env, target, examples, docs)
@ -496,6 +581,8 @@ defenv.Ignore('$BUILD_PREFIX', '$BUILD_PREFIX/tests')
# test scripts # test scripts
test_env = defenv.Copy(ENV = os.environ) # env needed for some 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): def test_scripts(target, source, env):
from os import walk, sep 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"); definedlist.add("NSIS_FIX_DEFINES_IN_STRINGS");
#endif #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; 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 // 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) void CEXEBuild::initialize(const char *makensis_path)
{ {
string nsis_dir = get_executable_dir(makensis_path); string nsis_dir;
const char *dir = getenv("NSISDIR");
definedlist.add("NSISDIR",nsis_dir.c_str()); 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; string includes_dir = nsis_dir;
includes_dir += PLATFORM_PATH_SEPARATOR_STR; includes_dir += PLATFORM_PATH_SEPARATOR_STR"Include";
includes_dir += "Include";
include_dirs.add(includes_dir.c_str(),0); include_dirs.add(includes_dir.c_str(),0);
stubs_dir = nsis_dir; stubs_dir = nsis_dir;
stubs_dir += PLATFORM_PATH_SEPARATOR_STR; stubs_dir += PLATFORM_PATH_SEPARATOR_STR"Stubs";
stubs_dir += "Stubs";
if (set_compressor("zlib", false) != PS_OK) if (set_compressor("zlib", false) != PS_OK)
{ {
@ -3156,19 +3166,11 @@ void CEXEBuild::build_plugin_table(void)
plugin_used = false; plugin_used = false;
uninst_plugin_used = false; uninst_plugin_used = false;
char* nsisdir = definedlist.find("NSISDIR"); string searchPath = definedlist.find("NSISDIR");
if (nsisdir) searchPath += PLATFORM_PATH_SEPARATOR_STR"Plugins";
{ INFO_MSG("Processing plugin dlls: \"%s" PLATFORM_PATH_SEPARATOR_STR "*.dll\"\n",searchPath.c_str());
char* searchPath = new char [strlen(nsisdir)+9]; m_plugins.FindCommands(searchPath, display_info?true:false);
if (searchPath) INFO_MSG("\n");
{
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;
}
}
} }
#define FLAG_OFFSET(flag) (FIELD_OFFSET(exec_flags, flag)/sizeof(int)) #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) if (!g_noconfig)
{ {
g_noconfig=1; g_noconfig=1;
string main_conf;
string main_conf = get_executable_dir(argv[0]) + PLATFORM_PATH_SEPARATOR_STR + "nsisconf.nsh"; 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)) if (process_config(build, main_conf))
return 1; return 1;