From eceb3ce33370b6e525a8967e78efcd0cc01ab93a Mon Sep 17 00:00:00 2001 From: kichik Date: Fri, 12 Dec 2008 16:33:25 +0000 Subject: [PATCH] - create plugin.lib that contains all - distribute plugin.h, api.h and plugin.lib - remove inc_c stuff because we don't really want to install win32 header files as something that can be used on linux (this should be revisited later) - fix up MakeFileList for newer versions of SCons (should be removed in the future) git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5826 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/ExDLL/SConscript | 31 +++++++++++++++------ Contrib/ExDLL/plugin.c | 41 ++++++++++++++++++++++++++++ Contrib/ExDLL/plugin.h | 59 ++++++++++++++++++++++++++++++++++++++++ Examples/makensis.nsi | 5 +++- SConstruct | 50 ++++++++++++++++------------------ 5 files changed, 150 insertions(+), 36 deletions(-) create mode 100644 Contrib/ExDLL/plugin.c create mode 100644 Contrib/ExDLL/plugin.h diff --git a/Contrib/ExDLL/SConscript b/Contrib/ExDLL/SConscript index 7bee5ab6..a209355e 100644 --- a/Contrib/ExDLL/SConscript +++ b/Contrib/ExDLL/SConscript @@ -1,7 +1,15 @@ # FIXME: install assembly and pascal includes into the correct locations -c_devel = Split(""" - exdll.h +lib_target = "plugin" + +lib_files = Split(""" + plugin.c +""") + +api_files = Split(""" + plugin.h + plugin.lib + #Source/exehead/api.h """) example = Split(""" @@ -14,12 +22,19 @@ example = Split(""" extdll.inc """) -Import('defenv') +Import('env plugin_env') -if defenv['PLATFORM'] == 'win32': - example += c_devel -else: - defenv.DistributeIncC(c_devel) +# build library -defenv.DistributeExamples(example, path='Plugin') +api_env = env.Clone() +api_env.Append(CPPPATH = ['#Source/exehead']) +lib = api_env.Library(lib_target, lib_files) +# distribute library, files and examples + +env.DistributeExamples(example + api_files + lib, path='Plugin') + +# make sure all the other plug-ins can use the library + +plugin_env.Append(LIBPATH = [lib[0].dir]) +plugin_env.Append(LIBS = [lib_target]) diff --git a/Contrib/ExDLL/plugin.c b/Contrib/ExDLL/plugin.c new file mode 100644 index 00000000..945aa166 --- /dev/null +++ b/Contrib/ExDLL/plugin.c @@ -0,0 +1,41 @@ +#include + +#include "plugin.h" + +unsigned int g_stringsize; +stack_t **g_stacktop; +char *g_variables; + +// utility functions (not required but often useful) +int NSISCALL popstring(char *str) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + lstrcpyA(str,th->text); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +void NSISCALL pushstring(const char *str) +{ + stack_t *th; + if (!g_stacktop) return; + th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize); + lstrcpynA(th->text,str,g_stringsize); + th->next=*g_stacktop; + *g_stacktop=th; +} + +char * NSISCALL getuservariable(const int varnum) +{ + if (varnum < 0 || varnum >= __INST_LAST) return NULL; + return g_variables+varnum*g_stringsize; +} + +void NSISCALL setuservariable(const int varnum, const char *var) +{ + if (var != NULL && varnum >= 0 && varnum < __INST_LAST) + lstrcpyA(g_variables + varnum*g_stringsize, var); +} diff --git a/Contrib/ExDLL/plugin.h b/Contrib/ExDLL/plugin.h new file mode 100644 index 00000000..b7759dc0 --- /dev/null +++ b/Contrib/ExDLL/plugin.h @@ -0,0 +1,59 @@ +#ifndef ___NSIS_PLUGIN__H___ +#define ___NSIS_PLUGIN__H___ + +#include "api.h" + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; \ + g_variables=variables; } + +typedef struct _stack_t { + struct _stack_t *next; + char text[1]; // this should be the length of string_size +} stack_t; + +enum +{ +INST_0, // $0 +INST_1, // $1 +INST_2, // $2 +INST_3, // $3 +INST_4, // $4 +INST_5, // $5 +INST_6, // $6 +INST_7, // $7 +INST_8, // $8 +INST_9, // $9 +INST_R0, // $R0 +INST_R1, // $R1 +INST_R2, // $R2 +INST_R3, // $R3 +INST_R4, // $R4 +INST_R5, // $R5 +INST_R6, // $R6 +INST_R7, // $R7 +INST_R8, // $R8 +INST_R9, // $R9 +INST_CMDLINE, // $CMDLINE +INST_INSTDIR, // $INSTDIR +INST_OUTDIR, // $OUTDIR +INST_EXEDIR, // $EXEDIR +INST_LANG, // $LANGUAGE +__INST_LAST +}; + +extern unsigned int g_stringsize; +extern stack_t **g_stacktop; +extern char *g_variables; + +int NSISCALL popstring(char *str); // 0 on success, 1 on empty stack +void NSISCALL pushstring(const char *str); +char * NSISCALL getuservariable(const int varnum); +void NSISCALL setuservariable(const int varnum, const char *var); + +#endif//!___NSIS_PLUGIN__H___ diff --git a/Examples/makensis.nsi b/Examples/makensis.nsi index 23982132..f932663e 100644 --- a/Examples/makensis.nsi +++ b/Examples/makensis.nsi @@ -259,11 +259,14 @@ ${MementoSection} "Script Examples" SecExample File ..\Examples\Plugin\exdll.dpr File ..\Examples\Plugin\exdll.dsp File ..\Examples\Plugin\exdll.dsw - File ..\Examples\Plugin\exdll.h File ..\Examples\Plugin\exdll_with_unit.dpr File ..\Examples\Plugin\extdll.inc File ..\Examples\Plugin\nsis.pas + File ..\Examples\Plugin\plugin.h + File ..\Examples\Plugin\plugin.lib + File ..\Examples\Plugin\api.h + ${MementoSectionEnd} !ifndef NO_STARTMENUSHORTCUTS diff --git a/SConstruct b/SConstruct index b9722848..85ae25b0 100644 --- a/SConstruct +++ b/SConstruct @@ -6,6 +6,10 @@ stubs = [ 'zlib' ] +plugin_libs = [ + 'ExDLL' +] + plugins = [ 'AdvSplash', 'Banner', @@ -22,7 +26,7 @@ plugins = [ 'StartMenu', 'System', 'UserInfo', - 'VPatch/Source/Plugin' + 'VPatch/Source/Plugin', ] utils = [ @@ -42,8 +46,7 @@ misc = [ 'MultiUser', 'Modern UI', 'Modern UI 2', - 'VPatch', - 'ExDLL' + 'VPatch' ] doc = [ @@ -104,8 +107,7 @@ install_dirs = { 'conf': '$PREFIX', 'bin': '$PREFIX', 'data': '$PREFIX', - 'doc': '$PREFIX', - 'inc_c': '$PREFIX', + 'doc': '$PREFIX' }, 'static': { 'dest': '', @@ -113,8 +115,7 @@ install_dirs = { 'conf': '$PREFIX/etc', 'bin': '$PREFIX/bin', 'data': '$PREFIX/share/nsis', - 'doc': '$PREFIX/share/doc/nsis', - 'inc_c': '$PREFIX/include/nsis', + 'doc': '$PREFIX/share/doc/nsis' } } @@ -166,7 +167,6 @@ 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.Add(('PREFIX_INC_C','Path to install nsis C header files to.', dirs['inc_c'])) opts.Update(defenv) Help(opts.GenerateHelpText(defenv)) @@ -227,12 +227,7 @@ def SafeFile(f): return f def MakeFileList(files): - from types import ListType, TupleType - - if isinstance(files, (ListType, TupleType)): - return map(SafeFile, files) - - return Flatten([SafeFile(files)]) + return Flatten(File(files)) def Distribute(files, names, component, path, subpath, alias, install_alias=None): from types import StringType @@ -297,9 +292,6 @@ def DistributeDocs(files, names=[], path='', alias=None): def DistributeExamples(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'doc', 'Examples', path, alias, 'examples') -def DistributeIncC(files, names=[], path='', alias=None): - return defenv.Distribute(files, names, 'inc_c', '', path, alias, 'inc-c') - def Sign(targets): if defenv.has_key('CODESIGNER'): for t in targets: @@ -321,7 +313,6 @@ defenv.DistributeInclude = DistributeInclude defenv.DistributeDoc = DistributeDoc defenv.DistributeDocs = DistributeDocs defenv.DistributeExamples = DistributeExamples -defenv.DistributeIncC = DistributeIncC defenv.Sign = Sign defenv.TestScript = TestScript @@ -364,6 +355,8 @@ util_env = envs[3] cp_util_env = envs[4] test_env = envs[5] +Export('stub_env makensis_env plugin_env util_env cp_util_env test_env') + ###################################################################### ####### Distribution ### ###################################################################### @@ -466,11 +459,13 @@ ins = defenv.DistributeBin(makensis,alias='install-compiler') ####### Common Functions ### ###################################################################### -def AddEnvStandardFlags(env, defines, flags, entry, nodeflib): +def AddEnvStandardFlags(env, defines, flags, libs, entry, nodeflib): if defines: env.Append(CPPDEFINES = defines) if flags: env.Append(CCFLAGS = flags) + if libs: + env.Append(LIBS = libs) if entry: env.Append(LINKFLAGS = ['${ENTRY_FLAG("%s")}' % entry]) @@ -508,11 +503,11 @@ def BuildPlugin(target, source, libs, examples = None, docs = None, if cppused and env['CPP_REQUIRES_STDLIB']: nodeflib = False - AddEnvStandardFlags(env, defines, flags, entry, nodeflib) + AddEnvStandardFlags(env, defines, flags, libs, entry, nodeflib) AppendRES(env, source, res, resources) - plugin = env.SharedLibrary(target, source, LIBS = libs) + plugin = env.SharedLibrary(target, source) defenv.Alias(target, plugin) defenv.Alias('plugins', plugin) @@ -528,7 +523,7 @@ def BuildPlugin(target, source, libs, examples = None, docs = None, DistributeExtras(env, target, examples, docs) -for plugin in plugins: +for plugin in plugin_libs + plugins: if plugin in defenv['SKIPPLUGINS']: continue @@ -542,14 +537,15 @@ for plugin in plugins: ####### Utilities ### ###################################################################### -def BuildUtilEnv(defines = None, flags = None, entry = None, - nodeflib = None, cross_platform = False): +def BuildUtilEnv(defines = None, flags = None, libs = None, + entry = None, nodeflib = None, + cross_platform = False): if not cross_platform: env = util_env.Clone() else: env = cp_util_env.Clone() - AddEnvStandardFlags(env, defines, flags, entry, nodeflib) + AddEnvStandardFlags(env, defines, flags, libs, entry, nodeflib) return env @@ -558,7 +554,7 @@ def BuildUtil(target, source, libs, entry = None, res = None, nodeflib = False, file_name = '', path='', contrib = False, examples = None, docs = None, cross_platform = False, root_util = False): - env = BuildUtilEnv(defines, flags, entry, nodeflib, cross_platform) + env = BuildUtilEnv(defines, flags, libs, entry, nodeflib, cross_platform) AppendRES(env, source, res, resources) @@ -570,7 +566,7 @@ def BuildUtil(target, source, libs, entry = None, res = None, if '.' in target: env['PROGSUFFIX'] = target[target.rindex('.'):] - util = env.Program(target, source, LIBS = libs) + util = env.Program(target, source) defenv.Alias(target, util) defenv.Alias('utils', util)