Skip to content

Commit d12a064

Browse files
committed
Extend the USE_LIBBACKTRACE option
1 parent 60358a1 commit d12a064

File tree

3 files changed

+91
-30
lines changed

3 files changed

+91
-30
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ tvm_option(USE_FALLBACK_STL_MAP "Use TVM's POD compatible Map" OFF)
6868
tvm_option(USE_ETHOSN "Build with Arm(R) Ethos(TM)-N" OFF)
6969
tvm_option(USE_CMSISNN "Build with Arm CMSIS-NN" OFF)
7070
tvm_option(INDEX_DEFAULT_I64 "Defaults the index datatype to int64" ON)
71-
tvm_option(USE_LIBBACKTRACE "Build libbacktrace to supply linenumbers on stack traces" AUTO)
71+
tvm_option(USE_LIBBACKTRACE "Use libbacktrace to supply linenumbers on stack traces" AUTO)
7272
tvm_option(BACKTRACE_ON_SEGFAULT "Install a signal handler to print a backtrace on segfault" OFF)
7373
tvm_option(BUILD_STATIC_RUNTIME "Build static version of libtvm_runtime" OFF)
7474
tvm_option(USE_PAPI "Use Performance Application Programming Interface (PAPI) to read performance counters" OFF)

cmake/libs/Libbacktrace.cmake

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,5 @@ ExternalProject_Add_Step(project_libbacktrace checkout
6262
DEPENDS ${LIBBACKTRACE_SRCS}
6363
)
6464

65-
add_library(libbacktrace STATIC IMPORTED)
66-
add_dependencies(libbacktrace project_libbacktrace)
67-
set_property(TARGET libbacktrace
68-
PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/lib/libbacktrace.a)
6965
# create include directory so cmake doesn't complain
7066
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include)

cmake/modules/Logging.cmake

Lines changed: 90 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
# This script configures the logging module and dependency on libbacktrace
1919

20+
include(FindPackageHandleStandardArgs)
21+
2022
if(USE_CUSTOM_LOGGING)
2123
# Set and propogate TVM_LOG_CUSTOMIZE flag is custom logging has been requested
2224
target_compile_definitions(tvm_objs PUBLIC TVM_LOG_CUSTOMIZE=1)
@@ -26,35 +28,98 @@ if(USE_CUSTOM_LOGGING)
2628
target_compile_definitions(tvm_runtime PUBLIC TVM_LOG_CUSTOMIZE=1)
2729
endif()
2830

29-
if("${USE_LIBBACKTRACE}" STREQUAL "AUTO")
30-
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
31-
set(USE_LIBBACKTRACE ON)
32-
else()
33-
set(USE_LIBBACKTRACE OFF)
34-
endif()
35-
message(STATUS "Autoset: USE_LIBBACKTRACE=" ${USE_LIBBACKTRACE} " in " ${CMAKE_SYSTEM_NAME})
36-
endif()
31+
add_library(libbacktrace STATIC IMPORTED)
32+
33+
set(LIBBACKTRACE_INCLUDE_DIR NOTFOUND)
34+
set(LIBBACKTRACE_STATIC_LIBRARY NOTFOUND)
35+
set(LIBBACKTRACE_FOUND NO)
3736

37+
macro(__find_libbacktrace)
38+
find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h)
39+
find_library(LIBBACKTRACE_STATIC_LIBRARY libbacktrace.a)
40+
find_package_handle_standard_args(LIBBACKTRACE REQUIRED_VARS
41+
LIBBACKTRACE_STATIC_LIBRARY LIBBACKTRACE_INCLUDE_DIR)
42+
endmacro()
3843

39-
if(USE_LIBBACKTRACE)
40-
message(STATUS "Building with libbacktrace...")
44+
macro(__find_libbacktrace_from PATH)
45+
find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h
46+
PATHS ${PATH}
47+
PATH_SUFFIXES include
48+
NO_CMAKE_SYSTEM_PATH
49+
NO_SYSTEM_ENVIRONMENT_PATH
50+
)
51+
find_library(LIBBACKTRACE_STATIC_LIBRARY libbacktrace.a
52+
PATHS ${PATH}
53+
PATH_SUFFIXES lib
54+
NO_CMAKE_SYSTEM_PATH
55+
NO_SYSTEM_ENVIRONMENT_PATH
56+
)
57+
find_package_handle_standard_args(LIBBACKTRACE REQUIRED_VARS
58+
LIBBACKTRACE_STATIC_LIBRARY LIBBACKTRACE_INCLUDE_DIR)
59+
endmacro()
60+
61+
macro(__compile_libbacktrace)
62+
message(STATUS "Building libbacktrace from 3rdparty/libbacktrace")
4163
include(cmake/libs/Libbacktrace.cmake)
42-
target_link_libraries(tvm PRIVATE libbacktrace)
43-
target_link_libraries(tvm_runtime PRIVATE libbacktrace)
64+
add_dependencies(libbacktrace project_libbacktrace)
65+
set(LIBBACKTRACE_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include)
66+
set(LIBBACKTRACE_STATIC_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/lib/libbacktrace.a)
4467
add_dependencies(tvm_runtime_objs libbacktrace)
45-
# pre 3.12 versions of cmake cannot propagate include directories from imported targets so we set them manually
46-
target_include_directories(tvm PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include")
47-
target_include_directories(tvm_objs PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include")
48-
target_include_directories(tvm_runtime PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include")
49-
target_include_directories(tvm_runtime_objs PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include")
50-
target_compile_definitions(tvm_objs PRIVATE TVM_USE_LIBBACKTRACE=1)
51-
target_compile_definitions(tvm_runtime_objs PRIVATE TVM_USE_LIBBACKTRACE=1)
68+
set(LIBBACKTRACE_FOUND YES)
69+
endmacro()
70+
71+
# Available options for USE_LIBBACKTRACE:
72+
# - OFF: Don't use libbacktrace
73+
# - ON: Find libbacktrace from system paths. Fail the build generation if libbacktrace is not found.
74+
# - COMPILE: Build and link to libbacktrace from 3rdparty/libbacktrace.
75+
# - <PATH>: Looking for the libbacktrace header and static lib from a user-provided path. Fail the build generation if libbacktrace is not found.
76+
# - AUTO:
77+
# - Find libbacktrace from system paths.
78+
# - If not found, fallback to COMPILE on Linux or MacOS, fallback to OFF on Windows or other platforms.
79+
if(USE_LIBBACKTRACE STREQUAL "AUTO")
80+
__find_libbacktrace()
81+
if(NOT LIBBACKTRACE_FOUND AND (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin"))
82+
__compile_libbacktrace()
83+
endif()
84+
elseif(USE_LIBBACKTRACE STREQUAL "COMPILE")
85+
__compile_libbacktrace()
86+
elseif("${USE_LIBBACKTRACE}" MATCHES ${IS_TRUE_PATTERN})
87+
__find_libbacktrace()
88+
if(NOT LIBBACKTRACE_FOUND)
89+
message(SEND_ERROR "libbacktrace not found.")
90+
endif()
91+
elseif("${USE_LIBBACKTRACE}" MATCHES ${IS_FALSE_PATTERN})
5292
else()
53-
target_compile_definitions(tvm_objs PRIVATE TVM_USE_LIBBACKTRACE=0)
54-
target_compile_definitions(tvm_runtime_objs PRIVATE TVM_USE_LIBBACKTRACE=0)
93+
# Treat USE_LIBBACKTRACE as path to libbacktrace
94+
message(STATUS "Using libbacktrace from ${USE_LIBBACKTRACE}")
95+
__find_libbacktrace_from(${USE_LIBBACKTRACE})
96+
if(NOT LIBBACKTRACE_FOUND)
97+
message(SEND_ERROR "libbacktrace not found from ${USE_LIBBACKTRACE}.")
98+
endif()
5599
endif()
56100

57-
if(BACKTRACE_ON_SEGFAULT)
58-
target_compile_definitions(tvm_objs PRIVATE TVM_BACKTRACE_ON_SEGFAULT)
59-
target_compile_definitions(tvm_runtime_objs PRIVATE TVM_BACKTRACE_ON_SEGFAULT)
60-
endif()
101+
set_property(TARGET libbacktrace
102+
PROPERTY IMPORTED_LOCATION ${LIBBACKTRACE_STATIC_LIBRARY})
103+
104+
function(configure_backtrace TARGET)
105+
if(LIBBACKTRACE_FOUND)
106+
get_target_property(target_type ${TARGET} TYPE)
107+
if(target_type MATCHES "EXECUTABLE|(STATIC|SHARED|MODULE)_LIBRARY")
108+
target_link_libraries(${TARGET} PRIVATE libbacktrace)
109+
endif()
110+
target_include_directories(${TARGET} PRIVATE ${LIBBACKTRACE_INCLUDE_DIR})
111+
target_compile_definitions(${TARGET} PRIVATE TVM_USE_LIBBACKTRACE=1)
112+
else()
113+
target_compile_definitions(${TARGET} PRIVATE TVM_USE_LIBBACKTRACE=0)
114+
endif()
115+
116+
if(BACKTRACE_ON_SEGFAULT)
117+
target_compile_definitions(${TARGET} PRIVATE TVM_BACKTRACE_ON_SEGFAULT)
118+
endif()
119+
endfunction()
120+
121+
configure_backtrace(tvm)
122+
configure_backtrace(tvm_runtime)
123+
configure_backtrace(tvm_objs)
124+
configure_backtrace(tvm_runtime_objs)
125+

0 commit comments

Comments
 (0)