X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5dd32633734c45f8697bab68eb972a2bb6a415a6..3bad6a38bb80df39b69ceaa4a3cefc059df5b0a1:/tools/cmake/Modules/FindLibunwind.cmake diff --git a/tools/cmake/Modules/FindLibunwind.cmake b/tools/cmake/Modules/FindLibunwind.cmake index bce74ff8e6..f0d47867d7 100644 --- a/tools/cmake/Modules/FindLibunwind.cmake +++ b/tools/cmake/Modules/FindLibunwind.cmake @@ -1,83 +1,95 @@ -if(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/) - - # Mac OSX has a libunwind that is not the one we need, so double check - if (PATH_LIBUNWIND_LIB) - CHECK_LIBRARY_EXISTS(unwind unw_init_local PATH_LIBUNWIND_LIB RIGHT_LIBUNWIND) - if (NOT RIGHT_LIBUNWIND) - unset(PATH_LIBUNWIND_LIB) - endif() - endif() +FIND_PATH(LIBUNWIND_INCLUDE_DIR libunwind.h) +if(NOT LIBUNWIND_INCLUDE_DIR) + message(WARNING "failed to find libunwind.h") + set(LIBUNWIND_FOUND "") +elseif(NOT EXISTS "${LIBUNWIND_INCLUDE_DIR}/unwind.h") + message(WARNING "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(WARNING "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)