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