From 28d2148b09a2d975876f4418bd5ba15ab5edea8d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 30 Nov 2017 17:56:01 +1100 Subject: Haiku OS Support D2860 by @miqlas Even though Haiku is a niche OS, only minor changes are needed. --- CMakeLists.txt | 2 +- build_files/cmake/Modules/FindSDL2.cmake | 2 +- build_files/cmake/macros.cmake | 3 + build_files/cmake/platform/platform_unix.cmake | 6 +- extern/glog/src/config.h | 2 + extern/glog/src/config_haiku.h | 172 +++++++++++++++++++++++++ intern/guardedalloc/intern/mallocn_intern.h | 3 + intern/libmv/libmv/numeric/numeric.h | 3 +- source/blender/blenlib/BLI_sys_types.h | 4 +- source/blender/blenlib/intern/fileops.c | 16 ++- source/blender/blenlib/intern/storage.c | 2 +- 11 files changed, 208 insertions(+), 7 deletions(-) create mode 100644 extern/glog/src/config_haiku.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 359e51adbb6..222c75b8593 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,7 +195,7 @@ endif() # Options # First platform specific non-cached vars -if(UNIX AND NOT APPLE) +if(UNIX AND NOT (APPLE OR HAIKU)) set(WITH_X11 ON) endif() diff --git a/build_files/cmake/Modules/FindSDL2.cmake b/build_files/cmake/Modules/FindSDL2.cmake index 7c40a6ef6f3..e84c6845156 100644 --- a/build_files/cmake/Modules/FindSDL2.cmake +++ b/build_files/cmake/Modules/FindSDL2.cmake @@ -42,7 +42,7 @@ FIND_PATH(SDL2_INCLUDE_DIR HINTS ${_sdl2_SEARCH_DIRS} PATH_SUFFIXES - include/SDL2 include + include/SDL2 include SDL2 ) FIND_LIBRARY(SDL2_LIBRARY diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 6998595a6fc..39f91682996 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -1503,6 +1503,7 @@ function(find_python_package PATH_SUFFIXES site-packages dist-packages + vendor-packages NO_DEFAULT_PATH ) @@ -1513,6 +1514,8 @@ function(find_python_package "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/site-packages/${package}', " "'${PYTHON_LIBPATH}/python${PYTHON_VERSION}/dist-packages/${package}', " "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/dist-packages/${package}', " + "'${PYTHON_LIBPATH}/python${PYTHON_VERSION}/vendor-packages/${package}', " + "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/vendor-packages/${package}', " "\n" "The 'WITH_PYTHON_INSTALL_${_upper_package}' option will be ignored when installing Python.\n" "The build will be usable, only add-ons that depend on this package won't be functional." diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 5eefc40e8f4..79bbcfc0cee 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -358,7 +358,11 @@ if(WITH_OPENSUBDIV OR WITH_CYCLES_OPENSUBDIV) endif() # OpenSuse needs lutil, ArchLinux not, for now keep, can avoid by using --as-needed -list(APPEND PLATFORM_LINKLIBS -lutil -lc -lm) +if(HAIKU) + list(APPEND PLATFORM_LINKLIBS -lnetwork) +else() + list(APPEND PLATFORM_LINKLIBS -lutil -lc -lm) +endif() find_package(Threads REQUIRED) list(APPEND PLATFORM_LINKLIBS ${CMAKE_THREAD_LIBS_INIT}) diff --git a/extern/glog/src/config.h b/extern/glog/src/config.h index f5c9c0b0a7b..2703b7ba9dd 100644 --- a/extern/glog/src/config.h +++ b/extern/glog/src/config.h @@ -14,4 +14,6 @@ #include "windows/config.h" #elif defined(__GNU__) #include "config_hurd.h" +#elif defined(__HAIKU__) + #include "config_haiku.h" #endif diff --git a/extern/glog/src/config_haiku.h b/extern/glog/src/config_haiku.h new file mode 100644 index 00000000000..4e6703bc186 --- /dev/null +++ b/extern/glog/src/config_haiku.h @@ -0,0 +1,172 @@ +/* src/config.h. Generated from config.h.in by configure. */ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Namespace for Google classes */ +#define GOOGLE_NAMESPACE google + +/* Define if you have the `dladdr' function */ +#define HAVE_DLADDR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_EXECINFO_H + +/* Define if you have the `fcntl' function */ +#define HAVE_FCNTL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GLOB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +#define HAVE_LIBPTHREAD 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBUNWIND_H */ + +/* define if you have google gflags library */ +#define HAVE_LIB_GFLAGS 1 + +/* define if you have google gmock library */ +/* #undef HAVE_LIB_GMOCK */ + +/* define if you have google gtest library */ +/* #undef HAVE_LIB_GTEST */ + +/* define if you have libunwind */ +/* #undef HAVE_LIB_UNWIND */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* define if the compiler implements namespaces */ +#define HAVE_NAMESPACES 1 + +/* Define if you have the 'pread' function */ +#define HAVE_PREAD 1 + +/* Define if you have POSIX threads libraries and header files. */ +#define HAVE_PTHREAD 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PWD_H 1 + +/* Define if you have the 'pwrite' function */ +#define HAVE_PWRITE 1 + +/* define if the compiler implements pthread_rwlock_* */ +#define HAVE_RWLOCK 1 + +/* Define if you have the `sigaltstack' function */ +#define HAVE_SIGALTSTACK 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYSCALL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SYSCALL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UCONTEXT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UTSNAME_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UCONTEXT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* define if the compiler supports using expression for operator */ +#define HAVE_USING_OPERATOR 1 + +/* define if your compiler has __attribute__ */ +#define HAVE___ATTRIBUTE__ 1 + +/* define if your compiler has __builtin_expect */ +#define HAVE___BUILTIN_EXPECT 1 + +/* define if your compiler has __sync_val_compare_and_swap */ +/* #undef HAVE___SYNC_VAL_COMPARE_AND_SWAP */ + +/* Name of package */ +#define PACKAGE "glog" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "opensource@google.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "glog" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "glog 0.3.4" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "glog" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.3.4" + +/* How to access the PC from a struct ucontext */ +/* #define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_RIP] */ + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 8 + +/* Define to 1 if you have the ANSI C header files. */ +/* #undef STDC_HEADERS */ + +#define STDC_HEADERS 1 +/* the namespace where STL code like vector<> is defined */ +#define STL_NAMESPACE std + +/* location of source code */ +#define TEST_SRC_DIR "." + +/* Version number of package */ +#define VERSION "0.3.4" + +/* Stops putting the code inside the Google namespace */ +#define _END_GOOGLE_NAMESPACE_ } + +/* Puts following code inside the Google namespace */ +#define _START_GOOGLE_NAMESPACE_ namespace google { + +/* isn't getting defined by configure script when clang compilers are used + and cuases compilation errors in stactrace/unwind modules */ +#ifdef __clang__ +# define NO_FRAME_POINTER +#endif diff --git a/intern/guardedalloc/intern/mallocn_intern.h b/intern/guardedalloc/intern/mallocn_intern.h index a292a2eb5a0..9a5848c50ad 100644 --- a/intern/guardedalloc/intern/mallocn_intern.h +++ b/intern/guardedalloc/intern/mallocn_intern.h @@ -63,6 +63,9 @@ #elif defined(WIN32) # include # define malloc_usable_size _msize +#elif defined(__HAIKU__) +# include +size_t malloc_usable_size(void *ptr); #else # pragma message "We don't know how to use malloc_usable_size on your platform" # undef USE_MALLOC_USABLE_SIZE diff --git a/intern/libmv/libmv/numeric/numeric.h b/intern/libmv/libmv/numeric/numeric.h index 1a23d653676..6312b4eb1a6 100644 --- a/intern/libmv/libmv/numeric/numeric.h +++ b/intern/libmv/libmv/numeric/numeric.h @@ -35,7 +35,8 @@ #if !defined(__MINGW64__) # if defined(_WIN32) || defined(__APPLE__) || \ - defined(__FreeBSD__) || defined(__NetBSD__) + defined(__FreeBSD__) || defined(__NetBSD__) || \ + defined(__HAIKU__) inline void sincos(double x, double *sinx, double *cosx) { *sinx = sin(x); *cosx = cos(x); diff --git a/source/blender/blenlib/BLI_sys_types.h b/source/blender/blenlib/BLI_sys_types.h index 9477f61713c..80ee50621ca 100644 --- a/source/blender/blenlib/BLI_sys_types.h +++ b/source/blender/blenlib/BLI_sys_types.h @@ -47,7 +47,9 @@ extern "C" { #endif -#if defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD_kernel__) || defined(__GNU__) +#if defined(__linux__) || defined(__GNU__) || \ + defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD_kernel__) || \ + defined(__HAIKU__) /* Linux-i386, Linux-Alpha, Linux-ppc */ #include diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c index 36a0d1c1641..ad53457f863 100644 --- a/source/blender/blenlib/intern/fileops.c +++ b/source/blender/blenlib/intern/fileops.c @@ -621,7 +621,21 @@ static int recursive_operation(const char *startfrom, const char *startto, if (to) join_dirfile_alloc(&to_path, &to_alloc_len, to, dirent->d_name); - if (dirent->d_type == DT_DIR) { + bool is_dir; + +#ifdef __HAIKU__ + { + struct stat st_dir; + char filename[FILE_MAX]; + BLI_path_join(filename, sizeof(filename), startfrom, dirent->d_name, NULL); + lstat(filename, &st_dir); + is_dir = S_ISDIR(st_dir.st_mode); + } +#else + is_dir = (dirent->d_type == DT_DIR); +#endif + + if (is_dir) { /* recursively dig into a subfolder */ ret = recursive_operation(from_path, to_path, callback_dir_pre, callback_file, callback_dir_post); } diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index e31659c35d9..c08329ef34f 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -37,7 +37,7 @@ #include -#if defined(__NetBSD__) || defined(__DragonFly__) +#if defined(__NetBSD__) || defined(__DragonFly__) || defined(__HAIKU__) /* Other modern unix os's should probably use this also */ # include # define USE_STATFS_STATVFS -- cgit v1.2.3