NSIS/SCons/Config/ms
kichik cc12f76610 not sure how this ever worked, but it's LIBPATH that needs to be modified and LIB in the OS environment
maybe older versions of scons read LIB after environment construction too?

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6270 212acab6-be3b-0410-9dea-997c60f758d6
2012-10-15 02:34:25 +00:00

263 lines
7.1 KiB
Text

print "Using Microsoft tools configuration"
Import('defenv')
### flags
import SCons
if SCons.__version__ == '1.3.0':
# workaround for http://scons.tigris.org/issues/show_bug.cgi?id=2614
# force inclusion of Platform SDK, sometimes ignored by SCons 1.3.0 due to environment contamination
defenv.Tool('mssdk')
def entry(x,u):
if x == 'WinMain' and u:
x = 'w' + x
return '/entry:' + x
defenv['ENTRY_FLAG'] = entry
defenv['MAP_FLAG'] = '/map'
defenv['NODEFLIBS_FLAG'] = '/NODEFAULTLIB'
defenv['C_FLAG'] = '/TC'
defenv['CPP_FLAG'] = '/TP'
defenv['CPP_REQUIRES_STDLIB'] = 0
defenv['SUBSYS_CON'] = '/subsystem:console'
defenv['SUBSYS_WIN'] = '/subsystem:windows'
defenv['MSVCRT_FLAG'] = '/MD'
defenv['STDCALL'] = '__stdcall'
msvs_version = float(defenv['MSVS_VERSION'].replace('Exp',''))
if msvs_version >= 8.0:
defenv['EXCEPTION_FLAG'] = '/EHsc'
defenv.Append(CCFLAGS = ['/GS-'])
defenv.Append(CPPDEFINES = ['_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_WARNINGS', '_CRT_SECURE_NO_DEPRECATE', '_CRT_NON_CONFORMING_SWPRINTFS'])
else:
defenv['EXCEPTION_FLAG'] = '/GX'
if msvs_version < 10.0:
# not even /ALIGN:512 works for vc10... fails to load process
defenv.Append(LINKFLAGS = ['/opt:nowin98'])
### defines
defenv.Append(CPPDEFINES = [('NSISCALL', '$STDCALL')])
### asm
defenv.Append(ASFLAGS = ['/coff'])
### debug
if defenv['DEBUG']:
defenv.Append(CCFLAGS = ['/Zi'])
defenv.Append(CCFLAGS = ['/Fd${TARGET.dir}\\${TARGET.dir.file}.pdb'])
defenv.Append(LINKFLAGS = ['/debug'])
### unicode
tdefenv = defenv.Clone()
if tdefenv['UNICODE']:
tdefenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE'])
### workarounds
# Some Platform SDK version includes a bad version of libcp.lib.
# if stl usage causes link failure, copy the good libcp.lib
# from one of the other lib folders and use it instead.
confenv = defenv.Clone()
conf = confenv.Configure()
# For VS 2005 and up, the single threaded version of C runtime
# need not be explicitly linked.
if float(defenv['MSVS_VERSION'].replace('Exp','')) < 8.0:
libcptest = """
#include <fstream>
int main() {
// %s
std::ofstream header("test", std::ofstream::out);
return 0;
}
"""
conf.env.Prepend(LIBPATH = Dir('#/.sconf_temp').abspath)
conf.env.Append(CCFLAGS = ['$EXCEPTION_FLAG'])
if not conf.TryLink(libcptest % 'no change', '.cpp'):
import os, shutil
libdirs = (defenv['ENV']['LIB']).split(os.pathsep) + defenv['LIBPATH']
for libdir in libdirs:
libdir = confenv.subst(libdir)
try:
libcp = r'%s\libcp.lib' % libdir
shutil.copy(libcp, Dir('#/.sconf_temp').abspath)
if conf.TryLink(libcptest % (r'using %s' % libcp), '.cpp'):
defenv.PrependENVPath('LIB', Dir('#/.sconf_temp').abspath)
break
except IOError:
continue
else:
print "*** Couldn't find a good version of libcp.lib"
Exit(2)
conf.Finish()
### stub environment
stub_env = defenv.Clone()
stub_env.Append(CPPPATH = ['#$BUILD_CONFIG'])
if not defenv['DEBUG']:
stub_env.Append(CCFLAGS = ['/O1']) # optimize for size
stub_env.Append(CCFLAGS = ['/W3']) # level 3 warnings
stub_env.Append(CCFLAGS = ['/FAcs']) # full listing files
stub_env.Append(CCFLAGS = ['/Fa${TARGET}.lst']) # listing file name
stub_env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) # no default libraries
stub_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
stub_uenv = stub_env.Clone()
stub_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE'])
### makensis environment
makensis_env = tdefenv.Clone()
makensis_env.Append(CPPPATH = ['#$BUILD_CONFIG'])
if not defenv['DEBUG']:
makensis_env.Append(CCFLAGS = ['/O2']) # optimize for speed
makensis_env.Append(CCFLAGS = ['$EXCEPTION_FLAG']) # enable exceptions
makensis_env.Append(CCFLAGS = ['/W3']) # level 3 warnings
makensis_env.Append(CCFLAGS = ['/FAcs']) # full listing files
makensis_env.Append(CCFLAGS = ['/Fa${TARGET}.lst']) # listing file name
makensis_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
if defenv['UNICODE']:
makensis_env.Append(LINKFLAGS = ['/STACK:2097152']) # need 2 MB of stack in Unicode (default is 1 MB)
### plugin environment
plugin_env = defenv.Clone(no_import_lib = 1)
if not defenv['DEBUG']:
plugin_env.Append(CCFLAGS = ['/O1']) # optimize for size
plugin_env.Append(CCFLAGS = ['/W3']) # level 3 warnings
plugin_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
plugin_uenv = plugin_env.Clone()
plugin_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE'])
### util environment
util_env = tdefenv.Clone()
if not defenv['DEBUG']:
util_env.Append(CCFLAGS = ['/O1']) # optimize for speed
util_env.Append(CCFLAGS = ['/W3']) # level 3 warnings
util_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
### cross-platform util environment
cp_util_env = util_env.Clone()
cp_util_env.Append(CPPPATH = ['#$BUILD_CONFIG'])
### test environment
test_env = defenv.Clone()
test_env.Append(CPPPATH = ['#$BUILD_CONFIG'])
### weird compiler requirements
def check_requirement(ctx, func, trigger):
ctx.Message('Checking for %s requirement... ' % func)
flags = ctx.env['LINKFLAGS']
ctx.env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG'])
ctx.env.Append(LINKFLAGS = ['/entry:main'])
test = """
int main() {
%s
return 0;
}
""" % trigger
result = not ctx.TryLink(test, '.c')
ctx.Result(result)
ctx.env['LINKFLAGS'] = flags
return result
def add_file_to_emitter(env, emitter_name, file):
try:
original_emitter = env[emitter_name]
if type(original_emitter) == list:
original_emitter = original_emitter[0]
except KeyError:
original_emitter = None
def emitter(target, source, env):
if original_emitter:
target, source = original_emitter(target, source, env)
if '$NODEFLIBS_FLAG' not in env['LINKFLAGS']:
return target, source
return target, source + env.Object(emitter_name, file)
env[emitter_name] = emitter
def add_file(file):
file = File(file)
add_file_to_emitter(stub_env, 'PROGEMITTER', file)
add_file_to_emitter(stub_uenv, 'PROGEMITTER', file)
add_file_to_emitter(util_env, 'PROGEMITTER', file)
add_file_to_emitter(plugin_env, 'SHLIBEMITTER', file)
add_file_to_emitter(plugin_uenv, 'SHLIBEMITTER', file)
#
# MSVC 6 SP6 doesn't like direct shifting of 64-bit integers.
# It generates a call to ___aullshr which requires libc, which
# we don't like. However, it does agree to work properly with
# a call to Int64ShrlMod32.
#
conf = stub_env.Configure()
int64test = """
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow) {
ULARGE_INTEGER *i = 0;
return (int)(i->QuadPart >> 10);
}
"""
if not conf.TryLink(int64test, '.c'):
stub_env.Append(CPPDEFINES = ['_NSIS_NO_INT64_SHR'])
stub_uenv.Append(CPPDEFINES = ['_NSIS_NO_INT64_SHR'])
conf.Finish()
#
# MSVC 2005 requires the memset CRT function to be present
#
conf = defenv.Configure(custom_tests = { 'CheckRequirement' : check_requirement })
if conf.CheckRequirement('memset', 'char c[128] = "test";'):
add_file('memset.c')
conf.Finish()
### return
Return('stub_env makensis_env plugin_env util_env cp_util_env test_env stub_uenv plugin_uenv')