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
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
26 /usr/local/include/libdwarf
29 ENV CPATH) # PATH and INCLUDE will also work
31 if (DWARF_INCLUDE_DIR)
32 set (LIBDWARF_INCLUDE_DIRS ${DWARF_INCLUDE_DIR})
35 find_library (LIBDWARF_LIBRARIES
43 ENV LIBRARY_PATH # PATH and LIB will also work
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
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)
70 set(LIBDWARF_USE_INIT_C ${var})
72 # Check to see if we can use a const name.
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")
81 CHECK_CXX_SOURCE_COMPILES("
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)
89 set(LIBDWARF_CONST_NAME 1)
91 set(LIBDWARF_CONST_NAME 0)
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)
105 if(LIBDWARF_CONST_NAME)
106 message(STATUS "libdwarf uses const char* type")
108 message(STATUS "libdwarf uses char* type")
110 if(LIBDWARF_USE_INIT_C)
111 message(STATUS "libdwarf has dwarf_producer_init_c")
113 message(STATUS "libdwarf does not have dwarf_producer_init_c, using dwarf_producer_init")
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)