Add missing hphp_opts file
[hiphop-php.git] / CMake / FindLibDwarf.cmake
blobe509603491fa64f3f24702318e57735f356e3a4c
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 REQUIRED)
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   LIBDWARF_LIBRARIES
52   LIBDWARF_INCLUDE_DIRS)
54 if (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS)
55   set(CMAKE_REQUIRED_INCLUDES ${LIBDWARF_INCLUDE_DIRS})
56   set(CMAKE_REQUIRED_LIBRARIES ${LIBDWARF_LIBRARIES} ${LIBELF_LIBRARIES})
58   # libdwarf makes breaking changes occasionally and doesn't provide an easy
59   # way to test for them. The following checks should detect the changes and
60   # pass that information on accordingly.
61   INCLUDE(CheckCXXSourceCompiles)
62   INCLUDE(CheckFunctionExists)
64   MACRO(CHECK_LIBDWARF_INIT init params var)
65     # Check for the existence of this particular init function.
66     unset(INIT_EXISTS CACHE)
67     CHECK_FUNCTION_EXISTS(${init} INIT_EXISTS)
68     if (INIT_EXISTS)
69       set(LIBDWARF_USE_INIT_C ${var})
71       # Check to see if we can use a const name.
72       unset(DW_CONST CACHE)
74       if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
75         # -std=c++11 is already set in HPHPCompiler.cmake, don't
76         # add -std=c++0x on top of that or clang will give errors
77         set(CMAKE_REQUIRED_FLAGS "-std=c++0x")
78       endif()
80       CHECK_CXX_SOURCE_COMPILES("
81       #include <libdwarf.h>
82       #include <cstddef>
83       int dwarfCallback(const char * a, int b, Dwarf_Unsigned c,
84         Dwarf_Unsigned d, Dwarf_Unsigned e, Dwarf_Unsigned f,
85         Dwarf_Unsigned * g, Dwarf_Ptr h, int * i) {}
86       int main() { ${init}(${params}); return 0; }" DW_CONST)
87       if (DW_CONST)
88         set(LIBDWARF_CONST_NAME 1)
89       else()
90         set(LIBDWARF_CONST_NAME 0)
91       endif()
92     endif()
93   ENDMACRO(CHECK_LIBDWARF_INIT)
95   # Order is important, last one is used.
96   CHECK_LIBDWARF_INIT("dwarf_producer_init"  
97         "0, dwarfCallback, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr" 0)
98   CHECK_LIBDWARF_INIT("dwarf_producer_init_c" "0, dwarfCallback, nullptr, nullptr, nullptr, nullptr" 1)
99 endif()
101 if(LIBDWARF_CONST_NAME)
102   message(STATUS "libdwarf uses const char* type")
103 else()
104   message(STATUS "libdwarf uses char* type")
105 endif()
106 if(LIBDWARF_USE_INIT_C)
107   message(STATUS "libdwarf has dwarf_producer_init_c")
108 else()
109   message(STATUS "libdwarf does not have dwarf_producer_init_c, using dwarf_producer_init")
110 endif()
112 mark_as_advanced(LIBDW_INCLUDE_DIR DWARF_INCLUDE_DIR)
113 mark_as_advanced(LIBDWARF_INCLUDE_DIRS LIBDWARF_LIBRARIES)
114 mark_as_advanced(LIBDWARF_CONST_NAME LIBDWARF_USE_INIT_C)