Use CMAKE_xx_COMPILER when building external dependencies (#636)
[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(LibIberty_FOUND)
28   return()
29 endif()
30
31 if(NOT UNIX)
32   return()
33 endif()
34
35 # Use the GNU C++ name demangler; if yes, this disables using LibIberty
36 set(USE_GNU_DEMANGLER ON CACHE BOOL "Use the GNU C++ name demangler")
37
38 # If we don't want to use/build LibIberty, then leave
39 if(USE_GNU_DEMANGLER)
40   return()
41 endif()
42
43 # -------------- PATHS --------------------------------------------------------
44
45 # Base directory the of LibIberty installation
46 set(LibIberty_ROOT_DIR "/usr"
47     CACHE PATH "Base directory the of LibIberty installation")
48
49 # Hint directory that contains the LibIberty library files
50 set(LibIberty_LIBRARYDIR "${LibIberty_ROOT_DIR}/lib"
51     CACHE PATH "Hint directory that contains the LibIberty library files")
52
53 # -------------- PACKAGES -----------------------------------------------------
54
55 find_package(LibIberty)
56
57 # -------------- SOURCE BUILD -------------------------------------------------
58 if(LibIberty_FOUND)
59   set(_li_root ${LibIberty_ROOT_DIR})
60   set(_li_lib_dirs ${LibIberty_LIBRARY_DIRS})
61   set(_li_libs ${LibIberty_LIBRARIES})
62   add_library(LibIberty STATIC IMPORTED)
63 else()
64   message(STATUS "${LibIberty_ERROR_REASON}")
65   message(STATUS "Attempting to build LibIberty as external project")
66
67   include(ExternalProject)
68   ExternalProject_Add(
69     LibIberty
70     PREFIX ${CMAKE_BINARY_DIR}/binutils
71     URL http://ftp.gnu.org/gnu/binutils/binutils-2.31.1.tar.gz
72     BUILD_IN_SOURCE 1
73     CONFIGURE_COMMAND
74       CFLAGS=-fPIC
75       CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER}
76       <SOURCE_DIR>/configure --prefix=${CMAKE_BINARY_DIR}/binutils
77     BUILD_COMMAND make
78     INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib/libiberty
79     INSTALL_COMMAND
80       install <SOURCE_DIR>/libiberty/libiberty.a <INSTALL_DIR>
81   )
82
83   set(_li_root ${CMAKE_INSTALL_PREFIX})
84   set(_li_lib_dirs ${_li_root}/lib)
85   set(_li_libs ${_li_lib_dirs}/libiberty/libiberty.a)
86   
87   # For backward compatibility
88   set(IBERTY_FOUND TRUE)
89   set(IBERTY_BUILD TRUE)
90 endif()
91
92 # Add a dummy target to either the found LibIberty or the one built from source.
93 # NB: For backwards compatibility only
94 add_custom_target(libiberty_imp)
95 add_dependencies(libiberty_imp LibIberty)
96   
97 # -------------- EXPORT VARIABLES ---------------------------------------------
98
99 set(LibIberty_ROOT_DIR ${_li_root}
100     CACHE PATH "Base directory the of LibIberty installation"
101     FORCE)
102 set(LibIberty_LIBRARY_DIRS ${_li_lib_dirs}
103     CACHE PATH "LibIberty library directory"
104     FORCE)
105 set(LibIberty_LIBRARIES ${_li_libs}
106     CACHE FILEPATH "LibIberty library files"
107     FORCE)
108
109 # This is only here to make ccmake work correctly
110 set(USE_GNU_DEMANGLER ${USE_GNU_DEMANGLER}
111     CACHE BOOL "Use the GNU C++ name demangler"
112     FORCE)
113
114 # For backward compatibility only
115 set(IBERTY_LIBRARIES ${LibIberty_LIBRARIES})
116
117 message(STATUS "LibIberty library dirs: ${LibIberty_LIBRARY_DIRS}")
118 message(STATUS "LibIberty libraries: ${LibIberty_LIBRARIES}")
119
120 if(USE_COTIRE)
121   cotire(LibIberty)
122 endif()