summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorDavid Cournapeau <cournape@gmail.com>2008-07-26 06:29:08 +0000
committerDavid Cournapeau <cournape@gmail.com>2008-07-26 06:29:08 +0000
commite1bc01faf6ffba5dab7587a97f967ca1bdee9fb2 (patch)
treef35427246d316bd260b41d42fd989c48a605bf67 /tools
parent1fddb21cdd90e458c84d26d93e01ca12b2e5e4b7 (diff)
downloadnumpy-e1bc01faf6ffba5dab7587a97f967ca1bdee9fb2.tar.gz
Add cpu_caps nsis plugin sources (to detect SSE in nsis scripts).
Diffstat (limited to 'tools')
-rw-r--r--tools/win32build/cpucaps/SConstruct8
-rw-r--r--tools/win32build/cpucaps/cpucaps_main.c108
-rw-r--r--tools/win32build/cpucaps/cpucaps_main.h128
3 files changed, 244 insertions, 0 deletions
diff --git a/tools/win32build/cpucaps/SConstruct b/tools/win32build/cpucaps/SConstruct
new file mode 100644
index 000000000..7a0f481b6
--- /dev/null
+++ b/tools/win32build/cpucaps/SConstruct
@@ -0,0 +1,8 @@
+env = Environment(tools = ['mingw'])
+
+env.Append(CPPPATH = ['../cpuid'])
+env.Append(CFLAGS = ['-W', '-Wall'])
+cpuplug = env.SharedLibrary('cpucaps', source = ['cpucaps_main.c', '../cpuid/cpuid.c'])
+
+cpuplug_install = env.InstallAs('C:\Program Files\NSIS\Plugins\CpuCaps.dll', cpuplug[0])
+env.Alias('install', cpuplug_install)
diff --git a/tools/win32build/cpucaps/cpucaps_main.c b/tools/win32build/cpucaps/cpucaps_main.c
new file mode 100644
index 000000000..1c52749a8
--- /dev/null
+++ b/tools/win32build/cpucaps/cpucaps_main.c
@@ -0,0 +1,108 @@
+#include <stdio.h>
+
+#include <windows.h>
+#include "cpucaps_main.h"
+
+#include "cpuid.h"
+
+HINSTANCE g_hInstance;
+
+HWND g_hwndParent;
+
+#define CPUID_FAILED "Unknown"
+
+/*
+ * if val is true, str is the "Y" string, otherwise the "N" string
+ */
+static int _set_bool_str(int val, char* str)
+{
+ if (val) {
+ str[0] = 'Y';
+ } else {
+ str[0] = 'N';
+ }
+ str[1] = '\0';
+
+ return 0;
+}
+
+void __declspec(dllexport) hasSSE3(HWND hwndParent, int string_size,
+ char *variables, stack_t **stacktop,
+ extra_parameters *extra)
+{
+ cpu_caps_t *cpu;
+ char has_sse3[2];
+
+ //g_hwndParent=hwndParent;
+
+ EXDLL_INIT();
+
+
+ // note if you want parameters from the stack, pop them off in order.
+ // i.e. if you are called via exdll::myFunction file.dat poop.dat
+ // calling popstring() the first time would give you file.dat,
+ // and the second time would give you poop.dat.
+ // you should empty the stack of your parameters, and ONLY your
+ // parameters.
+
+ // do your stuff here
+ cpu = malloc(sizeof(*cpu));
+ if (cpu == NULL) {
+ fprintf(stderr, "malloc call failed\n");
+ _set_bool_str(0, has_sse3);
+ goto push_vars;
+ }
+ cpuid_get_caps(cpu);
+ _set_bool_str(cpu->has_sse3, has_sse3);
+
+
+push_vars:
+ pushstring(has_sse3);
+
+ return ;
+}
+
+
+void __declspec(dllexport) hasSSE2(HWND hwndParent, int string_size,
+ char *variables, stack_t **stacktop,
+ extra_parameters *extra)
+{
+ cpu_caps_t *cpu;
+ char has_sse2[2];
+
+ //g_hwndParent=hwndParent;
+
+ EXDLL_INIT();
+
+
+ // note if you want parameters from the stack, pop them off in order.
+ // i.e. if you are called via exdll::myFunction file.dat poop.dat
+ // calling popstring() the first time would give you file.dat,
+ // and the second time would give you poop.dat.
+ // you should empty the stack of your parameters, and ONLY your
+ // parameters.
+
+ // do your stuff here
+ cpu = malloc(sizeof(*cpu));
+ if (cpu == NULL) {
+ fprintf(stderr, "malloc call failed\n");
+ _set_bool_str(0, has_sse2);
+ goto push_vars;
+ }
+ cpuid_get_caps(cpu);
+ _set_bool_str(cpu->has_sse2, has_sse2);
+
+
+push_vars:
+ pushstring(has_sse2);
+
+ return ;
+}
+
+
+
+BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
+{
+ g_hInstance=hInst;
+ return TRUE;
+}
diff --git a/tools/win32build/cpucaps/cpucaps_main.h b/tools/win32build/cpucaps/cpucaps_main.h
new file mode 100644
index 000000000..661bf17ea
--- /dev/null
+++ b/tools/win32build/cpucaps/cpucaps_main.h
@@ -0,0 +1,128 @@
+#ifndef _EXDLL_H_
+#define _EXDLL_H_
+
+#include <windows.h>
+
+#if defined(__GNUC__)
+#define UNUSED __attribute__((unused))
+#else
+#define UNUSED
+#endif
+
+// only include this file from one place in your DLL.
+// (it is all static, if you use it in two places it will fail)
+
+#define EXDLL_INIT() { \
+ g_stringsize=string_size; \
+ g_stacktop=stacktop; \
+ g_variables=variables; }
+
+// For page showing plug-ins
+#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
+#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
+#define NOTIFY_BYE_BYE 'x'
+
+typedef struct _stack_t {
+ struct _stack_t *next;
+ char text[1]; // this should be the length of string_size
+} stack_t;
+
+
+static unsigned int g_stringsize;
+static stack_t **g_stacktop;
+static char *g_variables;
+
+static int __stdcall popstring(char *str) UNUSED; // 0 on success, 1 on empty stack
+static void __stdcall pushstring(const char *str) UNUSED;
+static char * __stdcall getuservariable(const int varnum) UNUSED;
+static void __stdcall setuservariable(const int varnum, const char *var) UNUSED;
+
+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
+};
+
+typedef struct {
+ int autoclose;
+ int all_user_var;
+ int exec_error;
+ int abort;
+ int exec_reboot;
+ int reboot_called;
+ int XXX_cur_insttype; // deprecated
+ int XXX_insttype_changed; // deprecated
+ int silent;
+ int instdir_error;
+ int rtl;
+ int errlvl;
+ int alter_reg_view;
+} exec_flags_type;
+
+typedef struct {
+ exec_flags_type *exec_flags;
+ int (__stdcall *ExecuteCodeSegment)(int, HWND);
+ void (__stdcall *validate_filename)(char *);
+} extra_parameters;
+
+// utility functions (not required but often useful)
+static int __stdcall 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;
+}
+
+static void __stdcall 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;
+}
+
+static char * __stdcall getuservariable(const int varnum)
+{
+ if (varnum < 0 || varnum >= __INST_LAST) return NULL;
+ return g_variables+varnum*g_stringsize;
+}
+
+static void __stdcall setuservariable(const int varnum, const char *var)
+{
+ if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
+ lstrcpyA(g_variables + varnum*g_stringsize, var);
+}
+
+
+
+#endif//_EXDLL_H_