1717
1818# This script configures the logging module and dependency on libbacktrace
1919
20+ include (FindPackageHandleStandardArgs)
21+
2022if (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)
2729endif ()
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} )
5292else ()
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 ()
5599endif ()
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