From: Martin Quinson Date: Thu, 25 Jan 2018 17:00:00 +0000 (+0100) Subject: sanitize our way to find and load libunwind X-Git-Tag: v3.19~304 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/2a8f06bcb45d972f49b0661754fac0d51772f02f sanitize our way to find and load libunwind The previous way of doing so was working OK on most machines, but not on some weirdly configured supercomputers. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 961bd16b24..e22357c33f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -378,24 +378,17 @@ else() endif() include(FindLibunwind) -if(HAVE_LIBUNWIND) +if(LIBUNWIND_FOUND) if(NOT APPLE) - SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind") + foreach(lib ${LIBUNWIND_LIBRARIES}) + SET(SIMGRID_DEP "${SIMGRID_DEP} ${lib}") + endforeach() + unset(lib) else() # Apple forbids to link directly against its libunwind implementation # So let's comply and link against the System framework SET(SIMGRID_DEP "${SIMGRID_DEP} -lSystem") endif() - if("${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD") - set(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-ptrace") - # This supposes that the host machine is either an AMD or a X86. - # This is deeply wrong, and should be fixed by manually loading -lunwind-PLAT (FIXME) - if(SIMGRID_PROCESSOR_x86_64) - SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86_64") - else() - SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86") - endif() - endif() else() if(enable_model-checking) message(FATAL_ERROR "Please install libunwind-dev libdw-dev libelf-dev libevent-dev if you want to compile the SimGrid model checker.") diff --git a/tools/cmake/Modules/FindLibunwind.cmake b/tools/cmake/Modules/FindLibunwind.cmake index 87adb1b994..79127687b7 100644 --- a/tools/cmake/Modules/FindLibunwind.cmake +++ b/tools/cmake/Modules/FindLibunwind.cmake @@ -1,75 +1,95 @@ -if(SIMGRID_PROCESSOR_x86_64) - find_library(PATH_LIBUNWIND_LIB - NAMES unwind-x86_64 - HINTS - $ENV{SIMGRID_LIBUNWIND_LIBRARY_PATH} - $ENV{LD_LIBRARY_PATH} - $ENV{LIBUNWIND_LIBRARY_PATH} - PATH_SUFFIXES lib/ GnuWin32/lib lib/system - PATHS - /opt - /opt/local - /opt/csw - /sw - /usr) -endif() +# Find the libunwind library +# +# LIBUNWIND_FOUND - True if libunwind was found. +# LIBUNWIND_LIBRARIES - The libraries needed to use libunwind +# LIBUNWIND_INCLUDE_DIR - Location of unwind.h and libunwind.h + +# This file was downloaded from https://github.com/cmccabe/lksmith/blob/master/cmake_modules/FindLibunwind.cmake +# Copyright (c) 2011-2012, the Locksmith authors. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Modified by the SimGrid team for: +# - Survive the fact that libunwind cannot be found (setting LIBUNWIND_FOUND correctly) +# - Also search for the unwind-ptrace component (but survive when it's not here) + +set(LIBUNWIND_FOUND "1") -if(NOT PATH_LIBUNWIND_LIB) - find_library(PATH_LIBUNWIND_LIB - NAMES unwind - HINTS - $ENV{SIMGRID_LIBUNWIND_LIBRARY_PATH} - $ENV{LD_LIBRARY_PATH} - $ENV{LIBUNWIND_LIBRARY_PATH} - PATH_SUFFIXES lib/ GnuWin32/lib lib/system - PATHS - /opt - /opt/local - /opt/csw - /sw - /usr - /usr/lib/) +FIND_PATH(LIBUNWIND_INCLUDE_DIR libunwind.h) +if(NOT LIBUNWIND_INCLUDE_DIR) + message(FATAL_ERROR "failed to find libunwind.h") + set(LIBUNWIND_FOUND "") +elif(NOT EXISTS "${LIBUNWIND_INCLUDE_DIR}/unwind.h") + message(FATAL_ERROR "libunwind.h was found, but unwind.h was not found in that directory.") + set(LIBUNWIND_FOUND "") + SET(LIBUNWIND_INCLUDE_DIR "") endif() -find_path(PATH_LIBUNWIND_H "libunwind.h" - HINTS - $ENV{SIMGRID_LIBUNWIND_LIBRARY_PATH} - $ENV{LD_LIBRARY_PATH} - $ENV{LIBUNWIND_LIBRARY_PATH} - PATH_SUFFIXES include/ GnuWin32/include - PATHS - /opt - /opt/local - /opt/csw - /sw - /usr) +FIND_LIBRARY(LIBUNWIND_GENERIC_LIBRARY "unwind") +if (LIBUNWIND_GENERIC_LIBRARY) + MESSAGE(STATUS "Found libunwind library: ${LIBUNWIND_GENERIC_LIBRARY}") +else() + set(LIBUNWIND_FOUND "") + MESSAGE(FATAL_ERROR "failed to find unwind generic library") +endif () +SET(LIBUNWIND_LIBRARIES ${LIBUNWIND_GENERIC_LIBRARY}) +unset(LIBUNWIND_GENERIC_LIBRARY) -message(STATUS "Looking for libunwind.h") -if(PATH_LIBUNWIND_H) - message(STATUS "Looking for libunwind.h - found") +FIND_LIBRARY(LIBUNWIND_PTRACE_LIBRARY "unwind-ptrace") +if (LIBUNWIND_PTRACE_LIBRARY) + MESSAGE(STATUS "Found libunwind-ptrace library: ${LIBUNWIND_PTRACE_LIBRARY}") + SET(LIBUNWIND_LIBRARIES ${LIBUNWIND_LIBRARIES} ${LIBUNWIND_PTRACE_LIBRARY}) else() - message(STATUS "Looking for libunwind.h - not found") + MESSAGE(WARNING "Failed to find unwind-ptrace library. Proceeding anyway.") +endif () +unset(LIBUNWIND_PTRACE_LIBRARY) + +# For some reason, we have to link to two libunwind shared object files: +# one arch-specific and one not. +if (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") + SET(LIBUNWIND_ARCH "arm") +elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") + SET(LIBUNWIND_ARCH "x86_64") +elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") + SET(LIBUNWIND_ARCH "x86") endif() -message(STATUS "Looking for libunwind") -if(PATH_LIBUNWIND_LIB) - message(STATUS "Looking for libunwind - found") -else() - message(STATUS "Looking for libunwind - not found") +if (LIBUNWIND_FOUND AND LIBUNWIND_ARCH) + FIND_LIBRARY(LIBUNWIND_SPECIFIC_LIBRARY "unwind-${LIBUNWIND_ARCH}") + if (LIBUNWIND_SPECIFIC_LIBRARY) + MESSAGE(STATUS "Found libunwind-${LIBUNWIND_ARCH} library: ${LIBUNWIND_SPECIFIC_LIBRARY}") + else() + MESSAGE(FATAL_ERROR "failed to find unwind-${LIBUNWIND_ARCH}") + set(LIBUNWIND_FOUND "") + endif () + SET(LIBUNWIND_LIBRARIES ${LIBUNWIND_LIBRARIES} ${LIBUNWIND_SPECIFIC_LIBRARY}) + unset(LIBUNWIND_SPECIFIC_LIBRARY) endif() -if(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H) - string(REGEX REPLACE "/libunwind.*[.]${LIB_EXE}$" "" PATH_LIBUNWIND_LIB "${PATH_LIBUNWIND_LIB}") - string(REGEX REPLACE "/libunwind.h" "" PATH_LIBUNWIND_H "${PATH_LIBUNWIND_H}") - - include_directories(${PATH_LIBUNWIND_H}) - link_directories(${PATH_LIBUNWIND_LIB}) - SET(HAVE_LIBUNWIND 1) -else() - SET(HAVE_LIBUNWIND 0) +if (LIBUNWIND_FOUND) + MESSAGE(STATUS "Found all required libunwind components.") endif() -mark_as_advanced(PATH_LIBDW_H) -mark_as_advanced(PATH_LIBDW_LIB) -mark_as_advanced(PATH_LIBUNWIND_LIB) -mark_as_advanced(PATH_LIBUNWIND_H) +MARK_AS_ADVANCED(LIBUNWIND_LIBRARIES LIBUNWIND_INCLUDE_DIR)