Blame CMakeLists.txt

Packit b1f7ae
# Copyright (c) 2013-2017, Intel Corporation
Packit b1f7ae
#
Packit b1f7ae
# Redistribution and use in source and binary forms, with or without
Packit b1f7ae
# modification, are permitted provided that the following conditions are met:
Packit b1f7ae
#
Packit b1f7ae
#  * Redistributions of source code must retain the above copyright notice,
Packit b1f7ae
#    this list of conditions and the following disclaimer.
Packit b1f7ae
#  * Redistributions in binary form must reproduce the above copyright notice,
Packit b1f7ae
#    this list of conditions and the following disclaimer in the documentation
Packit b1f7ae
#    and/or other materials provided with the distribution.
Packit b1f7ae
#  * Neither the name of Intel Corporation nor the names of its contributors
Packit b1f7ae
#    may be used to endorse or promote products derived from this software
Packit b1f7ae
#    without specific prior written permission.
Packit b1f7ae
#
Packit b1f7ae
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit b1f7ae
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit b1f7ae
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit b1f7ae
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
Packit b1f7ae
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Packit b1f7ae
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Packit b1f7ae
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Packit b1f7ae
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Packit b1f7ae
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Packit b1f7ae
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit b1f7ae
# POSSIBILITY OF SUCH DAMAGE.
Packit b1f7ae
Packit b1f7ae
cmake_minimum_required(VERSION 2.8.6)
Packit b1f7ae
Packit b1f7ae
project(PT)
Packit b1f7ae
Packit b1f7ae
# versioning
Packit b1f7ae
#
Packit b1f7ae
# the major and the minor number define the supported Intel PT set.
Packit b1f7ae
#
Packit b1f7ae
# a build number and a version extension can be optionally specified.
Packit b1f7ae
#
Packit b1f7ae
set(PT_VERSION_MAJOR 1)
Packit b1f7ae
set(PT_VERSION_MINOR 6)
Packit b1f7ae
set(PT_VERSION_BUILD "1" CACHE STRING "")
Packit b1f7ae
set(PT_VERSION_EXT "" CACHE STRING "")
Packit b1f7ae
Packit b1f7ae
set(PT_VERSION "${PT_VERSION_MAJOR}.${PT_VERSION_MINOR}.${PT_VERSION_BUILD}")
Packit b1f7ae
Packit b1f7ae
add_definitions(
Packit b1f7ae
  -DPT_VERSION_MAJOR=${PT_VERSION_MAJOR}
Packit b1f7ae
  -DPT_VERSION_MINOR=${PT_VERSION_MINOR}
Packit b1f7ae
  -DPT_VERSION_BUILD=${PT_VERSION_BUILD}
Packit b1f7ae
  -DPT_VERSION_EXT=\"${PT_VERSION_EXT}\"
Packit b1f7ae
)
Packit b1f7ae
Packit b1f7ae
include(GNUInstallDirs)
Packit b1f7ae
include(FindUnixCommands)
Packit b1f7ae
Packit b1f7ae
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
Packit b1f7ae
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
Packit b1f7ae
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
Packit b1f7ae
set(MAN_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/man)
Packit b1f7ae
Packit b1f7ae
set(CMAKE_COLOR_MAKEFILE   OFF)
Packit b1f7ae
set(CMAKE_VERBOSE_MAKEFILE ON)
Packit b1f7ae
Packit b1f7ae
set(CMAKE_MACOSX_RPATH ON)
Packit b1f7ae
Packit b1f7ae
option(FEATURE_THREADS "A small amount of multi-threading support." ON)
Packit b1f7ae
if (FEATURE_THREADS)
Packit b1f7ae
  add_definitions(-DFEATURE_THREADS)
Packit b1f7ae
endif (FEATURE_THREADS)
Packit b1f7ae
Packit b1f7ae
option(DEVBUILD "Enable compiler warnings and turn them into errors." OFF)
Packit b1f7ae
Packit b1f7ae
option(PTDUMP "Enable ptdump, a packet dumper")
Packit b1f7ae
option(PTXED  "Enable ptxed, an instruction flow dumper")
Packit b1f7ae
option(PTTC   "Enable pttc, a test compiler")
Packit b1f7ae
option(PTUNIT "Enable ptunit, a unit test system and libipt unit tests")
Packit b1f7ae
option(MAN "Enable man pages (requires pandoc)." OFF)
Packit b1f7ae
Packit b1f7ae
set(PTT OFF)
Packit b1f7ae
if (BASH AND PTDUMP AND PTXED AND PTTC)
Packit b1f7ae
  set(PTT ON)
Packit b1f7ae
endif ()
Packit b1f7ae
Packit b1f7ae
if (PTUNIT OR PTT)
Packit b1f7ae
  ENABLE_TESTING()
Packit b1f7ae
endif()
Packit b1f7ae
Packit b1f7ae
include_directories(
Packit b1f7ae
  include
Packit b1f7ae
  ${CMAKE_CURRENT_BINARY_DIR}/libipt/include
Packit b1f7ae
)
Packit b1f7ae
Packit b1f7ae
if (PTUNIT)
Packit b1f7ae
  include_directories(
Packit b1f7ae
    ptunit/include
Packit b1f7ae
  )
Packit b1f7ae
endif (PTUNIT)
Packit b1f7ae
Packit b1f7ae
if (CMAKE_HOST_WIN32)
Packit b1f7ae
  include_directories(
Packit b1f7ae
    include/windows
Packit b1f7ae
  )
Packit b1f7ae
Packit b1f7ae
  add_definitions(
Packit b1f7ae
    # cl spells inline __inline in C
Packit b1f7ae
    #
Packit b1f7ae
    /Dinline=__inline
Packit b1f7ae
Packit b1f7ae
    # cl spells strtoll _strtoi64
Packit b1f7ae
    #
Packit b1f7ae
    /Dstrtoll=_strtoi64
Packit b1f7ae
Packit b1f7ae
    # cl spells strtoull _strtoui64
Packit b1f7ae
    #
Packit b1f7ae
    /Dstrtoull=_strtoui64
Packit b1f7ae
Packit b1f7ae
    # avoid annoying warnings about unsecure standard functions
Packit b1f7ae
    #
Packit b1f7ae
    /D_CRT_SECURE_NO_WARNINGS
Packit b1f7ae
  )
Packit b1f7ae
Packit b1f7ae
  # enable parallel build
Packit b1f7ae
  #
Packit b1f7ae
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP")
Packit b1f7ae
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
Packit b1f7ae
Packit b1f7ae
  if (DEVBUILD)
Packit b1f7ae
    # compiler warnings
Packit b1f7ae
    #
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
Packit b1f7ae
Packit b1f7ae
    # warnings are errors
Packit b1f7ae
    #
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
Packit b1f7ae
  endif (DEVBUILD)
Packit b1f7ae
Packit b1f7ae
  if (CMAKE_C_COMPILER_ID MATCHES "MSVC")
Packit b1f7ae
    # prevent complaints on:
Packit b1f7ae
    # - do {} while(0) constructs
Packit b1f7ae
    # - int arr[] constructs
Packit b1f7ae
    #
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4200")
Packit b1f7ae
Packit b1f7ae
  endif (CMAKE_C_COMPILER_ID MATCHES "MSVC")
Packit b1f7ae
Packit b1f7ae
  if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
Packit b1f7ae
    # prevent complaints on:
Packit b1f7ae
    # - do {} while(0) constructs
Packit b1f7ae
    # - int arr[] constructs
Packit b1f7ae
    #
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4200")
Packit b1f7ae
Packit b1f7ae
  endif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
Packit b1f7ae
Packit b1f7ae
endif (CMAKE_HOST_WIN32)
Packit b1f7ae
Packit b1f7ae
if (CMAKE_HOST_UNIX)
Packit b1f7ae
  include_directories(
Packit b1f7ae
    include/posix
Packit b1f7ae
  )
Packit b1f7ae
Packit b1f7ae
  if (CMAKE_C_COMPILER_ID MATCHES "Clang")
Packit b1f7ae
    add_definitions(
Packit b1f7ae
      # make asm directive work in c99 mode.
Packit b1f7ae
      #
Packit b1f7ae
      # from the clang user manual:
Packit b1f7ae
      # "The parser recognizes "asm" and "typeof" as keywords in gnu* modes;
Packit b1f7ae
      # the variants "__asm__" and "__typeof__" are recognized in all
Packit b1f7ae
      # modes."
Packit b1f7ae
      -Dasm=__asm__
Packit b1f7ae
    )
Packit b1f7ae
  endif (CMAKE_C_COMPILER_ID MATCHES "Clang")
Packit b1f7ae
Packit b1f7ae
  option(GCOV "Compile for GNU code coverage analysis." OFF)
Packit b1f7ae
Packit b1f7ae
  if (GCOV)
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs")
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftest-coverage")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage")
Packit b1f7ae
Packit b1f7ae
    link_libraries(gcov)
Packit b1f7ae
  endif (GCOV)
Packit b1f7ae
Packit b1f7ae
  if (FEATURE_THREADS)
Packit b1f7ae
    link_libraries(pthread)
Packit b1f7ae
  endif (FEATURE_THREADS)
Packit b1f7ae
Packit b1f7ae
  # set the language
Packit b1f7ae
  #
Packit b1f7ae
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
Packit b1f7ae
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
Packit b1f7ae
Packit b1f7ae
  # windows-like dll export model
Packit b1f7ae
  #
Packit b1f7ae
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
Packit b1f7ae
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
Packit b1f7ae
Packit b1f7ae
  if (DEVBUILD)
Packit b1f7ae
    # compiler warnings
Packit b1f7ae
    #
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra")
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
Packit b1f7ae
Packit b1f7ae
    # warnings are errors
Packit b1f7ae
    #
Packit b1f7ae
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
Packit b1f7ae
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
Packit b1f7ae
  endif (DEVBUILD)
Packit b1f7ae
Packit b1f7ae
endif (CMAKE_HOST_UNIX)
Packit b1f7ae
Packit b1f7ae
Packit b1f7ae
function(add_ptunit_test_base name)
Packit b1f7ae
  if (PTUNIT)
Packit b1f7ae
    add_executable(${name} ${ARGN})
Packit b1f7ae
    target_link_libraries(${name} ptunit)
Packit b1f7ae
Packit b1f7ae
    add_test(NAME ${name} COMMAND ${name})
Packit b1f7ae
  endif (PTUNIT)
Packit b1f7ae
endfunction(add_ptunit_test_base)
Packit b1f7ae
Packit b1f7ae
function(add_ptunit_c_test name)
Packit b1f7ae
    add_ptunit_test_base(ptunit-${name} test/src/ptunit-${name}.c ${ARGN})
Packit b1f7ae
endfunction(add_ptunit_c_test)
Packit b1f7ae
Packit b1f7ae
function(add_ptunit_cpp_test name)
Packit b1f7ae
    add_ptunit_test_base(ptunit-${name} test/src/ptunit-${name}.cpp ${ARGN})
Packit b1f7ae
endfunction(add_ptunit_cpp_test)
Packit b1f7ae
Packit b1f7ae
function(add_ptunit_libraries name)
Packit b1f7ae
  if (PTUNIT)
Packit b1f7ae
    target_link_libraries(ptunit-${name} ${ARGN})
Packit b1f7ae
  endif (PTUNIT)
Packit b1f7ae
endfunction(add_ptunit_libraries)
Packit b1f7ae
Packit b1f7ae
Packit b1f7ae
add_subdirectory(libipt)
Packit b1f7ae
Packit b1f7ae
if (PTDUMP)
Packit b1f7ae
  add_subdirectory(ptdump)
Packit b1f7ae
endif (PTDUMP)
Packit b1f7ae
if (PTXED)
Packit b1f7ae
  add_subdirectory(ptxed)
Packit b1f7ae
endif (PTXED)
Packit b1f7ae
if (PTTC)
Packit b1f7ae
  add_subdirectory(pttc)
Packit b1f7ae
endif (PTTC)
Packit b1f7ae
if (PTUNIT)
Packit b1f7ae
  add_subdirectory(ptunit)
Packit b1f7ae
endif (PTUNIT)
Packit b1f7ae
if (PTT)
Packit b1f7ae
  add_subdirectory(test)
Packit b1f7ae
endif (PTT)
Packit b1f7ae
if (MAN)
Packit b1f7ae
  add_subdirectory(doc/man)
Packit b1f7ae
endif (MAN)