From 30082c0101bbc59ea6caffd8cf71bf65e1597b1d Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sat, 27 Jan 2018 07:49:08 +0100 Subject: [PATCH 1/1] Rewrite how we search for libunwind (hopefully correctly this time) This time, I used the canonical approach: Instead of passing the absolute path to the libraries to the linker, I use link_directory() and -lname as I should. I hope that this version will work for both java on all our target architectures, and also for stampede. If so, we should maybe contribute it to libunwind and/or cmake projects. --- CMakeLists.txt | 20 +--- tools/cmake/Modules/FindLibunwind.cmake | 149 +++++++++++++++--------- 2 files changed, 96 insertions(+), 73 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 961bd16b24..c4625b8fc9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -379,23 +379,7 @@ endif() include(FindLibunwind) if(HAVE_LIBUNWIND) - if(NOT APPLE) - SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind") - 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() + SET(SIMGRID_DEP "${SIMGRID_DEP} ${LIBUNWIND_LIBRARIES}") 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.") @@ -417,6 +401,8 @@ else() SET(SIMGRID_HAVE_MC 0) set(HAVE_MMALLOC 0) endif() +mark_as_advanced(PATH_LIBDW_H) +mark_as_advanced(PATH_LIBDW_LIB) if (enable_model-checking AND enable_ns3) message(FATAL_ERROR "Cannot activate both model-checking and NS3 bindings: NS3 pull too much dependencies for the MC to work") diff --git a/tools/cmake/Modules/FindLibunwind.cmake b/tools/cmake/Modules/FindLibunwind.cmake index 68ad740f82..8b6dbd3998 100644 --- a/tools/cmake/Modules/FindLibunwind.cmake +++ b/tools/cmake/Modules/FindLibunwind.cmake @@ -1,72 +1,109 @@ -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) +# 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() -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/) +# +# 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{SIMGRID_LIBUNWIND_LIBRARY_PATH} - $ENV{LD_LIBRARY_PATH} - $ENV{LIBUNWIND_LIBRARY_PATH} + $ENV{LIBUNWIND_HINT} + $ENV{LD_LIBRARY_PATH} PATH_SUFFIXES include/ GnuWin32/include - PATHS - /opt - /opt/local - /opt/csw - /sw - /usr) - + PATHS /opt /opt/local /opt/csw /sw /usr) if(PATH_LIBUNWIND_H) string(REGEX REPLACE "/libunwind.h" "" PATH_LIBUNWIND_H "${PATH_LIBUNWIND_H}") - message(STATUS "Looking for libunwind.h - found in ${PATH_LIBUNWIND_H}") + message(" Found libunwind.h in ${PATH_LIBUNWIND_H}") include_directories(${PATH_LIBUNWIND_H}) else() - message(STATUS "Looking for libunwind.h - not found") + message(" NOT FOUND libunwind.h") + SET(HAVE_LIBUNWIND 0) endif() +mark_as_advanced(PATH_LIBUNWIND_H) -if(PATH_LIBUNWIND_LIB) - string(REGEX REPLACE "/libunwind.*[.]${LIB_EXE}$" "" PATH_LIBUNWIND_LIB "${PATH_LIBUNWIND_LIB}") - message(STATUS "Looking for libunwind.${LIB_EXE} - found in ${PATH_LIBUNWIND_LIB}") - link_directories(${PATH_LIBUNWIND_LIB}) -else() - message(STATUS "Looking for libunwind - not found") -endif() +# +# Search for the library components +# -if(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H) - SET(HAVE_LIBUNWIND 1) +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() - SET(HAVE_LIBUNWIND 0) + message(STATUS "Some libunwind components are missing") + set(LIBUNWIND_LIBRARIES "") 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) -- 2.20.1