+ # C99 includes for msvc
+ include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/msvc)
+
+ # Enable math constants defines
+ add_definitions (-D_USE_MATH_DEFINES)
+
+ # No min/max macros
+ add_definitions (-DNOMINMAX)
+
+ # Adjust warnings
+ add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
+ add_definitions (-D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS)
+ add_definitions (-W4)
+ add_definitions (-wd4063) # not a valid value for switch of enum
+ add_definitions (-wd4127) # conditional expression is constant
+ add_definitions (-wd4244) # conversion from 'type1' to 'type2', possible loss of data
+ add_definitions (-wd4505) # unreferenced local function has been removed
+ add_definitions (-wd4800) # forcing value to bool 'true' or 'false' (performance warning)
+ # XXX: it's safer to use ssize_t everywhere instead of disabling warning
+ add_definitions (-wd4018) # signed/unsigned mismatch
+
+ # Use static runtime
+ # http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
+ foreach (flag_var
+ CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
+ CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
+ )
+ if (${flag_var} MATCHES "/MD")
+ string (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+ endif (${flag_var} MATCHES "/MD")
+ endforeach (flag_var)
+else ()
+ # Adjust warnings
+ add_definitions (-Wall)
+ # XXX: it's safer to use ssize_t everywhere instead of disabling warning
+ add_definitions (-Wno-sign-compare) # comparison between signed and unsigned integer expressions
+endif ()
+
+if (MINGW)
+ # Avoid depending on MinGW runtime DLLs
+ check_cxx_compiler_flag (-static-libgcc HAVE_STATIC_LIBGCC_FLAG)
+ if (HAVE_STATIC_LIBGCC_FLAG)
+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc")
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc")
+ set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -static-libgcc")
+ endif ()
+ check_cxx_compiler_flag (-static-libstdc++ HAVE_STATIC_LIBSTDCXX_FLAG)
+ if (HAVE_STATIC_LIBSTDCXX_FLAG)
+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++")
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libstdc++")
+ set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -static-libstdc++")
+ endif ()
+endif ()
+
+
+# Put all executables into the same top level build directory, regardless of
+# which subdirectory they are declared
+set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+
+
+##############################################################################
+# Bundled dependencies
+#
+# We always use the bundled zlib, libpng, and snappy sources:
+# - on Windows to make it easy to deploy the wrappers DLLs
+# - on unices to prevent symbol collisions when tracing applications that link
+# against other versions of these libraries
+
+set (ZLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/zlib)
+set (ZLIB_LIBRARIES z_bundled)
+add_subdirectory (thirdparty/zlib EXCLUDE_FROM_ALL)
+
+include_directories (${ZLIB_INCLUDE_DIRS})
+link_libraries (${ZLIB_LIBRARIES})
+
+set (SNAPPY_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/snappy)
+set (SNAPPY_LIBRARIES snappy_bundled)
+add_subdirectory (thirdparty/snappy EXCLUDE_FROM_ALL)
+
+include_directories (${SNAPPY_INCLUDE_DIRS})
+link_libraries (${SNAPPY_LIBRARIES})
+
+set (PNG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpng)
+set (PNG_DEFINITIONS "")
+set (PNG_LIBRARIES png_bundled)
+
+add_subdirectory (thirdparty/libpng EXCLUDE_FROM_ALL)
+include_directories (${PNG_INCLUDE_DIR})
+add_definitions (${PNG_DEFINITIONS})
+link_libraries (${PNG_LIBRARIES})
+
+# The Qt website provides binaries for Windows and MacOSX, and they are
+# automatically found by cmake without any manual intervention. The situation
+# for QJSON is substantially different: there are no binaries for QJSON
+# available, and there is no standard installation directory that is detected
+# by cmake.
+#
+# By bundling the QJSON source, we make it much more easier to build the GUI on
+# Windows and MacOSX. But we only use the bundled sources when ENABLE_GUI is
+# AUTO.
+if (QT4_FOUND AND NOT QJSON_FOUND AND (ENABLE_GUI STREQUAL "AUTO"))
+ add_subdirectory (thirdparty/qjson EXCLUDE_FROM_ALL)
+ set (QJSON_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/qjson)
+ set (QJSON_LIBRARY_DIRS)
+ set (QJSON_LIBRARIES qjson_bundled)
+ set (QJSON_FOUND TRUE)
+endif ()
+
+# For glext headers
+include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty)
+
+
+##############################################################################
+# Installation directories
+
+if (WIN32 OR APPLE)
+ # On Windows/MacOSX, applications are usually installed on a directory of
+ # their own
+ set (DOC_INSTALL_DIR doc)
+else ()
+ set (DOC_INSTALL_DIR share/doc/${CMAKE_PROJECT_NAME})
+endif ()
+
+set (LIB_INSTALL_DIR lib/apitrace)
+
+if (APPLE)
+ # MacOSX uses fat binaries, so no need to have per-architecture wrapper
+ # directories
+ set (LIB_ARCH_INSTALL_DIR ${LIB_INSTALL_DIR})
+else ()
+ set (LIB_ARCH_INSTALL_DIR ${LIB_INSTALL_DIR}/${CMAKE_SYSTEM_PROCESSOR})
+endif ()
+
+set(SCRIPTS_INSTALL_DIR ${LIB_INSTALL_DIR}/scripts)
+set(WRAPPER_INSTALL_DIR ${LIB_ARCH_INSTALL_DIR}/wrappers)
+
+# Expose the binary/install directories to source
+#
+# TODO: Use the same directory layout, for both build and install directories,
+# so that binaries can find each other using just relative paths.
+#
+add_definitions(
+ -DAPITRACE_BINARY_DIR="${CMAKE_BINARY_DIR}"
+ -DAPITRACE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}"
+ -DAPITRACE_SCRIPTS_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/${SCRIPTS_INSTALL_DIR}"
+ -DAPITRACE_WRAPPER_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/${WRAPPER_INSTALL_DIR}"
+)
+
+
+##############################################################################
+# Common libraries / utilities
+
+include_directories (
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/common
+)
+
+add_custom_command (
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glproc.py > ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
+ DEPENDS glproc.py dispatch.py specs/wglapi.py specs/glxapi.py specs/cglapi.py specs/glapi.py specs/gltypes.py specs/stdapi.py
+)
+
+if (WIN32)
+ set (os os_win32.cpp)
+ set (glws_os glws_wgl.cpp)