# Search for libunwind and components, both includes and libraries # # 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. # # # Input environment variables: # LIBUNWIND_HINT: path to libunwind installation (e.g., /usr) # (only needed for non-standard installs) # # You can tune the needed components here. # TODO: we should take this as a parameter if I knew how to do so. # SimGrid needs unwind-ptrace on Linux and FreeBSD if("${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD") set(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-ptrace) endif() # # 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 # Of course also need the core lib set(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} "unwind") # For some reason, some archs have an arch-specific while other do not. if (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") SET(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-arm) elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") SET(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-x86_64) elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") SET(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-x86) endif() 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}}) 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()