Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-11-17 14:35:36 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2014-11-17 15:43:18 +0300
commit80d1d624d378d4d8c03fb26ef286baf5479b6497 (patch)
treed5ae6545d0318d8e0448d3a084a15e72aff6e2a5 /extern/sdlew/auto
parent90bf426554a7cc1d429f2dd9a02edbcbeb51ceec (diff)
Support dynamic loading of SDL libraries
This is mainly to address old issue when one need to have SDL library installed in order to use our official builds. Some hip distros already installs SDL, but it's not quite the same across all the variety of the distros. We also now switching to SDL-2.0, most of the distros have it in repositories already, so it shouldn't be huge deal to install it if needed. Reviewers: campbellbarton Reviewed By: campbellbarton Differential Revision: https://developer.blender.org/D878
Diffstat (limited to 'extern/sdlew/auto')
-rwxr-xr-xextern/sdlew/auto/sdlew_gen.sh250
-rwxr-xr-xextern/sdlew/auto/strip_comments.sh15
2 files changed, 265 insertions, 0 deletions
diff --git a/extern/sdlew/auto/sdlew_gen.sh b/extern/sdlew/auto/sdlew_gen.sh
new file mode 100755
index 00000000000..36a2d939d20
--- /dev/null
+++ b/extern/sdlew/auto/sdlew_gen.sh
@@ -0,0 +1,250 @@
+#!/bin/bash
+
+SDL="SDL2"
+INCLUDE_DIR="/usr/include/${SDL}"
+SCRIPT=`realpath -s $0`
+DIR=`dirname $SCRIPT`
+DIR=`dirname $DIR`
+
+mkdir -p $DIR/include/${SDL}
+mkdir -p $DIR/src
+
+rm -rf $DIR/include/${SDL}/*.h
+rm -rf $DIR/src/sdlew.c
+
+echo "Generating sdlew headers..."
+
+UNSUPPORTED="SDL_MemoryBarrierRelease SDL_MemoryBarrierAcquire SDL_AtomicCAS SDL_AtomicCASPtr \
+ SDL_iPhoneSetAnimationCallback SDL_iPhoneSetEventPump SDL_AndroidGetJNIEnv SDL_AndroidGetActivity \
+ SDL_AndroidGetActivity SDL_AndroidGetInternalStoragePath SDL_AndroidGetExternalStorageState \
+ SDL_AndroidGetExternalStoragePath SDL_CreateShapedWindow SDL_IsShapedWindow tSDL_SetWindowShape \
+ SDL_GetShapedWindowMode"
+
+for header in $INCLUDE_DIR/*; do
+ filename=`basename $header`
+ cat $header \
+ | sed -r 's/extern DECLSPEC ((const )?[a-z0-9_]+(\s\*)?)\s?SDLCALL /typedef \1 SDLCALL t/i' \
+ > $DIR/include/${SDL}/$filename
+
+ line_num=`cat $DIR/include/${SDL}/$filename | grep -n "Ends C function" | cut -d : -f 1`
+ if [ ! -z "$line_num" ]; then
+ functions=`grep -E 'typedef [A-Za-z0-9_ \*]+ SDLCALL' $DIR/include/${SDL}/$filename \
+ | sed -r 's/typedef [A-Za-z0-9_ \*]+ SDLCALL t([a-z0-9_]+).*/extern t\1 *\1;/i'`
+ functions=`echo "${functions}" | sed -e 's/[\/&]/\\\&/g'`
+ echo "$functions" | while read function; do
+ if [ -z "$function" ]; then
+ continue;
+ fi
+ func_name=`echo $function | cut -d '*' -f 2 | sed -r 's/;//'`
+ if [ ! -z "`echo "$UNSUPPORTED" | grep $func_name`" ]; then
+ continue;
+ fi
+ if [ "$func_name" == "SDL_memcpy" ]; then
+ line_num=`cat $DIR/include/${SDL}/$filename | grep -n "SDL_memcpy4" | cut -d : -f 1`
+ sed -ri "${line_num}s/(.*)/${function}\n\1/" $DIR/include/${SDL}/$filename
+ else
+ sed -ri "${line_num}s/(.*)/${function}\n\1/" $DIR/include/${SDL}/$filename
+ fi
+ line_num=`cat $DIR/include/${SDL}/$filename | grep -n "Ends C function" | cut -d : -f 1`
+ done
+ line_num=`cat $DIR/include/${SDL}/$filename | grep -n "Ends C function" | cut -d : -f 1`
+ sed -ri "${line_num}s/(.*)/\n\1/" $DIR/include/${SDL}/$filename
+ fi
+
+ if [ $filename == "SDL_stdinc.h" ]; then
+ cat $header | grep -E '#if(def)? (defined\()?HAVE_' | sed -r 's/#if(def)? //' | while read check; do
+ func_names=`cat $DIR/include/${SDL}/$filename \
+ | grep -A 8 "$check\$" \
+ | grep -v struct \
+ | grep 'typedef' \
+ | sed -r 's/typedef [a-z0-9_ \*]+ SDLCALL ([a-z0-9_]+).*/\1/i'`
+ full_check=`echo "${check}" | sed -e 's/[\/&]/\\\&/g'`
+ if [ ! -z "`echo $full_check | grep defined`" ]; then
+ full_check="#if !($full_check)"
+ else
+ full_check="#ifndef $full_check"
+ fi
+ for func_name in $func_names; do
+ line_num=`grep -n "extern ${func_name} \*" $DIR/include/${SDL}/$filename | cut -d : -f 1`
+ let prev_num=line_num-1
+ if [ -z "`cat $DIR/include/${SDL}/$filename | head -n $prev_num | tail -n 1 | grep '#if'`" ]; then
+ sed -ri "${line_num}s/(.*)/$full_check \/* GEN_CHECK_MARKER *\/\n\1\n#endif \/* GEN_CHECK_MARKER *\//" $DIR/include/${SDL}/$filename
+ fi
+ done
+ done
+ fi
+done
+
+cat << EOF > $DIR/include/sdlew.h
+/*
+ * Copyright 2014 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+#ifndef __SDL_EW_H__
+#define __SDL_EW_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+ SDLEW_SUCCESS = 0,
+ SDLEW_ERROR_OPEN_FAILED = -1,
+ SDLEW_ERROR_ATEXIT_FAILED = -2,
+ SDLEW_ERROR_VERSION = -3,
+};
+
+int sdlewInit(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SDL_EW_H__ */
+EOF
+
+echo "Generating sdlew sources..."
+
+cat << EOF > $DIR/src/sdlew.c
+/*
+ * Copyright 2014 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+#ifdef _MSC_VER
+# define snprintf _snprintf
+# define popen _popen
+# define pclose _pclose
+# define _CRT_SECURE_NO_WARNINGS
+#endif
+
+#include "sdlew.h"
+
+#include "${SDL}/SDL.h"
+#include "${SDL}/SDL_syswm.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#ifdef _WIN32
+# define WIN32_LEAN_AND_MEAN
+# define VC_EXTRALEAN
+# include <windows.h>
+
+/* Utility macros. */
+
+typedef HMODULE DynamicLibrary;
+
+# define dynamic_library_open(path) LoadLibrary(path)
+# define dynamic_library_close(lib) FreeLibrary(lib)
+# define dynamic_library_find(lib, symbol) GetProcAddress(lib, symbol)
+#else
+# include <dlfcn.h>
+
+typedef void* DynamicLibrary;
+
+# define dynamic_library_open(path) dlopen(path, RTLD_NOW)
+# define dynamic_library_close(lib) dlclose(lib)
+# define dynamic_library_find(lib, symbol) dlsym(lib, symbol)
+#endif
+
+#define SDL_LIBRARY_FIND_CHECKED(name) \
+ name = (t##name *)dynamic_library_find(lib, #name); \
+ assert(name);
+
+#define SDL_LIBRARY_FIND(name) \
+ name = (t##name *)dynamic_library_find(lib, #name);
+
+static DynamicLibrary lib;
+
+EOF
+
+content=`grep --no-filename -ER "extern tSDL|GEN_CHECK_MARKER" $DIR/include/${SDL}/`
+
+echo "$content" | sed -r 's/extern t([a-z0-9_]+).*/t\1 *\1;/gi' >> $DIR/src/sdlew.c
+
+cat << EOF >> $DIR/src/sdlew.c
+
+static void sdlewExit(void) {
+ if(lib != NULL) {
+ /* Ignore errors. */
+ dynamic_library_close(lib);
+ lib = NULL;
+ }
+}
+
+/* Implementation function. */
+int sdlewInit(void) {
+ /* Library paths. */
+#ifdef _WIN32
+ /* Expected in c:/windows/system or similar, no path needed. */
+ const char *path = "SDL2.dll";
+#elif defined(__APPLE__)
+ /* Default installation path. */
+ const char *path = "/usr/local/cuda/lib/libSDL2.dylib";
+#else
+ const char *path = "libSDL2.so";
+#endif
+ static int initialized = 0;
+ static int result = 0;
+ int error;
+
+ if (initialized) {
+ return result;
+ }
+
+ initialized = 1;
+
+ error = atexit(sdlewExit);
+ if (error) {
+ result = SDLEW_ERROR_ATEXIT_FAILED;
+ return result;
+ }
+
+ /* Load library. */
+ lib = dynamic_library_open(path);
+
+ if (lib == NULL) {
+ result = SDLEW_ERROR_OPEN_FAILED;
+ return result;
+ }
+
+EOF
+
+echo "$content" | sed -r 's/extern t([a-z0-9_]+).*/ SDL_LIBRARY_FIND(\1);/gi' >> $DIR/src/sdlew.c
+
+cat << EOF >> $DIR/src/sdlew.c
+
+ result = SDLEW_SUCCESS;
+
+ return result;
+}
+EOF
+
+sed -i 's/\s\/\* GEN_CHECK_MARKER \*\///g' $DIR/src/sdlew.c
+sed -i 's/\s\/\* GEN_CHECK_MARKER \*\///g' $DIR/include/${SDL}/SDL_stdinc.h
diff --git a/extern/sdlew/auto/strip_comments.sh b/extern/sdlew/auto/strip_comments.sh
new file mode 100755
index 00000000000..c89224c3d56
--- /dev/null
+++ b/extern/sdlew/auto/strip_comments.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+SDL="SDL2"
+INCLUDE_DIR="/usr/include/${SDL}"
+SCRIPT=`realpath -s $0`
+DIR=`dirname $SCRIPT`
+DIR=`dirname $DIR`
+
+for f in $DIR/include/${SDL}/*.h; do
+ file_name=`basename $f`
+ echo "Striping $file_name..."
+ sed -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' -i $f
+ sed 's/[ \t]*$//' -i $f
+ sed '/^$/N;/^\n$/D' -i $f
+done