X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3bad6a38bb80df39b69ceaa4a3cefc059df5b0a1..9fd6cbc6c3b06f4b09e3c3339ffb3cc8a68f9bfa:/tools/cmake/Modules/FindLibunwind.cmake?ds=sidebyside diff --git a/tools/cmake/Modules/FindLibunwind.cmake b/tools/cmake/Modules/FindLibunwind.cmake index f0d47867d7..e4ca67f210 100644 --- a/tools/cmake/Modules/FindLibunwind.cmake +++ b/tools/cmake/Modules/FindLibunwind.cmake @@ -1,95 +1,109 @@ -# Find the libunwind library +# Search for libunwind and components, both includes and libraries # -# 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: +# Copyright (C) 2003-2018 The SimGrid Team. +# This is distributed under the LGPL licence but please contact us for +# relicensing if you need. This is merely free software, no matter the licence. # -# 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. +# Input environment variables: +# LIBUNWIND_HINT: path to libunwind installation (e.g., /usr) +# (only needed for non-standard installs) # -# 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") +# You can tune the needed components here. +# TODO: we should take this as a parameter if I knew how to do so. -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 "") +# SimGrid needs unwind-ptrace on Linux and FreeBSD +if("${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD") + set(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-ptrace) endif() -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) +# +# Output variables: +# HAVE_LIBUNWIND : if all components were found was found +# LIBUNWIND_LIBRARIES: List of all libraries to load (-lunwind -lunwind-x86_64 and such) +# +# Other effects: +# - Calls include_directories() on where libunwind.h lives +# - Calls link_directories() on where the libs live -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(WARNING "Failed to find unwind-ptrace library. Proceeding anyway.") -endif () -unset(LIBUNWIND_PTRACE_LIBRARY) +# Of course also need the core lib +set(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} "unwind") -# For some reason, we have to link to two libunwind shared object files: -# one arch-specific and one not. +# For some reason, some archs have an arch-specific while other do not. if (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") - SET(LIBUNWIND_ARCH "arm") + SET(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-arm) elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") - SET(LIBUNWIND_ARCH "x86_64") + SET(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-x86_64) elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") - SET(LIBUNWIND_ARCH "x86") + SET(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-x86) endif() -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 (LIBUNWIND_FOUND) - MESSAGE(STATUS "Found all required libunwind components.") +message(STATUS "Looking for libunwind:") +# Let's assume we have it, and invalidate if parts are missing +SET(HAVE_LIBUNWIND 1) + +# +# Search for the header file +# + +find_path(PATH_LIBUNWIND_H "libunwind.h" + HINTS + $ENV{LIBUNWIND_HINT} + $ENV{LD_LIBRARY_PATH} + PATH_SUFFIXES include/ GnuWin32/include + PATHS /opt /opt/local /opt/csw /sw /usr) +if(PATH_LIBUNWIND_H) + string(REGEX REPLACE "/libunwind.h" "" PATH_LIBUNWIND_H "${PATH_LIBUNWIND_H}") + message(" Found libunwind.h in ${PATH_LIBUNWIND_H}") + include_directories(${PATH_LIBUNWIND_H}) +else() + message(" NOT FOUND libunwind.h") + SET(HAVE_LIBUNWIND 0) endif() +mark_as_advanced(PATH_LIBUNWIND_H) + +# +# Search for the library components +# + +foreach(component ${LIBUNWIND_COMPONENTS}) + find_library(PATH_LIBUNWIND_LIB_${component} + NAMES ${component} + HINTS + $ENV{LIBUNWIND_HINT} + $ENV{LD_LIBRARY_PATH} + PATH_SUFFIXES lib/ GnuWin32/lib lib/system + PATHS /opt /opt/local /opt/csw /sw /usr /usr/lib/) + if(PATH_LIBUNWIND_LIB_${component}) + # message(" ${component} ${PATH_LIBUNWIND_LIB_${component}}") + string(REGEX REPLACE "/lib${component}.*[.]${LIB_EXE}$" "" PATH_LIBUNWIND_LIB_${component} "${PATH_LIBUNWIND_LIB_${component}}") + message(" Found lib${component}.${LIB_EXE} in ${PATH_LIBUNWIND_LIB_${component}}") + link_directories(${PATH_LIBUNWIND_LIB_${component}}) -MARK_AS_ADVANCED(LIBUNWIND_LIBRARIES LIBUNWIND_INCLUDE_DIR) + if(${component} STREQUAL "unwind" AND APPLE) + # Apple forbids to link directly against its libunwind implementation + # So let's comply to that stupid restriction and link against the System framework + SET(LIBUNWIND_LIBRARIES "${LIBUNWIND_LIBRARIES} -lSystem") + else() + SET(LIBUNWIND_LIBRARIES "${LIBUNWIND_LIBRARIES} -l${component}") + endif() + + else() + message(" Looking for lib${component}.${LIB_EXE} - not found") + SET(HAVE_LIBUNWIND 0) + endif() + mark_as_advanced(PATH_LIBUNWIND_LIB_${component}) +endforeach() +unset(component) +unset(LIBUNWIND_COMPONENTS) + +# +# Conclude and cleanup +# +if(HAVE_LIBUNWIND) + message(STATUS "Dependencies induced by libunwind: ${LIBUNWIND_LIBRARIES}") +else() + message(STATUS "Some libunwind components are missing") + set(LIBUNWIND_LIBRARIES "") +endif()