Update LibIberty to new build system (#601)
[dyninst.git] / cmake / LibIberty.cmake
1 #======================================================================================
2 # LibIberty.cmake
3 #
4 # Configure LibIberty for Dyninst
5 #
6 #   ----------------------------------------
7 #
8 # Accepts the following CMake variables
9 #
10 # USE_GNU_DEMANGLER       - Use the GNU C++ name demanger (if yes, this disables using LibIberty)
11 #
12 # Directly exports the following CMake variables
13 #
14 # LibIberty_ROOT_DIR       - Computed base directory the of LibIberty installation
15 # LibIberty_LIBRARY_DIRS   - Link directories for LibIberty libraries
16 # LibIberty_LIBRARIES      - LibIberty library files
17 #
18 # NOTE:
19 # The exported LibIberty_ROOT_DIR can be different from the value provided by the user
20 # in the case that it is determined to build LibIberty from source. In such a case,
21 # LibIberty_ROOT_DIR will contain the directory of the from-source installation.
22 #
23 # See Modules/FindLibIberty.cmake for details
24 #
25 #======================================================================================
26
27 if(NOT UNIX)
28   return()
29 endif()
30
31 # Use the GNU C++ name demangler; if yes, this disables using LibIberty
32 set(USE_GNU_DEMANGLER ON CACHE BOOL "Use the GNU C++ name demangler")
33
34 # If we don't want to use/build LibIberty, then leave
35 if(USE_GNU_DEMANGLER)
36   return()
37 endif()
38
39 # -------------- PATHS --------------------------------------------------------
40
41 # Base directory the of LibIberty installation
42 set(LibIberty_ROOT_DIR "/usr"
43     CACHE PATH "Base directory the of LibIberty installation")
44
45 # Hint directory that contains the LibIberty library files
46 set(LibIberty_LIBRARYDIR "${LibIberty_ROOT_DIR}/lib"
47     CACHE PATH "Hint directory that contains the LibIberty library files")
48
49 # -------------- PACKAGES -----------------------------------------------------
50
51 find_package(LibIberty)
52
53 # -------------- SOURCE BUILD -------------------------------------------------
54 if(LibIberty_FOUND)
55   set(_li_root ${LibIberty_ROOT_DIR})
56   set(_li_lib_dirs ${LibIberty_LIBRARY_DIRS})
57   set(_li_libs ${LibIberty_LIBRARIES})
58   add_library(LibIberty STATIC IMPORTED)
59 else()
60   message(STATUS "${LibIberty_ERROR_REASON}")
61   message(STATUS "Attempting to build LibIberty as external project")
62
63   include(ExternalProject)
64   ExternalProject_Add(
65     LibIberty
66     PREFIX ${CMAKE_BINARY_DIR}/binutils
67     URL http://ftp.gnu.org/gnu/binutils/binutils-2.31.1.tar.gz
68     BUILD_IN_SOURCE 1
69     CONFIGURE_COMMAND
70       CFLAGS=-fPIC
71       <SOURCE_DIR>/configure --prefix=${CMAKE_BINARY_DIR}/binutils
72     BUILD_COMMAND make
73     INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib/libiberty
74     INSTALL_COMMAND
75       install <SOURCE_DIR>/libiberty/libiberty.a <INSTALL_DIR>
76   )
77
78   set(_li_root ${CMAKE_INSTALL_PREFIX})
79   set(_li_lib_dirs ${_li_root}/lib)
80   set(_li_libs ${_li_lib_dirs}/libiberty/libiberty.a)
81   
82   # For backward compatibility
83   set(IBERTY_FOUND TRUE)
84   set(IBERTY_BUILD TRUE)
85 endif()
86
87 # Add a dummy target to either the found LibIberty or the one built from source.
88 # NB: For backwards compatibility only
89 add_custom_target(libiberty_imp)
90 add_dependencies(libiberty_imp LibIberty)
91   
92 # -------------- EXPORT VARIABLES ---------------------------------------------
93
94 set(LibIberty_ROOT_DIR ${_li_root}
95     CACHE PATH "Base directory the of LibIberty installation"
96     FORCE)
97 set(LibIberty_LIBRARY_DIRS ${_li_lib_dirs}
98     CACHE PATH "LibIberty library directory"
99     FORCE)
100 set(LibIberty_LIBRARIES ${_li_libs}
101     CACHE FILEPATH "LibIberty library files"
102     FORCE)
103
104 # This is only here to make ccmake work correctly
105 set(USE_GNU_DEMANGLER ${USE_GNU_DEMANGLER}
106     CACHE BOOL "Use the GNU C++ name demangler"
107     FORCE)
108
109 # For backward compatibility only
110 set(IBERTY_LIBRARIES ${LibIberty_LIBRARIES})
111
112 message(STATUS "LibIberty library dirs: ${LibIberty_LIBRARY_DIRS}")
113 message(STATUS "LibIberty libraries: ${LibIberty_LIBRARIES}")
114
115 if(USE_COTIRE)
116   cotire(LibIberty)
117 endif()