blob: 521c35bca2da42a627cad6300ba2a21028a02131 [file] [log] [blame] [edit]
# **********************************************************
# Copyright (c) 2010-2014 Google, Inc. All rights reserved.
# Copyright (c) 2009-2010 VMware, Inc. All rights reserved.
# **********************************************************
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# * Neither the name of VMware, Inc. nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
cmake_minimum_required (VERSION 2.2)
set(CTEST_PROJECT_NAME "DynamoRIO")
set(cpack_project_name "DynamoRIO")
set(run_tests ON)
set(CTEST_SOURCE_DIRECTORY "${CTEST_SCRIPT_DIRECTORY}/..")
include("${CTEST_SCRIPT_DIRECTORY}/runsuite_common_pre.cmake")
# extra args (note that runsuite_common_pre.cmake has already walked
# the list and did not remove its args so be sure to avoid conflicts).
# none at this time.
if (TEST_LONG)
set(DO_ALL_BUILDS ON)
set(base_cache "${base_cache}
BUILD_TESTS:BOOL=ON
TEST_LONG:BOOL=ON")
else (TEST_LONG)
set(DO_ALL_BUILDS OFF)
endif (TEST_LONG)
if (UNIX)
# For cross-arch execve tests we need to run from an install dir
set(installpath "${BINARY_BASE}/install")
set(install_build_args "install")
set(install_path_cache "CMAKE_INSTALL_PREFIX:PATH=${installpath}
")
else (UNIX)
set(install_build_args "")
endif (UNIX)
##################################################
# Pre-commit source file checks.
# Google Code does not support adding subversion hooks, so we
# have checks here.
# We could do a GLOB_RECURSE and read every file, but that's slow, so
# we try to construct the diff.
if (EXISTS "${CTEST_SOURCE_DIRECTORY}/.svn" OR
# in case the top-level dir and not trunk was checked out
EXISTS "${CTEST_SOURCE_DIRECTORY}/../.svn")
find_program(SVN svn DOC "subversion client")
if (SVN)
execute_process(COMMAND ${SVN} diff
WORKING_DIRECTORY "${CTEST_SOURCE_DIRECTORY}"
RESULT_VARIABLE svn_result
ERROR_VARIABLE svn_err
OUTPUT_VARIABLE diff_contents)
if (svn_result OR svn_err)
message(FATAL_ERROR "*** ${SVN} diff failed: ***\n${svn_result} ${svn_err}")
endif (svn_result OR svn_err)
# Remove tabs from the revision lines
string(REGEX REPLACE "\n(---|\\+\\+\\+)[^\n]*\t" "" diff_contents "${diff_contents}")
endif (SVN)
else ()
if (EXISTS "${CTEST_SOURCE_DIRECTORY}/.git")
find_program(GIT git DOC "git client")
if (GIT)
# Included committed, staged, and unstaged changes.
# We assume "master" contains the svn top-of-trunk.
execute_process(COMMAND ${GIT} diff master
WORKING_DIRECTORY "${CTEST_SOURCE_DIRECTORY}"
RESULT_VARIABLE git_result
ERROR_VARIABLE git_err
OUTPUT_VARIABLE diff_contents)
if (git_result OR git_err)
if (git_err MATCHES "unknown revision")
# It may be a cloned branch
execute_process(COMMAND ${GIT} diff remotes/origin/master
WORKING_DIRECTORY "${CTEST_SOURCE_DIRECTORY}"
RESULT_VARIABLE git_result
ERROR_VARIABLE git_err
OUTPUT_VARIABLE diff_contents)
endif ()
if (git_result OR git_err)
message(FATAL_ERROR "*** ${GIT} diff failed: ***\n${git_err}")
endif (git_result OR git_err)
endif (git_result OR git_err)
endif (GIT)
endif (EXISTS "${CTEST_SOURCE_DIRECTORY}/.git")
endif ()
if (NOT DEFINED diff_contents)
message(FATAL_ERROR "Unable to construct diff for pre-commit checks")
endif ()
# Check for tabs. We already removed them from svn's diff format.
string(REGEX MATCH "\t" match "${diff_contents}")
if (NOT "${match}" STREQUAL "")
string(REGEX MATCH "\n[^\n]*\t[^\n]*" match "${diff_contents}")
message(FATAL_ERROR "ERROR: diff contains tabs: ${match}")
endif ()
# Check for NOCHECKIN
string(REGEX MATCH "NOCHECKIN" match "${diff_contents}")
if (NOT "${match}" STREQUAL "")
string(REGEX MATCH "\n[^\n]*NOCHECKIN[^\n]*" match "${diff_contents}")
message(FATAL_ERROR "ERROR: diff contains NOCHECKIN: ${match}")
endif ()
# CMake seems to remove carriage returns for us so we can't easily
# check for them unless we switch to perl or python or something
# to get the diff and check it.
# Check for trailing space. This is a diff with an initial column for +-,
# so a blank line will have one space: thus we rule that out.
string(REGEX MATCH "[^\n] \n" match "${diff_contents}")
if (NOT "${match}" STREQUAL "")
# Get more context
string(REGEX MATCH "\n[^\n]+ \n" match "${diff_contents}")
message(FATAL_ERROR "ERROR: diff contains trailing spaces: ${match}")
endif ()
##################################################
# for short suite, don't build tests for builds that don't run tests
# (since building takes forever on windows): so we only turn
# on BUILD_TESTS for TEST_LONG or debug-internal-{32,64}
# For cross-arch execve test we need to "make install"
testbuild_ex("debug-internal-32" OFF "
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
BUILD_TESTS:BOOL=ON
${install_path_cache}
" OFF ON "${install_build_args}")
testbuild_ex("debug-internal-64" ON "
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
BUILD_TESTS:BOOL=ON
${install_path_cache}
TEST_32BIT_PATH:PATH=${last_build_dir}/suite/tests/bin
" OFF ON "${install_build_args}")
# ensure extensions built as static libraries work
# no tests needed: we ensure instrcalls and drsyms_bench build
testbuild("debug-i32-static-ext" OFF "
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
DR_EXT_DRWRAP_STATIC:BOOL=ON
DR_EXT_DRUTIL_STATIC:BOOL=ON
DR_EXT_DRMGR_STATIC:BOOL=ON
DR_EXT_DRSYMS_STATIC:BOOL=ON
${install_path_cache}
")
# we don't really support debug-external anymore
if (DO_ALL_BUILDS_NOT_SUPPORTED)
testbuild("debug-external-64" ON "
DEBUG:BOOL=ON
INTERNAL:BOOL=OFF
")
testbuild("debug-external-32" OFF "
DEBUG:BOOL=ON
INTERNAL:BOOL=OFF
")
endif ()
testbuild_ex("release-external-32" OFF "
DEBUG:BOOL=OFF
INTERNAL:BOOL=OFF
${install_path_cache}
" OFF OFF "${install_build_args}")
testbuild_ex("release-external-64" ON "
DEBUG:BOOL=OFF
INTERNAL:BOOL=OFF
${install_path_cache}
TEST_32BIT_PATH:PATH=${last_build_dir}/suite/tests/bin
" OFF OFF "${install_build_args}")
if (DO_ALL_BUILDS)
# we rarely use internal release builds but keep them working in long
# suite (not much burden) in case we need to tweak internal options
testbuild("release-internal-32" OFF "
DEBUG:BOOL=OFF
INTERNAL:BOOL=ON
")
testbuild("release-internal-64" ON "
DEBUG:BOOL=OFF
INTERNAL:BOOL=ON
")
endif (DO_ALL_BUILDS)
# non-official-API builds but not all are in pre-commit suite on Windows
# where building is slow: we'll rely on bots to catch breakage in most of these
# builds on Windows
if (UNIX OR DO_ALL_BUILDS)
testbuild("vmsafe-debug-internal-32" OFF "
VMAP:BOOL=OFF
VMSAFE:BOOL=ON
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
")
endif ()
if (DO_ALL_BUILDS)
testbuild("vmsafe-release-external-32" OFF "
VMAP:BOOL=OFF
VMSAFE:BOOL=ON
DEBUG:BOOL=OFF
INTERNAL:BOOL=OFF
")
endif (DO_ALL_BUILDS)
testbuild("vps-debug-internal-32" OFF "
VMAP:BOOL=OFF
VPS:BOOL=ON
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
")
if (DO_ALL_BUILDS)
testbuild("vps-release-external-32" OFF "
VMAP:BOOL=OFF
VPS:BOOL=ON
DEBUG:BOOL=OFF
INTERNAL:BOOL=OFF
")
# Builds we'll keep from breaking but not worth running many tests
testbuild("callprof-32" OFF "
CALLPROF:BOOL=ON
DEBUG:BOOL=OFF
INTERNAL:BOOL=OFF
")
testbuild("linkcount-32" OFF "
LINKCOUNT:BOOL=ON
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
")
testbuild("nodefs-debug-internal-32" OFF "
VMAP:BOOL=OFF
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
")
if (UNIX)
# i#975: revived support for STATIC_LIBRARY.
# FIXME: we need to implement takeover on Windows with .CRT$XCU.
testbuild("static-debug-internal-64" ON "
STATIC_LIBRARY:BOOL=ON
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
")
testbuild("static-debug-internal-32" OFF "
STATIC_LIBRARY:BOOL=ON
DEBUG:BOOL=ON
INTERNAL:BOOL=ON
")
endif ()
endif (DO_ALL_BUILDS)
# FIXME: what about these builds?
## defines we don't want to break -- no runs though since we don't currently use these
# "BUILD::NOSHORT::ADD_DEFINES=\"${D}DGC_DIAGNOSTICS\"",
# "BUILD::NOSHORT::LIN::ADD_DEFINES=\"${D}CHECK_RETURNS_SSE2\"",
######################################################################
# SUMMARY
# sets ${outvar} in PARENT_SCOPE
function (error_string str outvar)
string(REGEX MATCHALL "[^\n]*Platform exception[^\n]*" crash "${str}")
string(REGEX MATCHALL "[^\n]*debug check failure[^\n]*" assert "${str}")
string(REGEX MATCHALL "[^\n]*CURIOSITY[^\n]*" curiosity "${str}")
if (crash OR assert OR curiosity)
string(REGEX REPLACE "[ \t]*<Value>" "" assert "${assert}")
set(${outvar} "=> ${crash} ${assert} ${curiosity}" PARENT_SCOPE)
else (crash OR assert OR curiosity)
set(${outvar} "" PARENT_SCOPE)
endif (crash OR assert OR curiosity)
endfunction (error_string)
set(build_package OFF)
include("${CTEST_SCRIPT_DIRECTORY}/runsuite_common_post.cmake")