Add compiler-specific search directories in getResolvedLibraryPath (#732)
[dyninst.git] / dyninstAPI_RT / CMakeLists.txt
1 # CMake configuration for dyninstAPI_RT directory
2 cmake_minimum_required (VERSION 2.6.4)
3 project (DyninstRT C)
4
5 set (DYNINST_ROOT ${PROJECT_SOURCE_DIR}/..)
6 set(CMAKE_C_FLAGS "${DYNINST_RT_CMAKE_C_FLAGS}")
7 set(CMAKE_CXX_FLAGS "${DYNINST_RT_CMAKE_CXX_FLAGS}")
8
9 include (${DYNINST_ROOT}/cmake/shared.cmake)
10
11 include_directories (
12     ${DYNINST_ROOT}/dyninstAPI_RT/src
13     ${DYNINST_ROOT}/dyninstAPI_RT/h
14     ${DYNINST_ROOT}
15   )
16
17 set (SRC_LIST
18     src/RTcommon.c 
19     src/RTmemEmulator.c
20 )
21
22 if (PLATFORM MATCHES freebsd)
23 set (SRC_LIST ${SRC_LIST}
24     src/RTposix.c
25     src/RTfreebsd.c 
26     src/RTheap.c 
27     src/RTheap-freebsd.c 
28     src/RTthread.c 
29     src/RTspace.S 
30     src/RTsignal.c 
31 )
32 elseif (PLATFORM MATCHES linux OR PLATFORM MATCHES bgq)
33 set (SRC_LIST ${SRC_LIST}
34     src/RTposix.c 
35     src/RTlinux.c 
36     src/RTheap.c 
37     src/RTheap-linux.c 
38     src/RTthread.c 
39     src/RTspace.S 
40     src/RTsignal.c
41     src/RTstatic_ctors_dtors_begin.c 
42     src/RTstatic_ctors_dtors_end.c 
43 )
44 elseif (PLATFORM MATCHES nt OR PLATFORM MATCHES windows)
45 set (SRC_LIST ${SRC_LIST}
46     src/RTheap.c 
47     src/RTheap-win.c
48     src/RTwinnt.c
49     src/RTthread.c
50     src/RTthread-x86.c
51 )
52 endif ()
53
54 set (SRC_LIST_i386
55     src/RTthread-x86.c 
56     src/RTtlsgetaddr-x86.S 
57     src/RTstatic_ctors_dtors-x86.c
58 )
59 set (SRC_LIST_x86_64
60     src/RTthread-x86-64.c 
61     src/RTtlsgetaddr-x86.S
62     src/RTstatic_ctors_dtors-x86.c
63 )
64 set (SRC_LIST_ppc32
65     src/RTthread-powerpc.c
66     src/RTthread-powerpc-asm.S
67     src/RTstatic_ctors_dtors-ppc32.c
68 )
69 set (SRC_LIST_ppc64
70     src/RTthread-powerpc.c
71     src/RTthread-powerpc-asm.S
72     src/RTstatic_ctors_dtors-ppc64.c                                                                                         
73 )
74 set (SRC_LIST_aarch64
75     src/RTthread-aarch64.c
76     #src/RTthread-aarch64-asm.S
77     src/RTstatic_ctors_dtors-aarch64.c                                                                                         
78 )
79
80
81 # We use gcc to compile the various assembly files, but
82 # cmake doesn't default to knowing that gcc can
83 # handle .S. 
84 ENABLE_LANGUAGE(ASM)
85 file (GLOB SRC_ASSEMBLY "src/*.S")
86 if(PLATFORM MATCHES bgq OR NEED_NATIVE_ASSEMBER MATCHES YES)
87 set_source_files_properties(${SRC_ASSEMBLY}
88         PROPERTIES
89         LANGUAGE ASM)
90 else()
91 set_source_files_properties(${SRC_ASSEMBLY}
92         PROPERTIES
93         LANGUAGE C)
94 endif()
95
96 # The arch-specific files other than RTthread-x86 are Unix-only.
97 if(UNIX)
98 if (PLATFORM MATCHES amd64 OR PLATFORM MATCHES x86_64)
99 set (SRC_LIST_mabi ${SRC_LIST} ${SRC_LIST_i386})
100 set (SRC_LIST ${SRC_LIST} ${SRC_LIST_x86_64})
101 elseif (PLATFORM MATCHES ppc64)
102 set (SRC_LIST_mabi ${SRC_LIST} ${SRC_LIST_ppc32})
103 set (SRC_LIST ${SRC_LIST} ${SRC_LIST_ppc64}) 
104 elseif (PLATFORM MATCHES i386)
105 set (SRC_LIST ${SRC_LIST} ${SRC_LIST_i386})
106 elseif (PLATFORM MATCHES ppc32)
107 set (SRC_LIST ${SRC_LIST} ${SRC_LIST_ppc32})
108 elseif (PLATFORM MATCHES aarch64)
109 set (SRC_LIST ${SRC_LIST} ${SRC_LIST_aarch64})
110 endif()
111 endif()
112
113 add_library (dyninstAPI_RT SHARED ${SRC_LIST})
114 if(TARGET TBB)
115     add_dependencies(dyninstAPI_RT TBB)
116 endif()
117
118 if (NOT PLATFORM MATCHES nt AND NOT PLATFORM MATCHES windows)
119     target_link_libraries (dyninstAPI_RT ${CMAKE_DL_LIBS})
120 else() # windows
121     target_link_libraries (dyninstAPI_RT ws2_32 dbghelp psapi)
122 endif()
123
124 add_library (dyninstAPI_RT_static STATIC ${SRC_LIST})
125 if(TARGET TBB)
126     add_dependencies(dyninstAPI_RT_static TBB)
127 endif()
128
129 # this should carry over from CMakeLists.txt
130 set_target_properties (dyninstAPI_RT
131                       PROPERTIES
132                       OUTPUT_NAME dyninstAPI_RT
133                       SOVERSION ${SOVERSION}
134                       VERSION ${LIBVERSION})
135
136 # this will not
137 set_target_properties (dyninstAPI_RT_static
138                       PROPERTIES
139                       OUTPUT_NAME dyninstAPI_RT
140                       COMPILE_DEFINITIONS DYNINST_RT_STATIC_LIB)
141
142 set_target_properties (dyninstAPI_RT PROPERTIES CLEAN_DIRECT_OUTPUT 1)
143 set_target_properties (dyninstAPI_RT_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
144
145
146 message(STATUS "dyninstAPI RT library SOVERSION: ${SOVERSION}")
147 message(STATUS "dyninstAPI RT library LIBVERSION: ${LIBVERSION}")
148
149 FILE (GLOB headers "h/*.h")
150 # append, you fool!
151 set_target_properties (dyninstAPI_RT dyninstAPI_RT_static PROPERTIES PUBLIC_HEADER "${headers}")
152
153 INSTALL (TARGETS dyninstAPI_RT dyninstAPI_RT_static
154         EXPORT DyninstTargets
155         RUNTIME DESTINATION ${INSTALL_LIB_DIR}
156         LIBRARY DESTINATION ${INSTALL_LIB_DIR}
157         ARCHIVE DESTINATION ${INSTALL_LIB_DIR}
158         PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDE_DIR})
159
160 # Test to see if we want the 32-bit library
161
162 if (SRC_LIST_mabi) 
163
164 # The following code is from CheckCCompilerFlag.cmake. It uses a
165 # simple program that can be compiled even if 32-bit includes are 
166 # missing; we need to extend it somewhat
167
168 INCLUDE(CheckCSourceCompiles)
169
170 MACRO (CHECK_C_COMPILER_FLAG_EXTENDED _FLAG _RESULT)
171    SET(SAFE_CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
172    SET(CMAKE_C_FLAGS "${_FLAG}")
173
174 # Addition here: use signal.h
175    CHECK_C_SOURCE_COMPILES("#include <signal.h>
176    int main(void) { return 0; }" 
177         ${_RESULT}
178 # End addition
179      # Some compilers do not fail with a bad flag
180      FAIL_REGEX "warning: command line option .* is valid for .* but not for C"
181                                                             # Apple gcc
182      FAIL_REGEX "unrecognized .*option"                     # GNU
183      FAIL_REGEX "unknown .*option"                          # Clang
184      FAIL_REGEX "ignoring unknown option"                   # MSVC
185      FAIL_REGEX "warning D9002"                             # MSVC, any lang
186      FAIL_REGEX "[Uu]nknown option"                         # HP
187      FAIL_REGEX "[Ww]arning: [Oo]ption"                     # SunPro
188      FAIL_REGEX "command option .* is not recognized"       # XL
189      )
190    SET(CMAKE_C_FLAGS "${SAFE_CMAKE_C_FLAGS}")
191 ENDMACRO (CHECK_C_COMPILER_FLAG_EXTENDED)
192
193
194 message (STATUS "Checking for 32-bit runtime library...")
195
196 CHECK_C_COMPILER_FLAG_EXTENDED ("-m32" CHECK_RT_LIB_32)
197 if (CHECK_RT_LIB_32 AND NOT ${PLATFORM} MATCHES bgq AND NOT ${BUILD_RTLIB_32} MATCHES "OFF")
198 message (STATUS "Enabling 32-bit runtime library; change BUILD_RTLIB_32 to OFF to disable")
199 SET (BUILD_RTLIB_32 ON)
200 ELSE ()
201 message (STATUS "Disabling 32-bit runtime library; change BUILD_RTLIB_32 to ON and install 32-bit build environment to enable")
202 SET (BUILD_RTLIB_32 OFF)
203 ENDIF()
204
205 if (BUILD_RTLIB_32 MATCHES "ON")
206
207 add_library (dyninstAPI_RT_m32 SHARED ${SRC_LIST_mabi})
208 target_link_libraries (dyninstAPI_RT_m32 ${CMAKE_DL_LIBS})
209 add_library (dyninstAPI_RT_m32_static STATIC ${SRC_LIST_mabi})
210
211 set_target_properties (dyninstAPI_RT_m32
212                       PROPERTIES
213                       COMPILE_FLAGS "-DMUTATEE_32 -m32"
214                       LINK_FLAGS "-m32"
215                       OUTPUT_NAME dyninstAPI_RT_m32
216                       SOVERSION ${SOVERSION}
217                       VERSION ${LIBVERSION})
218
219 set_target_properties (dyninstAPI_RT_m32_static
220                       PROPERTIES
221                       OUTPUT_NAME dyninstAPI_RT_m32
222                       COMPILE_FLAGS "-DMUTATEE_32 -m32"
223                       LINK_FLAGS "-m32"
224                       COMPILE_DEFINITIONS DYNINST_RT_STATIC_LIB)
225
226 set_target_properties (dyninstAPI_RT_m32 PROPERTIES CLEAN_DIRECT_OUTPUT 1)
227 set_target_properties (dyninstAPI_RT_m32_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
228
229 INSTALL (TARGETS dyninstAPI_RT_m32 dyninstAPI_RT_m32_static
230         EXPORT DyninstTargets
231         RUNTIME DESTINATION ${INSTALL_LIB_DIR}
232         LIBRARY DESTINATION ${INSTALL_LIB_DIR}
233         ARCHIVE DESTINATION ${INSTALL_LIB_DIR}
234         PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDE_DIR})
235
236 install (EXPORT DyninstTargets
237   DESTINATION "${INSTALL_CMAKE_DIR}")
238
239 endif()
240 endif()