]> git.cworth.org Git - apitrace/blob - CMakeLists.txt
Use CPack for packaging.
[apitrace] / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.8)
2
3 project (apitrace)
4
5
6 ##############################################################################
7 # Find dependencies
8
9 set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
10
11 # Set default built type
12 if (NOT CMAKE_BUILD_TYPE)
13     set (CMAKE_BUILD_TYPE Debug
14         CACHE
15         STRING "Choose the build type, options are: None, Debug, Release, RelWithDebInfo, or MinSizeRel."
16         FORCE)
17 endif (NOT CMAKE_BUILD_TYPE)
18
19 set (CMAKE_USE_PYTHON_VERSION 2.6)
20
21 find_package (PythonInterp REQUIRED)
22 find_package (OpenGL REQUIRED)
23 find_package (Qt4 4.7 COMPONENTS QtCore QtGui QtWebKit)
24 find_package (QJSON)
25
26 if (NOT WIN32)
27     # Always use the bundled zlib and libpng sources on Windows to make it easy
28     # to deploy the wrappers DLLs
29     find_package (ZLIB)
30     find_package (PNG)
31     find_package (X11 REQUIRED)
32
33     # We use GLX on MacOSX, which is in a separate library
34     if (APPLE)
35         find_library (X11_GL_LIB GL ${X11_LIB_SEARCH_PATH})
36         set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_GL_LIB})
37     endif (APPLE)
38 else (NOT WIN32)
39     find_package (DirectX)
40 endif (NOT WIN32)
41
42
43 ##############################################################################
44 # Set global build options
45
46 include (CheckCXXCompilerFlag)
47
48 if (WIN32)
49     # MSVC & MinGW only define & use APIENTRY
50     add_definitions (-DGLAPIENTRY=__stdcall)
51
52     # http://msdn.microsoft.com/en-us/library/aa383745.aspx
53     add_definitions (-D_WIN32_WINNT=0x0500 -DWINVER=0x0500)
54 else (WIN32)
55     CHECK_CXX_COMPILER_FLAG("-fvisibility=hidden" CXX_COMPILER_FLAG_VISIBILITY)
56     if (CXX_COMPILER_FLAG_VISIBILITY)
57         add_definitions ("-fvisibility=hidden")
58     endif (CXX_COMPILER_FLAG_VISIBILITY)
59 endif (WIN32)
60
61 if (MSVC)
62     # C99 includes for msvc
63     include_directories (msvc)
64
65     # Enable math constants defines
66     add_definitions (-D_USE_MATH_DEFINES)
67
68     # No min/max macros
69     add_definitions (-DNOMINMAX)
70
71     # Adjust warnings
72     add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
73     add_definitions (-D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS)
74     add_definitions (-W4)
75     add_definitions (-wd4244) # conversion from 'type1' to 'type2', possible loss of data
76     add_definitions (-wd4505) # unreferenced local function has been removed
77     add_definitions (-wd4800) # forcing value to bool 'true' or 'false' (performance warning)
78     # XXX: it's safer to use ssize_t everywhere instead of disabling warning
79     add_definitions (-wd4018) # signed/unsigned mismatch
80     
81     # Use static runtime
82     # http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
83     foreach (flag_var
84         CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
85         CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
86     )
87         if (${flag_var} MATCHES "/MD")
88             string (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
89         endif (${flag_var} MATCHES "/MD")
90     endforeach (flag_var)
91 else ()
92     # Adjust warnings
93     add_definitions (-Wall)
94     # XXX: it's safer to use ssize_t everywhere instead of disabling warning
95     add_definitions (-Wno-sign-compare) # comparison between signed and unsigned integer expressions
96 endif ()
97
98
99 # Put all executables into the same top level build directory, regardless of
100 # which subdirectory they are declared
101 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
102
103 include_directories (${CMAKE_CURRENT_SOURCE_DIR})
104
105
106 ##############################################################################
107 # Bundled dependencies
108
109 # Use bundled ZLIB if system one can't be found
110 if (ZLIB_FOUND)
111     include_directories (${ZLIB_INCLUDE_DIRS})
112     link_libraries (${ZLIB_LIBRARIES})
113 else (ZLIB_FOUND)
114     add_library (zlib STATIC
115         zlib/adler32.c
116         zlib/compress.c
117         zlib/crc32.c
118         zlib/gzio.c
119         zlib/uncompr.c
120         zlib/deflate.c
121         zlib/trees.c
122         zlib/zutil.c
123         zlib/inflate.c
124         zlib/infback.c
125         zlib/inftrees.c
126         zlib/inffast.c
127     )
128     include_directories (zlib)
129     link_libraries (zlib)
130 endif (ZLIB_FOUND)
131
132 # Use bundled LIBPNG if system one can't be found
133 if (PNG_FOUND)
134     include_directories (${PNG_INCLUDE_DIR})
135     add_definitions (${PNG_DEFINITIONS})
136     link_libraries (${PNG_LIBRARIES})
137 else (PNG_FOUND)
138     add_library (png STATIC
139         libpng/png.c
140         libpng/pngerror.c
141         libpng/pngget.c
142         libpng/pngmem.c
143         libpng/pngpread.c
144         libpng/pngread.c
145         libpng/pngrio.c
146         libpng/pngrtran.c
147         libpng/pngrutil.c
148         libpng/pngset.c
149         libpng/pngtrans.c
150         libpng/pngwio.c
151         libpng/pngwrite.c
152         libpng/pngwtran.c
153         libpng/pngwutil.c
154     )
155     include_directories (libpng)
156     link_libraries (png)
157 endif (PNG_FOUND)
158
159
160 ##############################################################################
161 # Common libraries / utilities
162
163 add_custom_command (
164     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
165     COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glproc.py > ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
166     DEPENDS glproc.py dispatch.py wglapi.py glxapi.py glapi.py gltypes.py stdapi.py
167 )
168
169 if (WIN32)
170     set (os os_win32.cpp)
171     set (glws glws_wgl.cpp)
172 else (WIN32)
173     set (os os_posix.cpp)
174     set (glws glws_glx.cpp)
175 endif (WIN32)
176
177 add_library (trace trace_model.cpp trace_parser.cpp trace_write.cpp ${os})
178
179 add_executable (tracedump tracedump.cpp)
180 target_link_libraries (tracedump trace)
181 install (TARGETS tracedump RUNTIME DESTINATION bin) 
182
183
184 ##############################################################################
185 # API tracers
186
187 if (WIN32)
188     # d3d8.dll
189     if (DirectX_D3D8_INCLUDE_DIR)
190         include_directories (${DirectX_D3D8_INCLUDE_DIR})
191         add_custom_command (
192             OUTPUT d3d8.cpp
193             COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d8.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d8.cpp
194             DEPENDS d3d8.py trace.py d3d8types.py d3d8caps.py d3dshader.py winapi.py stdapi.py
195         )
196         add_library (d3d8 SHARED d3d8.def d3d8.cpp trace_write.cpp os_win32.cpp)
197         set_target_properties (d3d8
198             PROPERTIES PREFIX ""
199             RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
200             LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
201         )
202         install (TARGETS d3d8 RUNTIME DESTINATION wrappers)
203     endif (DirectX_D3D8_INCLUDE_DIR)
204
205     # d3d9.dll
206     if (DirectX_D3DX9_INCLUDE_DIR)
207         include_directories (${DirectX_D3DX9_INCLUDE_DIR})
208         add_custom_command (
209             OUTPUT d3d9.cpp
210             COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d9.cpp
211             DEPENDS d3d9.py trace.py d3d9types.py d3d9caps.py d3dshader.py winapi.py stdapi.py
212         )
213         add_library (d3d9 SHARED d3d9.def d3d9.cpp trace_write.cpp os_win32.cpp)
214         set_target_properties (d3d9
215             PROPERTIES PREFIX ""
216             RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
217             LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
218         )
219         install (TARGETS d3d9 RUNTIME DESTINATION wrappers)
220     endif (DirectX_D3DX9_INCLUDE_DIR)
221
222     # d3d10.dll
223     #if (DirectX_D3D10_INCLUDE_DIR)
224     #    include_directories (${DirectX_D3D10_INCLUDE_DIR})
225     #    add_custom_command (
226     #        OUTPUT d3d10.cpp
227     #        COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d10misc.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d10.cpp
228     #        DEPENDS d3d10misc.py winapi.py stdapi.py
229     #    )
230     #    add_library (d3d10 SHARED d3d10.def d3d10.cpp trace_write.cpp os_win32.cpp)
231     #    set_target_properties (d3d10 PROPERTIES PREFIX "")
232     #    install (TARGETS d3d10 RUNTIME DESTINATION wrappers)
233     #endif (DirectX_D3D10_INCLUDE_DIR)
234
235     # opengl32.dll
236     add_custom_command (
237         OUTPUT wgltrace.cpp
238         COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/wgltrace.cpp
239         DEPENDS wgltrace.py gltrace.py trace.py wglapi.py wglenum.py glapi.py glparams.py gltypes.py winapi.py stdapi.py
240     )
241     add_library (wgltrace SHARED opengl32.def wgltrace.cpp trace_write.cpp os_win32.cpp ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp)
242     set_target_properties (wgltrace PROPERTIES
243         PREFIX ""
244         OUTPUT_NAME opengl32
245         RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
246         LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
247     )
248     if (MINGW)
249         set_target_properties(wgltrace PROPERTIES LINK_FLAGS "-Wl,--enable-stdcall-fixup ${CMAKE_CURRENT_SOURCE_DIR}/opengl32.def")
250     endif (MINGW)
251     install (TARGETS wgltrace RUNTIME DESTINATION wrappers)
252
253 else ()
254     include_directories (${X11_INCLUDE_DIR})
255
256     # libGL.so
257     add_custom_command (
258         OUTPUT glxtrace.cpp
259         COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glxtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glxtrace.cpp
260         DEPENDS glxtrace.py gltrace.py trace.py glxapi.py glapi.py glparams.py gltypes.py stdapi.py
261     )
262
263     add_library (glxtrace SHARED glxtrace.cpp trace_write.cpp os_posix.cpp ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp)
264
265     set_target_properties (glxtrace PROPERTIES
266         # avoid the default "lib" prefix
267         PREFIX ""
268     )
269
270     # Prevent symbol relocations internal to our wrapper library to be
271     # overwritten by the application.
272     if (NOT APPLE)
273         set_target_properties (glxtrace PROPERTIES
274             LINK_FLAGS "-Wl,-Bsymbolic -Wl,-Bsymbolic-functions"
275         )
276     endif (NOT APPLE)
277
278     target_link_libraries (glxtrace dl)
279     
280     install (TARGETS glxtrace LIBRARY DESTINATION lib)
281 endif ()
282
283
284 ##############################################################################
285 # API retracers
286
287 add_custom_command (
288     OUTPUT glretrace_gl.cpp
289     COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace_gl.cpp
290     DEPENDS glretrace.py retrace.py codegen.py glapi.py gltypes.py stdapi.py
291 )
292
293 add_custom_command (
294     OUTPUT glretrace_state.cpp
295     COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glstate.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace_state.cpp
296     DEPENDS glstate.py glparams.py gltypes.py stdapi.py
297 )
298
299 include_directories (
300     ${CMAKE_CURRENT_BINARY_DIR}
301     ${OPENGL_INCLUDE_PATH}
302 )
303
304 add_executable (glretrace
305     glretrace_gl.cpp
306     glretrace_glx.cpp
307     glretrace_wgl.cpp
308     glretrace_main.cpp
309     glretrace_state.cpp
310     retrace.cpp
311     ${glws}
312     image.cpp 
313     ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
314 )
315
316 set_property (
317     TARGET glretrace
318     APPEND
319     PROPERTY COMPILE_DEFINITIONS "RETRACE"
320 )
321
322 target_link_libraries (glretrace
323     trace
324     ${OPENGL_gl_LIBRARY}
325 )
326
327 if (NOT WIN32)
328     target_link_libraries (glretrace ${X11_LIBRARIES})
329 endif (NOT WIN32)
330
331 install (TARGETS glretrace RUNTIME DESTINATION bin) 
332
333
334 ##############################################################################
335 # GUI
336
337 if (QT4_FOUND AND QJSON_FOUND)
338     add_subdirectory(gui)
339 endif (QT4_FOUND AND QJSON_FOUND)
340
341
342 ##############################################################################
343 # Packaging
344
345 set (CPACK_PACKAGE_VERSION_MAJOR "1")
346 set (CPACK_PACKAGE_VERSION_MINOR "0")
347
348 # Use current date in YYYYMMDD format as patch number 
349 execute_process (
350     COMMAND ${PYTHON_EXECUTABLE} -c "import time, sys; sys.stdout.write(time.strftime('%Y%m%d'))"
351     OUTPUT_VARIABLE CPACK_PACKAGE_VERSION_PATCH
352 )
353
354 if (WIN32)
355     set (CPACK_GENERATOR "ZIP")
356 else (WIN32)
357     set (CPACK_GENERATOR "TGZ")
358 endif (WIN32)
359
360 include(CPack)