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
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
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
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)
69 set(LIBDWARF_USE_INIT_C ${var})
71 # Check to see if we can use a const name.
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")
80 CHECK_CXX_SOURCE_COMPILES("
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)
88 set(LIBDWARF_CONST_NAME 1)
90 set(LIBDWARF_CONST_NAME 0)
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)
101 if(LIBDWARF_CONST_NAME)
102 message(STATUS "libdwarf uses const char* type")
104 message(STATUS "libdwarf uses char* type")
106 if(LIBDWARF_USE_INIT_C)
107 message(STATUS "libdwarf has dwarf_producer_init_c")
109 message(STATUS "libdwarf does not have dwarf_producer_init_c, using dwarf_producer_init")
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)