123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- From 6ed0c9e58b11680779c571996a3007bd972e0853 Mon Sep 17 00:00:00 2001
- From: Sergiu Deitsch <sergiud@users.noreply.github.com>
- Date: Thu, 4 Aug 2022 22:52:47 +0200
- Subject: [PATCH] added emscripten support (#846)
- [Retrieved from:
- https://github.com/google/glog/commit/6ed0c9e58b11680779c571996a3007bd972e0853,
- to fix build without threads, a fix that is lost in the middle of a
- larger commit adding emscripten support.]
- Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
- ---
- .github/workflows/emscripten.yml | 60 ++++++++++++++++++++++++++++++++
- CMakeLists.txt | 14 ++++----
- src/config.h.cmake.in | 6 ++--
- src/glog/logging.h.in | 6 ++--
- src/glog/platform.h | 2 ++
- src/logging.cc | 11 ++++--
- src/raw_logging.cc | 9 ++---
- src/stacktrace_unwind-inl.h | 2 +-
- src/symbolize.cc | 2 +-
- src/utilities.h | 2 +-
- 10 files changed, 93 insertions(+), 21 deletions(-)
- create mode 100644 .github/workflows/emscripten.yml
- diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml
- new file mode 100644
- index 00000000..566c67eb
- --- /dev/null
- +++ b/.github/workflows/emscripten.yml
- @@ -0,0 +1,60 @@
- +name: Emscripten
- +
- +on: [push, pull_request]
- +
- +jobs:
- + build-linux:
- + defaults:
- + run:
- + shell: bash
- + name: Emscripten-C++${{matrix.std}}-${{matrix.build_type}}-${{matrix.lib}}-${{matrix.extra}}
- + runs-on: ubuntu-latest
- + container: emscripten/emsdk
- + strategy:
- + fail-fast: true
- + matrix:
- + build_type: [Release, Debug]
- + extra: [no-custom-prefix, custom-prefix]
- + lib: [static]
- + std: [98, 11, 14, 17, 20]
- +
- + steps:
- + - uses: actions/checkout@v2
- +
- + - name: Setup Dependencies
- + run: |
- + apt-get update
- + DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \
- + cmake \
- + ninja-build
- +
- + - name: Setup C++98 Environment
- + if: matrix.std == '98'
- + run: |
- + echo 'CXXFLAGS=-Wno-error=variadic-macros -Wno-error=long-long ${{env.CXXFLAGS}}' >> $GITHUB_ENV
- +
- + - name: Configure
- + env:
- + CXXFLAGS: -Wall -Wextra -Wsign-conversion -Wtautological-compare -Wformat-nonliteral -Wundef -Werror -Wno-error=wasm-exception-spec ${{env.CXXFLAGS}}
- + run: |
- + cmake -S . -B build_${{matrix.build_type}} \
- + -DBUILD_SHARED_LIBS=${{matrix.lib == 'shared'}} \
- + -DCMAKE_AR=$(which emar) \
- + -DCMAKE_C_COMPILER=$(which emcc) \
- + -DCMAKE_CXX_COMPILER=$(which em++) \
- + -DCMAKE_CXX_STANDARD=${{matrix.std}} \
- + -DCMAKE_CXX_STANDARD_REQUIRED=ON \
- + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
- + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
- + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
- + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
- + -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/install \
- + -DCMAKE_RANLIB=$(which emranlib) \
- + -DWITH_CUSTOM_PREFIX=${{matrix.extra == 'custom-prefix'}} \
- + -G Ninja \
- + -Werror
- +
- + - name: Build
- + run: |
- + cmake --build build_${{matrix.build_type}} \
- + --config ${{matrix.build_type}}
- diff --git a/CMakeLists.txt b/CMakeLists.txt
- index 643a8b8a..ce6daa40 100644
- --- a/CMakeLists.txt
- +++ b/CMakeLists.txt
- @@ -93,11 +93,11 @@ find_package (Unwind)
- if (Unwind_FOUND)
- set (HAVE_LIB_UNWIND 1)
- else (Unwind_FOUND)
- - check_include_file_cxx (unwind.h HAVE_UNWIND_H)
- # Check whether linking actually succeeds. ARM toolchains of LLVM unwind
- # implementation do not necessarily provide the _Unwind_Backtrace function
- # which causes the previous check to succeed but the linking to fail.
- check_cxx_symbol_exists (_Unwind_Backtrace unwind.h HAVE__UNWIND_BACKTRACE)
- + check_cxx_symbol_exists (_Unwind_GetIP unwind.h HAVE__UNWIND_GETIP)
- endif (Unwind_FOUND)
-
- check_include_file_cxx (dlfcn.h HAVE_DLFCN_H)
- @@ -197,9 +197,10 @@ int main(void)
- }
- " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
-
- -cmake_push_check_state (RESET)
- -set (CMAKE_REQUIRED_LIBRARIES Threads::Threads)
- -check_cxx_source_compiles ("
- +if (Threads_FOUND)
- + cmake_push_check_state (RESET)
- + set (CMAKE_REQUIRED_LIBRARIES Threads::Threads)
- + check_cxx_source_compiles ("
- #define _XOPEN_SOURCE 500
- #include <pthread.h>
- int main(void)
- @@ -209,8 +210,9 @@ int main(void)
- pthread_rwlock_rdlock(&l);
- return 0;
- }
- -" HAVE_RWLOCK)
- -cmake_pop_check_state ()
- + " HAVE_RWLOCK)
- + cmake_pop_check_state ()
- +endif (Threads_FOUND)
-
- check_cxx_source_compiles ("
- __declspec(selectany) int a;
- diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in
- index b67e8a77..20b5f1c4 100644
- --- a/src/config.h.cmake.in
- +++ b/src/config.h.cmake.in
- @@ -118,12 +118,12 @@
- /* Define to 1 if you have the <unistd.h> header file. */
- #cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H}
-
- -/* Define if you have the <unwind.h> header file. */
- -#cmakedefine HAVE_UNWIND_H
- -
- /* Define if you linking to _Unwind_Backtrace is possible. */
- #cmakedefine HAVE__UNWIND_BACKTRACE
-
- +/* Define if you linking to _Unwind_GetIP is possible. */
- +#cmakedefine HAVE__UNWIND_GETIP
- +
- /* define if the compiler supports using expression for operator */
- #cmakedefine HAVE_USING_OPERATOR
-
- diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in
- index c6def152..098e28fe 100644
- --- a/src/glog/logging.h.in
- +++ b/src/glog/logging.h.in
- @@ -97,7 +97,7 @@
-
- @ac_google_start_namespace@
-
- -#if @ac_cv_have_uint16_t@ // the C99 format
- +#if @ac_cv_have_stdint_h@ // the C99 format
- typedef int32_t int32;
- typedef uint32_t uint32;
- typedef int64_t int64;
- @@ -1822,8 +1822,8 @@ GLOG_EXPORT void SetEmailLogging(LogSeverity min_severity,
-
- // A simple function that sends email. dest is a commma-separated
- // list of addressess. Thread-safe.
- -GLOG_EXPORT bool SendEmail(const char *dest,
- - const char *subject, const char *body);
- +GLOG_EXPORT bool SendEmail(const char* dest, const char* subject,
- + const char* body);
-
- GLOG_EXPORT const std::vector<std::string>& GetLoggingDirectories();
-
- diff --git a/src/glog/platform.h b/src/glog/platform.h
- index e6144119..7893c45d 100644
- --- a/src/glog/platform.h
- +++ b/src/glog/platform.h
- @@ -50,6 +50,8 @@
- #define GLOG_OS_NETBSD
- #elif defined(__OpenBSD__)
- #define GLOG_OS_OPENBSD
- +#elif defined(__EMSCRIPTEN__)
- +#define GLOG_OS_EMSCRIPTEN
- #else
- // TODO(hamaji): Add other platforms.
- #error Platform not supported by glog. Please consider to contribute platform information by submitting a pull request on Github.
- diff --git a/src/logging.cc b/src/logging.cc
- index e65e80e9..1df1034a 100644
- --- a/src/logging.cc
- +++ b/src/logging.cc
- @@ -2188,6 +2188,7 @@ void SetExitOnDFatal(bool value) {
- } // namespace internal
- } // namespace base
-
- +#ifndef GLOG_OS_EMSCRIPTEN
- // Shell-escaping as we need to shell out ot /bin/mail.
- static const char kDontNeedShellEscapeChars[] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- @@ -2222,14 +2223,14 @@ static string ShellEscape(const string& src) {
- }
- return result;
- }
- -
- +#endif
-
- // use_logging controls whether the logging functions LOG/VLOG are used
- // to log errors. It should be set to false when the caller holds the
- // log_mutex.
- static bool SendEmailInternal(const char*dest, const char *subject,
- const char*body, bool use_logging) {
- -#ifndef __EMSCRIPTEN__
- +#ifndef GLOG_OS_EMSCRIPTEN
- if (dest && *dest) {
- if ( use_logging ) {
- VLOG(1) << "Trying to send TITLE:" << subject
- @@ -2275,6 +2276,12 @@ static bool SendEmailInternal(const char*dest, const char *subject,
- }
- }
- }
- +#else
- + (void)dest;
- + (void)subject;
- + (void)body;
- + (void)use_logging;
- + LOG(WARNING) << "Email support not available; not sending message";
- #endif
- return false;
- }
- diff --git a/src/raw_logging.cc b/src/raw_logging.cc
- index 43159832..befeac89 100644
- --- a/src/raw_logging.cc
- +++ b/src/raw_logging.cc
- @@ -59,11 +59,12 @@
- # include <unistd.h>
- #endif
-
- -#if (defined(HAVE_SYSCALL_H) || defined(HAVE_SYS_SYSCALL_H)) && (!(defined(GLOG_OS_MACOSX)))
- -# define safe_write(fd, s, len) syscall(SYS_write, fd, s, len)
- +#if (defined(HAVE_SYSCALL_H) || defined(HAVE_SYS_SYSCALL_H)) && \
- + (!(defined(GLOG_OS_MACOSX))) && !defined(GLOG_OS_EMSCRIPTEN)
- +#define safe_write(fd, s, len) syscall(SYS_write, fd, s, len)
- #else
- - // Not so safe, but what can you do?
- -# define safe_write(fd, s, len) write(fd, s, len)
- +// Not so safe, but what can you do?
- +#define safe_write(fd, s, len) write(fd, s, len)
- #endif
-
- _START_GOOGLE_NAMESPACE_
- diff --git a/src/stacktrace_unwind-inl.h b/src/stacktrace_unwind-inl.h
- index fbb5f988..dc1665b4 100644
- --- a/src/stacktrace_unwind-inl.h
- +++ b/src/stacktrace_unwind-inl.h
- @@ -73,7 +73,7 @@ static _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void *opq) {
- if (targ->skip_count > 0) {
- targ->skip_count--;
- } else {
- - targ->result[targ->count++] = (void *) _Unwind_GetIP(uc);
- + targ->result[targ->count++] = reinterpret_cast<void *>(_Unwind_GetIP(uc));
- }
-
- if (targ->count == targ->max_depth) {
- diff --git a/src/symbolize.cc b/src/symbolize.cc
- index 51025018..f56e97c9 100644
- --- a/src/symbolize.cc
- +++ b/src/symbolize.cc
- @@ -834,7 +834,7 @@ static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,
-
- _END_GOOGLE_NAMESPACE_
-
- -#elif defined(GLOG_OS_MACOSX) && defined(HAVE_DLADDR)
- +#elif (defined(GLOG_OS_MACOSX) || defined(GLOG_OS_EMSCRIPTEN)) && defined(HAVE_DLADDR)
-
- #include <dlfcn.h>
- #include <cstring>
- diff --git a/src/utilities.h b/src/utilities.h
- index bd0ec632..760c142c 100644
- --- a/src/utilities.h
- +++ b/src/utilities.h
- @@ -88,7 +88,7 @@
-
- #if defined(HAVE_LIB_UNWIND)
- # define STACKTRACE_H "stacktrace_libunwind-inl.h"
- -#elif defined(HAVE__UNWIND_BACKTRACE)
- +#elif defined(HAVE__UNWIND_BACKTRACE) && defined(HAVE__UNWIND_GETIP)
- # define STACKTRACE_H "stacktrace_unwind-inl.h"
- #elif !defined(NO_FRAME_POINTER)
- # if defined(__i386__) && __GNUC__ >= 2
|