X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=CMakeLists.txt;h=81e5cdcd8f8ada8c8145aa0a18ab48539ba86f54;hb=refs%2Fheads%2Fglx-copy-sub-buffer;hp=f019049e3f561e9f395ee23cfc481621fa443da2;hpb=bcb5850afb381e4814d247917311494d7edd2e91;p=apitrace diff --git a/CMakeLists.txt b/CMakeLists.txt index f019049..81e5cdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,8 @@ cmake_minimum_required (VERSION 2.8) # Use clang on MacOSX. gcc doesn't support __thread key, and Apple has # abandoned it for clang. This must be done before the project is defined. -if (APPLE) +# But DONT force clang if we are cross-compiling to Android. +if (APPLE AND NOT ANDROID_NDK) set (CMAKE_C_COMPILER "clang") set (CMAKE_CXX_COMPILER "clang++") endif () @@ -34,18 +35,16 @@ set (ENABLE_EGL true CACHE BOOL "Enable EGL support.") ############################################################################## # Find dependencies -# Ensure __thread is support -if (NOT MSVC) +# Check for compiler TLS support. We don't use compiler TLS support on Windows +# because, even if the compiler supports it, Windows XP does not support TLS on +# DLLs. +if (NOT WIN32) include (CheckCXXSourceCompiles) check_cxx_source_compiles("__thread int i; int main() { return 0; }" HAVE_COMPILER_TLS) - if (NOT HAVE_COMPILER_TLS) - if (APPLE) - message (FATAL_ERROR "C++ compiler does not support __thread keyword. Please install XCode 4.5 or higher.") - else (MINGW32) - message (FATAL_ERROR "C++ compiler does not support __thread keyword. Please use MinGW g++ version 4.4 or higher") - else () - message (FATAL_ERROR "C++ compiler does not support __thread keyword.") - endif () + if (HAVE_COMPILER_TLS) + add_definitions (-DHAVE_COMPILER_TLS=__thread) + else () + message (WARNING "C++ compiler does not support __thread keyword.") endif () endif () @@ -69,7 +68,6 @@ if (ENABLE_GUI) set (REQUIRE_GUI REQUIRED) endif () find_package (Qt4 4.7 COMPONENTS QtCore QtGui QtWebKit ${REQUIRE_GUI}) - find_package (QJSON ${REQUIRE_GUI}) endif () if (WIN32) @@ -83,6 +81,10 @@ else () if (X11_FOUND) include_directories (${X11_INCLUDE_DIR}) add_definitions (-DHAVE_X11) + else () + # Print a clear message when X11 is not found + include (FindPackageMessage) + find_package_message (X11 "Could not find X11" "") endif () endif () @@ -103,8 +105,11 @@ else (WIN32) endif () if (MSVC) - # C99 includes for msvc - include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/msvc) + # C99 includes for MSVC + include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/msinttypes) + + # No RTTI required + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-") # Enable math constants defines add_definitions (-D_USE_MATH_DEFINES) @@ -142,6 +147,9 @@ else () # 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 + # No RTTI required + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") + # Use GDB extensions if available if (CMAKE_COMPILER_IS_GNUC) set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -O0") @@ -172,12 +180,54 @@ if (MINGW) endif () endif () +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + # For RTLD_DEFAULT and RTLD_NEXT + add_definitions (-D_GNU_SOURCE) +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}) +############################################################################## +# Installation directories + +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + # Debian multiarch support + execute_process(COMMAND dpkg-architecture -qDEB_HOST_MULTIARCH + OUTPUT_VARIABLE ARCH_SUBDIR + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + CHECK_INCLUDE_FILES(proc/readproc.h READPROC_H_FOUND) + if (READPROC_H_FOUND) + add_definitions (-DHAVE_READPROC_H) + find_library (proc_LIBRARY NAMES proc procps) + endif () +endif() + +if (WIN32 OR APPLE) + # On Windows/MacOSX, applications are usually installed on a directory of + # their own + set (DOC_INSTALL_DIR doc) + set (LIB_INSTALL_DIR lib) + set (LIB_ARCH_INSTALL_DIR lib) +else () + set (DOC_INSTALL_DIR share/doc/${CMAKE_PROJECT_NAME}) + set (LIB_INSTALL_DIR lib/${CMAKE_PROJECT_NAME}) + if (ARCH_SUBDIR) + set (LIB_ARCH_INSTALL_DIR lib/${ARCH_SUBDIR}/${CMAKE_PROJECT_NAME}) + else () + set (LIB_ARCH_INSTALL_DIR lib/${CMAKE_PROJECT_NAME}) + endif () +endif () + +set (SCRIPTS_INSTALL_DIR ${LIB_INSTALL_DIR}/scripts) +set (WRAPPER_INSTALL_DIR ${LIB_ARCH_INSTALL_DIR}/wrappers) + + ############################################################################## # Bundled dependencies # @@ -188,13 +238,13 @@ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set (ZLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/zlib) set (ZLIB_LIBRARIES z_bundled) -add_subdirectory (thirdparty/zlib EXCLUDE_FROM_ALL) +add_subdirectory (thirdparty/zlib) include_directories (${ZLIB_INCLUDE_DIRS}) set (SNAPPY_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/snappy) set (SNAPPY_LIBRARIES snappy_bundled) -add_subdirectory (thirdparty/snappy EXCLUDE_FROM_ALL) +add_subdirectory (thirdparty/snappy) include_directories (${SNAPPY_INCLUDE_DIRS}) @@ -202,31 +252,33 @@ 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}) +add_subdirectory (thirdparty/libpng) if (MSVC) - add_subdirectory (thirdparty/getopt EXCLUDE_FROM_ALL) + add_subdirectory (thirdparty/getopt) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/getopt) set (GETOPT_LIBRARIES getopt_bundled) endif () if (WIN32) add_subdirectory (thirdparty/less) + add_subdirectory (thirdparty/directxtex) endif () -# 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) +if (CMAKE_EXECUTABLE_FORMAT STREQUAL "ELF") + add_subdirectory (thirdparty/libbacktrace) + include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libbacktrace) + set (LIBBACKTRACE_LIBRARIES dl backtrace) + add_definitions (-DHAVE_BACKTRACE=1) +endif () + +# Always use bundled QJSon. +# - The packaged versions QJson are very old, and do not support NaN/Infinity. +# - To make it easier to build the GUI on Windows and MacOSX, as there are no +# binaries at all. +if (QT4_FOUND) + add_definitions (-DQJSON_EXPORT=) + add_subdirectory (thirdparty/qjson) set (QJSON_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty) set (QJSON_LIBRARY_DIRS) set (QJSON_LIBRARIES qjson_bundled) @@ -240,50 +292,6 @@ endif () include_directories (BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/khronos) -############################################################################## -# Installation directories - -if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - # Debian multiarch support - execute_process(COMMAND dpkg-architecture -qDEB_HOST_MULTIARCH - OUTPUT_VARIABLE ARCH_SUBDIR - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -endif() - -if (WIN32 OR APPLE) - # On Windows/MacOSX, applications are usually installed on a directory of - # their own - set (DOC_INSTALL_DIR doc) - set (LIB_INSTALL_DIR lib) - set (LIB_ARCH_INSTALL_DIR lib) -else () - set (DOC_INSTALL_DIR share/doc/${CMAKE_PROJECT_NAME}) - set (LIB_INSTALL_DIR lib/${CMAKE_PROJECT_NAME}) - if (ARCH_SUBDIR) - set (LIB_ARCH_INSTALL_DIR lib/${ARCH_SUBDIR}/${CMAKE_PROJECT_NAME}) - else () - set (LIB_ARCH_INSTALL_DIR lib/${CMAKE_PROJECT_NAME}) - endif () -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_WRAPPERS_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/${WRAPPER_INSTALL_DIR}" -) - - ############################################################################## # Common libraries / utilities @@ -308,6 +316,7 @@ endif () add_library (common STATIC common/trace_callset.cpp common/trace_dump.cpp + common/trace_fast_callset.cpp common/trace_file.cpp common/trace_file_read.cpp common/trace_file_write.cpp @@ -320,25 +329,24 @@ add_library (common STATIC common/trace_writer_local.cpp common/trace_writer_model.cpp common/trace_loader.cpp - common/trace_resource.cpp - common/trace_tools_trace.cpp common/trace_profiler.cpp - common/image.cpp - common/image_bmp.cpp - common/image_pnm.cpp - common/image_png.cpp + common/trace_option.cpp common/${os} - common/workqueue.cpp + common/os_backtrace.cpp ) set_target_properties (common PROPERTIES - COMPILE_DEFINITIONS APITRACE_SOURCE_DIR="${CMAKE_SOURCE_DIR}" # Ensure it can be statically linked in shared libraries COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS}" ) +target_link_libraries (common + ${LIBBACKTRACE_LIBRARIES} +) if (ANDROID) - target_link_libraries (common log) + target_link_libraries (common + log + ) endif () @@ -346,7 +354,9 @@ endif () # Sub-directories add_subdirectory (dispatch) +add_subdirectory (helpers) add_subdirectory (wrappers) +add_subdirectory (image) add_subdirectory (retrace) @@ -354,7 +364,10 @@ add_subdirectory (retrace) # CLI if (ENABLE_CLI) - add_subdirectory(cli) + if (WIN32) + add_subdirectory (inject) + endif () + add_subdirectory (cli) endif () ############################################################################## @@ -362,11 +375,22 @@ endif () install ( PROGRAMS - ${CMAKE_CURRENT_SOURCE_DIR}/scripts/tracediff.py - ${CMAKE_CURRENT_SOURCE_DIR}/scripts/jsondiff.py - ${CMAKE_CURRENT_SOURCE_DIR}/scripts/snapdiff.py + scripts/highlight.py + scripts/jsondiff.py + scripts/profileshader.py + scripts/retracediff.py + scripts/snapdiff.py + scripts/tracecheck.py + scripts/tracediff.py + scripts/unpickle.py DESTINATION ${SCRIPTS_INSTALL_DIR} ) +if (WIN32) + install ( + PROGRAMS scripts/convert.py + DESTINATION ${SCRIPTS_INSTALL_DIR} + ) +endif () ############################################################################## # GUI @@ -382,13 +406,24 @@ endif () install ( FILES BUGS.markdown - LICENSE NEWS.markdown README.markdown DESTINATION ${DOC_INSTALL_DIR} ) +install ( + FILES LICENSE + DESTINATION ${DOC_INSTALL_DIR} + RENAME LICENSE.txt +) +if (MSVC) + install ( + FILES thirdparty/msinttypes/LICENSE + DESTINATION ${DOC_INSTALL_DIR} + RENAME LICENSE-msinttypes.txt + ) +endif () -set (CPACK_PACKAGE_VERSION_MAJOR "3") +set (CPACK_PACKAGE_VERSION_MAJOR "4") set (CPACK_PACKAGE_VERSION_MINOR "0") # Use current date in YYYYMMDD format as patch number