Add StringInterner to FuncBuilder
[hiphop-php.git] / CMake / FindLibDwarf.cmake
blob2dc6142b47bed93062e2e76056c5bccb785b8895
1 # Copyright (c) 2004-present, Facebook, Inc.
2 # All rights reserved.
4 # This source code is licensed under the MIT license found in the
5 # LICENSE file in the hphp/hsl/ subdirectory of this source tree.
7 # - Try to find libdwarf
8 # Once done this will define
10 #  LIBDWARF_FOUND - system has libdwarf
11 #  LIBDWARF_INCLUDE_DIRS - the libdwarf include directory
12 #  LIBDWARF_LIBRARIES - Link these to use libdwarf
13 #  LIBDWARF_DEFINITIONS - Compiler switches required for using libdwarf
16 # Locate libelf library at first
17 if (NOT LIBELF_FOUND)
18   find_package (LibElf)
19 endif (NOT LIBELF_FOUND)
21 if (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS)
22   set (LibDwarf_FIND_QUIETLY TRUE)
23 endif (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS)
25 find_package(PkgConfig)
26 pkg_check_modules(PkgConfig_LibDwarf QUIET libdwarf)
28 find_path (DWARF_INCLUDE_DIR
29   NAMES
30     libdwarf.h dwarf.h
31   PATHS
32     ${PkgConfig_LibDwarf_INCLUDE_DIRS}
33     /usr/include
34     /usr/include/libdwarf
35     /usr/local/include
36     /usr/local/include/libdwarf
37     /opt/local/include
38     /sw/include
39     ENV CPATH) # PATH and INCLUDE will also work
41 if (DWARF_INCLUDE_DIR)
42   set (LIBDWARF_INCLUDE_DIRS  ${DWARF_INCLUDE_DIR})
43 endif ()
45 find_library (LIBDWARF_LIBRARIES
46   NAMES
47     dwarf libdwarf
48   PATHS
49     /usr/lib
50     /usr/local/lib
51     /opt/local/lib
52     /sw/lib
53     ${PkgConfig_LibDwarf_LIBRARY_DIRS}
54     ENV LIBRARY_PATH   # PATH and LIB will also work
55     ENV LD_LIBRARY_PATH)
56 include (FindPackageHandleStandardArgs)
59 # handle the QUIETLY and REQUIRED arguments and set LIBDWARF_FOUND to TRUE
60 # if all listed variables are TRUE
61 FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibDwarf DEFAULT_MSG
62   LIBELF_FOUND
63   LIBDWARF_LIBRARIES
64   LIBDWARF_INCLUDE_DIRS)
66 if (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS)
67   set(CMAKE_REQUIRED_INCLUDES ${LIBDWARF_INCLUDE_DIRS})
68   set(CMAKE_REQUIRED_LIBRARIES ${LIBDWARF_LIBRARIES} ${LIBELF_LIBRARIES})
70   # libdwarf makes breaking changes occasionally and doesn't provide an easy
71   # way to test for them. The following checks should detect the changes and
72   # pass that information on accordingly.
73   INCLUDE(CheckCXXSourceCompiles)
74   INCLUDE(CheckFunctionExists)
76   MACRO(CHECK_LIBDWARF_INIT init params var)
77     # Check for the existence of this particular init function.
78     unset(INIT_EXISTS CACHE)
79     CHECK_FUNCTION_EXISTS(${init} INIT_EXISTS)
80     if (INIT_EXISTS)
81       set(LIBDWARF_USE_INIT_C ${var})
83       # Check to see if we can use a const name.
84       unset(DW_CONST CACHE)
86       if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
87         # -std=c++11 is already set in HPHPCompiler.cmake, don't
88         # add -std=c++0x on top of that or clang will give errors
89         set(CMAKE_REQUIRED_FLAGS "-std=c++0x")
90       endif()
92       CHECK_CXX_SOURCE_COMPILES("
93       #include <libdwarf.h>
94       #include <cstddef>
95       int dwarfCallback(const char * a, int b, Dwarf_Unsigned c,
96         Dwarf_Unsigned d, Dwarf_Unsigned e, Dwarf_Unsigned f,
97         Dwarf_Unsigned * g, Dwarf_Ptr h, int * i) {}
98       int main() { ${init}(${params}); return 0; }" DW_CONST)
99       if (DW_CONST)
100         set(LIBDWARF_CONST_NAME 1)
101       else()
102         set(LIBDWARF_CONST_NAME 0)
103       endif()
104     endif()
105   ENDMACRO(CHECK_LIBDWARF_INIT)
107   # Order is important, last one is used.
108   CHECK_LIBDWARF_INIT("dwarf_producer_init"
109         "0, dwarfCallback, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr" 0)
110   CHECK_LIBDWARF_INIT("dwarf_producer_init_c" "0, dwarfCallback, nullptr, nullptr, nullptr, nullptr" 1)
112   set(CMAKE_REQUIRED_INCLUDES)
113   set(CMAKE_REQUIRED_LIBRARIES)
114 endif()
116 if(LIBDWARF_CONST_NAME)
117   message(STATUS "libdwarf uses const char* type")
118 else()
119   message(STATUS "libdwarf uses char* type")
120 endif()
121 if(LIBDWARF_USE_INIT_C)
122   message(STATUS "libdwarf has dwarf_producer_init_c")
123 else()
124   message(STATUS "libdwarf does not have dwarf_producer_init_c, using dwarf_producer_init")
125 endif()
127 mark_as_advanced(LIBDW_INCLUDE_DIR DWARF_INCLUDE_DIR)
128 mark_as_advanced(LIBDWARF_INCLUDE_DIRS LIBDWARF_LIBRARIES)
129 mark_as_advanced(LIBDWARF_CONST_NAME LIBDWARF_USE_INIT_C)