Port signature help test to new LSP test framework
[hiphop-php.git] / CMake / FindLibDwarf.cmake
blobd72b7ea8a2adc16b4efd4744bc24c800645b49c7
1 # - Try to find libdwarf
2 # Once done this will define
4 #  LIBDWARF_FOUND - system has libdwarf
5 #  LIBDWARF_INCLUDE_DIRS - the libdwarf include directory
6 #  LIBDWARF_LIBRARIES - Link these to use libdwarf
7 #  LIBDWARF_DEFINITIONS - Compiler switches required for using libdwarf
10 # Locate libelf library at first
11 if (NOT LIBELF_FOUND)
12   find_package (LibElf)
13 endif (NOT LIBELF_FOUND)
15 if (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS)
16   set (LibDwarf_FIND_QUIETLY TRUE)
17 endif (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS)
19 find_path (DWARF_INCLUDE_DIR
20   NAMES
21     libdwarf.h dwarf.h
22   PATHS
23     /usr/include
24     /usr/include/libdwarf
25     /usr/local/include
26     /usr/local/include/libdwarf
27     /opt/local/include
28     /sw/include
29     ENV CPATH) # PATH and INCLUDE will also work
31 if (DWARF_INCLUDE_DIR)
32   set (LIBDWARF_INCLUDE_DIRS  ${DWARF_INCLUDE_DIR})
33 endif ()
35 find_library (LIBDWARF_LIBRARIES
36   NAMES
37     dwarf libdwarf
38   PATHS
39     /usr/lib
40     /usr/local/lib
41     /opt/local/lib
42     /sw/lib
43     ENV LIBRARY_PATH   # PATH and LIB will also work
44     ENV LD_LIBRARY_PATH)
45 include (FindPackageHandleStandardArgs)
48 # handle the QUIETLY and REQUIRED arguments and set LIBDWARF_FOUND to TRUE
49 # if all listed variables are TRUE
50 FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibDwarf DEFAULT_MSG
51   LIBELF_FOUND
52   LIBDWARF_LIBRARIES
53   LIBDWARF_INCLUDE_DIRS)
55 if (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS)
56   set(CMAKE_REQUIRED_INCLUDES ${LIBDWARF_INCLUDE_DIRS})
57   set(CMAKE_REQUIRED_LIBRARIES ${LIBDWARF_LIBRARIES} ${LIBELF_LIBRARIES})
59   # libdwarf makes breaking changes occasionally and doesn't provide an easy
60   # way to test for them. The following checks should detect the changes and
61   # pass that information on accordingly.
62   INCLUDE(CheckCXXSourceCompiles)
63   INCLUDE(CheckFunctionExists)
65   MACRO(CHECK_LIBDWARF_INIT init params var)
66     # Check for the existence of this particular init function.
67     unset(INIT_EXISTS CACHE)
68     CHECK_FUNCTION_EXISTS(${init} INIT_EXISTS)
69     if (INIT_EXISTS)
70       set(LIBDWARF_USE_INIT_C ${var})
72       # Check to see if we can use a const name.
73       unset(DW_CONST CACHE)
75       if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
76         # -std=c++11 is already set in HPHPCompiler.cmake, don't
77         # add -std=c++0x on top of that or clang will give errors
78         set(CMAKE_REQUIRED_FLAGS "-std=c++0x")
79       endif()
81       CHECK_CXX_SOURCE_COMPILES("
82       #include <libdwarf.h>
83       #include <cstddef>
84       int dwarfCallback(const char * a, int b, Dwarf_Unsigned c,
85         Dwarf_Unsigned d, Dwarf_Unsigned e, Dwarf_Unsigned f,
86         Dwarf_Unsigned * g, Dwarf_Ptr h, int * i) {}
87       int main() { ${init}(${params}); return 0; }" DW_CONST)
88       if (DW_CONST)
89         set(LIBDWARF_CONST_NAME 1)
90       else()
91         set(LIBDWARF_CONST_NAME 0)
92       endif()
93     endif()
94   ENDMACRO(CHECK_LIBDWARF_INIT)
96   # Order is important, last one is used.
97   CHECK_LIBDWARF_INIT("dwarf_producer_init"
98         "0, dwarfCallback, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr" 0)
99   CHECK_LIBDWARF_INIT("dwarf_producer_init_c" "0, dwarfCallback, nullptr, nullptr, nullptr, nullptr" 1)
101   set(CMAKE_REQUIRED_INCLUDES)
102   set(CMAKE_REQUIRED_LIBRARIES)
103 endif()
105 if(LIBDWARF_CONST_NAME)
106   message(STATUS "libdwarf uses const char* type")
107 else()
108   message(STATUS "libdwarf uses char* type")
109 endif()
110 if(LIBDWARF_USE_INIT_C)
111   message(STATUS "libdwarf has dwarf_producer_init_c")
112 else()
113   message(STATUS "libdwarf does not have dwarf_producer_init_c, using dwarf_producer_init")
114 endif()
116 mark_as_advanced(LIBDW_INCLUDE_DIR DWARF_INCLUDE_DIR)
117 mark_as_advanced(LIBDWARF_INCLUDE_DIRS LIBDWARF_LIBRARIES)
118 mark_as_advanced(LIBDWARF_CONST_NAME LIBDWARF_USE_INIT_C)