From 7889a699e76b2298ab4e5fa6129b959763a94426 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 1 Jul 2026 14:04:55 +0300 Subject: [PATCH] Improve building libbacktrace --- 3rdparty/CMakeLists.txt | 63 +++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index b6a9cb5b..67cae553 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -7,30 +7,51 @@ if(PSEMEK_STACKTRACE) set(LIBBACKTRACE_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace") set(LIBBACKTRACE_INCLUDE_DIR "${LIBBACKTRACE_BUILD_DIR}/include") set(LIBBACKTRACE_LIBRARY "${LIBBACKTRACE_BUILD_DIR}/.libs/libbacktrace.a") + set(LIBBACKTRACE_CONFIGURED_STAMP "${LIBBACKTRACE_BUILD_DIR}/.configure-success-stamp") - if(NOT EXISTS "${LIBBACKTRACE_BUILD_DIR}") - file(COPY "${LIBBACKTRACE_SOURCE_DIR}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") - make_directory("${LIBBACKTRACE_INCLUDE_DIR}") - file(COPY "${LIBBACKTRACE_SOURCE_DIR}/backtrace.h" DESTINATION "${LIBBACKTRACE_INCLUDE_DIR}") - if(PSEMEK_PACKAGE_TARGET AND WIN32) - execute_process(COMMAND "./configure" "--host=x86_64-w64-mingw32" "CC=${CMAKE_C_COMPILER}" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) - elseif(PSEMEK_PACKAGE_TARGET AND ANDROID) - execute_process(COMMAND "./configure" "--host=aarch64-none-linux-android34" "CC=${CMAKE_C_COMPILER}" "CFLAGS=--target=aarch64-none-linux-android34" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) - elseif(APPLE) - execute_process(COMMAND "./configure" "CC=${CMAKE_C_COMPILER} -isysroot ${CMAKE_OSX_SYSROOT}" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) - elseif(UNIX) - execute_process(COMMAND "./configure" "CC=${CMAKE_C_COMPILER}" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) - else() - message(FATAL "Unknown platform") - endif() - execute_process(COMMAND "make" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" RESULT_VARIABLE LIBBACKTRACE_BUILD_RESULT COMMAND_ECHO STDOUT) - if(NOT (${LIBBACKTRACE_BUILD_RESULT} EQUAL 0)) - message(FATAL_ERROR "libbacktrace build failed") - endif() + if(PSEMEK_PACKAGE_TARGET AND WIN32) + set(LIBBACKTRACE_CONFIGURE_ARGS "--host=x86_64-w64-mingw32" "CC=${CMAKE_C_COMPILER}") + elseif(PSEMEK_PACKAGE_TARGET AND ANDROID) + set(LIBBACKTRACE_CONFIGURE_ARGS "--host=aarch64-none-linux-android34" "CC=${CMAKE_C_COMPILER}" "CFLAGS=--target=aarch64-none-linux-android34") + elseif(APPLE) + set(LIBBACKTRACE_CONFIGURE_ARGS "CC=${CMAKE_C_COMPILER} -isysroot ${CMAKE_OSX_SYSROOT}") + elseif(UNIX) + set(LIBBACKTRACE_CONFIGURE_ARGS "CC=${CMAKE_C_COMPILER}") + else() + message(FATAL_ERROR "Unknown platform") endif() - add_library(libbacktrace INTERFACE) + if(NOT EXISTS "${LIBBACKTRACE_CONFIGURED_STAMP}") + file(REMOVE_RECURSE "${LIBBACKTRACE_BUILD_DIR}") + file(COPY "${LIBBACKTRACE_SOURCE_DIR}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") + execute_process( + COMMAND ./configure ${LIBBACKTRACE_CONFIGURE_ARGS} + WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" + RESULT_VARIABLE LIBBACKTRACE_CONFIGURE_RESULT + COMMAND_ECHO STDOUT + ) + if(NOT LIBBACKTRACE_CONFIGURE_RESULT EQUAL 0) + message(FATAL_ERROR "libbacktrace configure failed") + endif() + file(WRITE "${LIBBACKTRACE_CONFIGURED_STAMP}" "") + endif() + + include(ExternalProject) + + ExternalProject_Add(libbacktrace-external + SOURCE_DIR "${LIBBACKTRACE_BUILD_DIR}" + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND make + INSTALL_COMMAND "" + BUILD_BYPRODUCTS "${LIBBACKTRACE_LIBRARY}" + ) + + add_library(libbacktrace STATIC IMPORTED GLOBAL) + set_target_properties(libbacktrace PROPERTIES IMPORTED_LOCATION "${LIBBACKTRACE_LIBRARY}") + file(MAKE_DIRECTORY "${LIBBACKTRACE_INCLUDE_DIR}") + file(COPY "${LIBBACKTRACE_SOURCE_DIR}/backtrace.h" DESTINATION "${LIBBACKTRACE_INCLUDE_DIR}") target_include_directories(libbacktrace INTERFACE "${LIBBACKTRACE_INCLUDE_DIR}") - target_link_libraries(libbacktrace INTERFACE "${LIBBACKTRACE_LIBRARY}") + add_dependencies(libbacktrace libbacktrace-external) endif()