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