Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Survive to when libunwind does not exist (hello again windows)
[simgrid.git] / tools / cmake / Modules / FindLibunwind.cmake
index d940934..ae9b5af 100644 (file)
@@ -1,85 +1,95 @@
-message(STATUS "Looking for libunwind")
+# 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
 
-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)
-  message(STATUS "Looking for libunwind-x86_64 - found")
-endif()
+# 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)
 
-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)
-    message(STATUS "Looking for libunwind - found")
-    CHECK_LIBRARY_EXISTS(unwind unw_init_local PATH_LIBUNWIND_LIB RIGHT_LIBUNWIND)
-    if (NOT RIGHT_LIBUNWIND)
-      message(STATUS "This libunwind does not contain unw_init_local(). It's unusable.")
-      set(PATH_LIBUNWIND_LIB 0)
-    endif()
-    
-  else()
-    message(STATUS "Looking for libunwind - not found")
-  endif()
+set(LIBUNWIND_FOUND "1")
 
+FIND_PATH(LIBUNWIND_INCLUDE_DIR libunwind.h)
+if(NOT LIBUNWIND_INCLUDE_DIR)
+  message(WARNING "failed to find libunwind.h")
+  set(LIBUNWIND_FOUND "")
+elif(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()
 
-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 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.")
 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)