CMake: split out libbacktrace into its own CMakeLists

This change also fixes compilation on Linux when REACTOR_EMIT_DEBUG_INFO
is enabled, which has been broken since "-fno-exceptions" was added to
SWIFTSHADER_COMPILE_OPTIONS. Also, at some point,
LIBBACKTRACE_CONFIG_DIR stopped being used, which further broke
compiling libbacktrace.

Bug: b/145758253
Change-Id: I50f0e2c2c1dabc357dfc255a471eaf1e9fed1c2e
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43189
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9cd84a3..f9f0aae 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -354,9 +354,6 @@
 set(VULKAN_DIR ${SOURCE_DIR}/Vulkan)
 set(THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party)
 set(ASTC_DIR ${THIRD_PARTY_DIR}/astc-encoder)
-set(LIBBACKTRACE_DIR ${THIRD_PARTY_DIR}/libbacktrace/src)
-set(LIBBACKTRACE_CONFIG_DIR ${THIRD_PARTY_DIR}/libbacktrace/config)
-set(LIBBACKTRACE_INCLUDE_DIR ${THIRD_PARTY_DIR}/libbacktrace/src)
 set(CPPDAP_DIR ${THIRD_PARTY_DIR}/cppdap)
 set(CPPDAP_INCLUDE_DIR ${CPPDAP_DIR}/include)
 set(JSON_INCLUDE_DIR ${THIRD_PARTY_DIR}/json/include)
@@ -425,10 +422,6 @@
         "/we5038" # data member 'member1' will be initialized after data member 'member2' data member 'member' will be initialized after base class 'base_class'
     )
 else()
-    list(APPEND SWIFTSHADER_COMPILE_OPTIONS
-        "-fno-exceptions"
-    )
-
     # Explicitly enable these warnings.
     list(APPEND SWIFTSHADER_COMPILE_OPTIONS
         "-Wall"
@@ -610,6 +603,17 @@
     set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib")
 endif()
 
+set(USE_EXCEPTIONS
+    ${REACTOR_EMIT_DEBUG_INFO} # boost::stacktrace uses exceptions
+)
+if(NOT MSVC)
+    if (${USE_EXCEPTIONS})
+        list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-fexceptions")
+    else()
+        list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-fno-exceptions")
+    endif()
+endif()
+
 # Transform SWIFTSHADER_LINK_FLAGS from semicolon delimited to whitespace
 # delimited (what is expected by LINK_FLAGS)
 string(REPLACE ";" " " SWIFTSHADER_LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}")
@@ -676,7 +680,6 @@
 set(COMMON_INCLUDE_DIR
     ${SOURCE_DIR}
     ${CMAKE_CURRENT_SOURCE_DIR}/include
-    ${LIBBACKTRACE_INCLUDE_DIR}
 )
 set(OPENGL_INCLUDE_DIR
     ${OPENGL_DIR}
@@ -718,35 +721,6 @@
     ${SOURCE_DIR}/Common/GrallocAndroid.hpp
 )
 
-if(REACTOR_EMIT_DEBUG_INFO)
-    set(LIBBACKTRACE_LIST
-        ${LIBBACKTRACE_DIR}/atomic.c
-        ${LIBBACKTRACE_DIR}/backtrace.c
-        ${LIBBACKTRACE_DIR}/backtrace.h
-        ${LIBBACKTRACE_DIR}/dwarf.c
-        ${LIBBACKTRACE_DIR}/fileline.c
-        ${LIBBACKTRACE_DIR}/filenames.h
-        ${LIBBACKTRACE_DIR}/internal.h
-        ${LIBBACKTRACE_DIR}/mmap.c
-        ${LIBBACKTRACE_DIR}/mmapio.c
-        ${LIBBACKTRACE_DIR}/posix.c
-        ${LIBBACKTRACE_DIR}/print.c
-        ${LIBBACKTRACE_DIR}/simple.c
-        ${LIBBACKTRACE_DIR}/sort.c
-        ${LIBBACKTRACE_DIR}/state.c
-        ${LIBBACKTRACE_INCLUDE_DIR}/backtrace-supported.h
-        ${LIBBACKTRACE_INCLUDE_DIR}/config.h
-    )
-
-    if(WIN32)
-        list(APPEND LIBBACKTRACE_LIST ${LIBBACKTRACE_DIR}/pecoff.c)
-    elseif(LINUX)
-        list(APPEND LIBBACKTRACE_LIST ${LIBBACKTRACE_DIR}/elf.c)
-    elseif(APPLE)
-        message(FATAL_ERROR "libbacktrace does not support mach-o yet")
-    endif()
-endif(REACTOR_EMIT_DEBUG_INFO)
-
 set(REACTOR_LLVM_LIST
     ${SOURCE_DIR}/Reactor/CPUID.cpp
     ${SOURCE_DIR}/Reactor/CPUID.hpp
@@ -1015,19 +989,9 @@
         target_compile_definitions(${Reactor} PRIVATE BOOST_STACKTRACE_USE_WINDBG_CACHED)
     else()
         # Boost stacktrace uses libbacktrace
+        add_subdirectory(third_party/libbacktrace)
         target_compile_definitions(${Reactor} PRIVATE BOOST_STACKTRACE_USE_BACKTRACE)
-
-        # Boost stacktrace uses exceptions, so force enable it
-        set_cpp_flag("-fexceptions")
-
-        add_library(Libbacktrace STATIC EXCLUDE_FROM_ALL ${LIBBACKTRACE_LIST})
-        set_target_properties(Libbacktrace PROPERTIES
-            INCLUDE_DIRECTORIES "${LIBBACKTRACE_INCLUDE_DIR}"
-            POSITION_INDEPENDENT_CODE 1
-            FOLDER "Core"
-        )
-        target_link_libraries(Libbacktrace ${OS_LIBS} ${SWIFTSHADER_LIBS})
-        target_link_libraries(${Reactor} Libbacktrace)
+        target_link_libraries(${Reactor} libbacktrace)
     endif()
 
     # Download boost and use it
@@ -1263,12 +1227,7 @@
         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
         FOLDER "Tests"
     )
-
-    if(NOT WIN32 AND ${REACTOR_BACKEND} STREQUAL "Subzero")
-        target_link_libraries(ReactorUnitTests ${Reactor} pthread dl)
-    else()
-        target_link_libraries(ReactorUnitTests ${Reactor})
-    endif()
+    target_link_libraries(ReactorUnitTests ${Reactor} ${OS_LIBS})
 
     set(GLES_UNITTESTS_LIST
         ${TESTS_DIR}/GLESUnitTests/main.cpp
diff --git a/third_party/libbacktrace/CMakeLists.txt b/third_party/libbacktrace/CMakeLists.txt
new file mode 100644
index 0000000..b86f453
--- /dev/null
+++ b/third_party/libbacktrace/CMakeLists.txt
@@ -0,0 +1,58 @@
+# Copyright 2020 The SwiftShader Authors. All Rights Reserved.
+#
+# 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.
+
+set(LIBBACKTRACE_SRC_FILES
+    src/atomic.c
+    src/backtrace.c
+    src/backtrace.h
+    src/dwarf.c
+    src/fileline.c
+    src/filenames.h
+    src/internal.h
+    src/mmap.c
+    src/mmapio.c
+    src/posix.c
+    src/print.c
+    src/simple.c
+    src/sort.c
+    src/state.c
+    src/backtrace-supported.h
+    src/config.h
+)
+
+if(WIN32)
+    list(APPEND LIBBACKTRACE_SRC_FILES src/pecoff.c)
+elseif(LINUX)
+    list(APPEND LIBBACKTRACE_SRC_FILES src/elf.c)
+    list(APPEND LIBBACKTRACE_PRIVATE_INCLUDE_DIRS "config/linux/include")
+elseif(APPLE)
+    message(FATAL_ERROR "libbacktrace does not support mach-o yet")
+    list(APPEND LIBBACKTRACE_PRIVATE_INCLUDE_DIRS "config/darwin/include")
+endif()
+
+add_library(libbacktrace STATIC EXCLUDE_FROM_ALL
+    ${LIBBACKTRACE_SRC_FILES}
+)
+
+set_target_properties(libbacktrace PROPERTIES
+    POSITION_INDEPENDENT_CODE 1
+    FOLDER "Core"
+)
+
+target_include_directories(libbacktrace
+    PUBLIC
+        "src"
+    PRIVATE
+        ${LIBBACKTRACE_PRIVATE_INCLUDE_DIRS}
+)