Compare commits
No commits in common. "bleeding" and "gh-pages" have entirely different histories.
|
@ -1,31 +0,0 @@
|
||||||
[bumpversion]
|
|
||||||
current_version = 2.3.0-rc1
|
|
||||||
commit = False
|
|
||||||
parse = ^
|
|
||||||
(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+) # minimum 'N.N.N'
|
|
||||||
(?:
|
|
||||||
-(?P<prerel>\w+) # 'rc' = release candidate, 'dev' = dev branch
|
|
||||||
(?:
|
|
||||||
(?P<prerelversion>\d+)
|
|
||||||
)?
|
|
||||||
)?
|
|
||||||
serialize =
|
|
||||||
{major}.{minor}.{patch}-{prerel}{prerelversion}
|
|
||||||
{major}.{minor}.{patch}-{prerel}
|
|
||||||
{major}.{minor}.{patch}
|
|
||||||
|
|
||||||
[bumpversion:part:prerel]
|
|
||||||
optional_value = release
|
|
||||||
values =
|
|
||||||
dev
|
|
||||||
rc
|
|
||||||
release
|
|
||||||
|
|
||||||
[bumpversion:file:.cmake/Modules/Properties.cmake]
|
|
||||||
|
|
||||||
[bumpversion:file:doc/conf.py]
|
|
||||||
|
|
||||||
[bumpversion:file:appveyor.yml]
|
|
||||||
|
|
||||||
[bumpversion:file:README.md]
|
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
include(CheckPrototypeDefinition)
|
|
||||||
include(CheckLibraryExists)
|
|
||||||
include(CheckFunctionExists)
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
include(PackageUtils)
|
|
||||||
|
|
||||||
# Check for packages
|
|
||||||
|
|
||||||
cr_find_package (Gettext)
|
|
||||||
cr_find_package (Libintl)
|
|
||||||
|
|
||||||
if (I18N AND GETTEXT_FOUND AND LIBINTL_LIB_FOUND)
|
|
||||||
set (GettextTranslate_ALL 1)
|
|
||||||
set (GettextTranslate_GMO_BINARY 1)
|
|
||||||
set (ENABLE_NLS 1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Check for functions
|
|
||||||
|
|
||||||
check_function_exists(strtok_s HAVE_STRTOK_S)
|
|
||||||
check_function_exists(strtok_r HAVE_STRTOK_R)
|
|
||||||
|
|
||||||
check_library_exists (anl getaddrinfo_a "" HAVE_GETADDRINFO_A)
|
|
||||||
|
|
||||||
check_function_exists(funopen HAVE_FUNOPEN)
|
|
||||||
check_function_exists(fopencookie HAVE_FOPENCOOKIE)
|
|
||||||
check_function_exists(open_memstream HAVE_OPEN_MEMSTREAM)
|
|
||||||
|
|
||||||
check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME_RT)
|
|
||||||
if (HAVE_CLOCK_GETTIME_RT AND NOT HAVE_LIBRT)
|
|
||||||
set (HAVE_LIBRT 1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT HAVE_CLOCK_GETTIME_RT)
|
|
||||||
check_symbol_exists(clock_gettime "time.h" HAVE_CLOCK_GETTIME)
|
|
||||||
else ()
|
|
||||||
set (HAVE_CLOCK_GETTIME "${HAVE_CLOCK_GETTIME_RT}" CACHE INTERNAL "Have symbol clock_gettime")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
check_symbol_exists(CLOCK_MONOTONIC_RAW "time.h" HAVE_CLOCK_MONOTONIC_RAW)
|
|
||||||
|
|
||||||
# Check for C++11
|
|
||||||
|
|
||||||
if (LANG_CXX)
|
|
||||||
enable_language(CXX)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT MSVC AND CMAKE_CXX_COMPILER_WORKS)
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
|
||||||
|
|
||||||
if(COMPILER_SUPPORTS_CXX11)
|
|
||||||
set(CXX11_FLAG "-std=c++11")
|
|
||||||
elseif(COMPILER_SUPPORTS_CXX0X)
|
|
||||||
set(CXX11_FLAG "-std=c++0x")
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Compiler ${CMAKE_CXX_COMPILER} has no C++11 support.")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Valgrind support
|
|
||||||
|
|
||||||
if (DEV_BUILD)
|
|
||||||
set(ENABLE_VALGRIND_ERRORS 1)
|
|
||||||
endif ()
|
|
|
@ -1,128 +0,0 @@
|
||||||
#
|
|
||||||
# The MIT License (MIT)
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
|
||||||
# in the Software without restriction, including without limitation the rights
|
|
||||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
# copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in all
|
|
||||||
# copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
# SOFTWARE.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2014 Joakim Söderberg <joakim.soderberg@gmail.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
set(_CMAKE_SCRIPT_PATH ${CMAKE_CURRENT_LIST_DIR}) # must be outside coveralls_setup() to get correct path
|
|
||||||
|
|
||||||
#
|
|
||||||
# Param _COVERAGE_SRCS A list of source files that coverage should be collected for.
|
|
||||||
# Param _COVERALLS_UPLOAD Upload the result to coveralls?
|
|
||||||
#
|
|
||||||
|
|
||||||
function(coveralls_setup _COVERAGE_SRCS _COVERALLS_UPLOAD)
|
|
||||||
|
|
||||||
if (ARGC GREATER 2)
|
|
||||||
set(_CMAKE_SCRIPT_PATH ${ARGN})
|
|
||||||
message(STATUS "Coveralls: Using alternate CMake script dir: ${_CMAKE_SCRIPT_PATH}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT EXISTS "${_CMAKE_SCRIPT_PATH}/CoverallsClear.cmake")
|
|
||||||
message(FATAL_ERROR "Coveralls: Missing ${_CMAKE_SCRIPT_PATH}/CoverallsClear.cmake")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT EXISTS "${_CMAKE_SCRIPT_PATH}/CoverallsGenerateGcov.cmake")
|
|
||||||
message(FATAL_ERROR "Coveralls: Missing ${_CMAKE_SCRIPT_PATH}/CoverallsGenerateGcov.cmake")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# When passing a CMake list to an external process, the list
|
|
||||||
# will be converted from the format "1;2;3" to "1 2 3".
|
|
||||||
# This means the script we're calling won't see it as a list
|
|
||||||
# of sources, but rather just one long path. We remedy this
|
|
||||||
# by replacing ";" with "*" and then reversing that in the script
|
|
||||||
# that we're calling.
|
|
||||||
# http://cmake.3232098.n2.nabble.com/Passing-a-CMake-list-quot-as-is-quot-to-a-custom-target-td6505681.html
|
|
||||||
set(COVERAGE_SRCS_TMP ${_COVERAGE_SRCS})
|
|
||||||
set(COVERAGE_SRCS "")
|
|
||||||
foreach (COVERAGE_SRC ${COVERAGE_SRCS_TMP})
|
|
||||||
set(COVERAGE_SRCS "${COVERAGE_SRCS}*${COVERAGE_SRC}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
#message("Coverage sources: ${COVERAGE_SRCS}")
|
|
||||||
set(COVERALLS_FILE ${PROJECT_BINARY_DIR}/coveralls.json)
|
|
||||||
|
|
||||||
add_custom_target(coveralls_generate
|
|
||||||
|
|
||||||
# Zero the coverage counters.
|
|
||||||
COMMAND ${CMAKE_COMMAND} -DPROJECT_BINARY_DIR="${PROJECT_BINARY_DIR}" -P "${_CMAKE_SCRIPT_PATH}/CoverallsClear.cmake"
|
|
||||||
|
|
||||||
# Run regress tests.
|
|
||||||
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
|
|
||||||
|
|
||||||
# Generate Gcov and translate it into coveralls JSON.
|
|
||||||
# We do this by executing an external CMake script.
|
|
||||||
# (We don't want this to run at CMake generation time, but after compilation and everything has run).
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DCOVERAGE_SRCS="${COVERAGE_SRCS}" # TODO: This is passed like: "a b c", not "a;b;c"
|
|
||||||
-DCOVERALLS_OUTPUT_FILE="${COVERALLS_FILE}"
|
|
||||||
-DCOV_PATH="${PROJECT_BINARY_DIR}"
|
|
||||||
-DPROJECT_ROOT="${PROJECT_SOURCE_DIR}"
|
|
||||||
-P "${_CMAKE_SCRIPT_PATH}/CoverallsGenerateGcov.cmake"
|
|
||||||
|
|
||||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
|
||||||
COMMENT "Generating coveralls output..."
|
|
||||||
)
|
|
||||||
|
|
||||||
if (_COVERALLS_UPLOAD)
|
|
||||||
message("COVERALLS UPLOAD: ON")
|
|
||||||
|
|
||||||
find_program(CURL_EXECUTABLE curl)
|
|
||||||
|
|
||||||
if (NOT CURL_EXECUTABLE)
|
|
||||||
message(FATAL_ERROR "Coveralls: curl not found! Aborting")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_target(coveralls_upload
|
|
||||||
# Upload the JSON to coveralls.
|
|
||||||
COMMAND ${CURL_EXECUTABLE}
|
|
||||||
-S -F json_file=@${COVERALLS_FILE}
|
|
||||||
https://coveralls.io/api/v1/jobs
|
|
||||||
|
|
||||||
DEPENDS coveralls_generate
|
|
||||||
|
|
||||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
|
||||||
COMMENT "Uploading coveralls output...")
|
|
||||||
|
|
||||||
add_custom_target(coveralls DEPENDS coveralls_upload)
|
|
||||||
else()
|
|
||||||
message("COVERALLS UPLOAD: OFF")
|
|
||||||
add_custom_target(coveralls DEPENDS coveralls_generate)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
macro(coveralls_turn_on_coverage)
|
|
||||||
if(NOT (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
AND (NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang"))
|
|
||||||
message(FATAL_ERROR "Coveralls: Compiler ${CMAKE_C_COMPILER_ID} is not GNU gcc! Aborting... You can set this on the command line using CC=/usr/bin/gcc CXX=/usr/bin/g++ cmake <options> ..")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
||||||
message(FATAL_ERROR "Coveralls: Code coverage results with an optimised (non-Debug) build may be misleading! Add -DCMAKE_BUILD_TYPE=Debug")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
#
|
|
||||||
# The MIT License (MIT)
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
|
||||||
# in the Software without restriction, including without limitation the rights
|
|
||||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
# copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in all
|
|
||||||
# copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
# SOFTWARE.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2014 Joakim Söderberg <joakim.soderberg@gmail.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
# do not follow symlinks in file(GLOB_RECURSE ...)
|
|
||||||
cmake_policy(SET CMP0009 NEW)
|
|
||||||
|
|
||||||
file(GLOB_RECURSE GCDA_FILES "${PROJECT_BINARY_DIR}/*.gcda")
|
|
||||||
if(NOT GCDA_FILES STREQUAL "")
|
|
||||||
file(REMOVE ${GCDA_FILES})
|
|
||||||
endif()
|
|
|
@ -1,489 +0,0 @@
|
||||||
#
|
|
||||||
# The MIT License (MIT)
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
|
||||||
# in the Software without restriction, including without limitation the rights
|
|
||||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
# copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in all
|
|
||||||
# copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
# SOFTWARE.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2014 Joakim Söderberg <joakim.soderberg@gmail.com>
|
|
||||||
#
|
|
||||||
# This is intended to be run by a custom target in a CMake project like this.
|
|
||||||
# 0. Compile program with coverage support.
|
|
||||||
# 1. Clear coverage data. (Recursively delete *.gcda in build dir)
|
|
||||||
# 2. Run the unit tests.
|
|
||||||
# 3. Run this script specifying which source files the coverage should be performed on.
|
|
||||||
#
|
|
||||||
# This script will then use gcov to generate .gcov files in the directory specified
|
|
||||||
# via the COV_PATH var. This should probably be the same as your cmake build dir.
|
|
||||||
#
|
|
||||||
# It then parses the .gcov files to convert them into the Coveralls JSON format:
|
|
||||||
# https://coveralls.io/docs/api
|
|
||||||
#
|
|
||||||
# Example for running as standalone CMake script from the command line:
|
|
||||||
# (Note it is important the -P is at the end...)
|
|
||||||
# $ cmake -DCOV_PATH=$(pwd)
|
|
||||||
# -DCOVERAGE_SRCS="catcierge_rfid.c;catcierge_timer.c"
|
|
||||||
# -P ../cmake/CoverallsGcovUpload.cmake
|
|
||||||
#
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Make sure we have the needed arguments.
|
|
||||||
#
|
|
||||||
if (NOT COVERALLS_OUTPUT_FILE)
|
|
||||||
message(FATAL_ERROR "Coveralls: No coveralls output file specified. Please set COVERALLS_OUTPUT_FILE")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT COV_PATH)
|
|
||||||
message(FATAL_ERROR "Coveralls: Missing coverage directory path where gcov files will be generated. Please set COV_PATH")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT COVERAGE_SRCS)
|
|
||||||
message(FATAL_ERROR "Coveralls: Missing the list of source files that we should get the coverage data for COVERAGE_SRCS")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT PROJECT_ROOT)
|
|
||||||
message(FATAL_ERROR "Coveralls: Missing PROJECT_ROOT.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Since it's not possible to pass a CMake list properly in the
|
|
||||||
# "1;2;3" format to an external process, we have replaced the
|
|
||||||
# ";" with "*", so reverse that here so we get it back into the
|
|
||||||
# CMake list format.
|
|
||||||
string(REGEX REPLACE "\\*" ";" COVERAGE_SRCS ${COVERAGE_SRCS})
|
|
||||||
|
|
||||||
# convert all paths in COVERAGE_SRCS to absolute paths
|
|
||||||
set(COVERAGE_SRCS_TMP "")
|
|
||||||
foreach (COVERAGE_SRC ${COVERAGE_SRCS})
|
|
||||||
if (NOT "${COVERAGE_SRC}" MATCHES "^/")
|
|
||||||
set(COVERAGE_SRC ${PROJECT_ROOT}/${COVERAGE_SRC})
|
|
||||||
endif()
|
|
||||||
list(APPEND COVERAGE_SRCS_TMP ${COVERAGE_SRC})
|
|
||||||
endforeach()
|
|
||||||
set(COVERAGE_SRCS ${COVERAGE_SRCS_TMP})
|
|
||||||
unset(COVERAGE_SRCS_TMP)
|
|
||||||
|
|
||||||
if (NOT DEFINED ENV{GCOV})
|
|
||||||
find_program(GCOV_EXECUTABLE gcov)
|
|
||||||
else()
|
|
||||||
find_program(GCOV_EXECUTABLE $ENV{GCOV})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT GCOV_EXECUTABLE)
|
|
||||||
message(FATAL_ERROR "gcov not found! Aborting...")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(Git)
|
|
||||||
|
|
||||||
set(JSON_REPO_TEMPLATE
|
|
||||||
"{
|
|
||||||
\"head\": {
|
|
||||||
\"id\": \"\@GIT_COMMIT_HASH\@\",
|
|
||||||
\"author_name\": \"\@GIT_AUTHOR_NAME\@\",
|
|
||||||
\"author_email\": \"\@GIT_AUTHOR_EMAIL\@\",
|
|
||||||
\"committer_name\": \"\@GIT_COMMITTER_NAME\@\",
|
|
||||||
\"committer_email\": \"\@GIT_COMMITTER_EMAIL\@\",
|
|
||||||
\"message\": \"\@GIT_COMMIT_MESSAGE\@\"
|
|
||||||
},
|
|
||||||
\"branch\": \"@GIT_BRANCH@\",
|
|
||||||
\"remotes\": []
|
|
||||||
}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# TODO: Fill in git remote data
|
|
||||||
if (GIT_FOUND)
|
|
||||||
# Branch.
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
|
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE GIT_BRANCH
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
|
|
||||||
macro (git_log_format FORMAT_CHARS VAR_NAME)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%${FORMAT_CHARS}
|
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE ${VAR_NAME}
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
git_log_format(an GIT_AUTHOR_NAME)
|
|
||||||
git_log_format(ae GIT_AUTHOR_EMAIL)
|
|
||||||
git_log_format(cn GIT_COMMITTER_NAME)
|
|
||||||
git_log_format(ce GIT_COMMITTER_EMAIL)
|
|
||||||
git_log_format(B GIT_COMMIT_MESSAGE)
|
|
||||||
git_log_format(H GIT_COMMIT_HASH)
|
|
||||||
|
|
||||||
message("Git exe: ${GIT_EXECUTABLE}")
|
|
||||||
message("Git branch: ${GIT_BRANCH}")
|
|
||||||
message("Git author: ${GIT_AUTHOR_NAME}")
|
|
||||||
message("Git e-mail: ${GIT_AUTHOR_EMAIL}")
|
|
||||||
message("Git commiter name: ${GIT_COMMITTER_NAME}")
|
|
||||||
message("Git commiter e-mail: ${GIT_COMMITTER_EMAIL}")
|
|
||||||
message("Git commit hash: ${GIT_COMMIT_HASH}")
|
|
||||||
message("Git commit message: ${GIT_COMMIT_MESSAGE}")
|
|
||||||
|
|
||||||
string(CONFIGURE ${JSON_REPO_TEMPLATE} JSON_REPO_DATA)
|
|
||||||
else()
|
|
||||||
set(JSON_REPO_DATA "{}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
############################# Macros #########################################
|
|
||||||
|
|
||||||
#
|
|
||||||
# This macro converts from the full path format gcov outputs:
|
|
||||||
#
|
|
||||||
# /path/to/project/root/build/#path#to#project#root#subdir#the_file.c.gcov
|
|
||||||
#
|
|
||||||
# to the original source file path the .gcov is for:
|
|
||||||
#
|
|
||||||
# /path/to/project/root/subdir/the_file.c
|
|
||||||
#
|
|
||||||
macro(get_source_path_from_gcov_filename _SRC_FILENAME _GCOV_FILENAME)
|
|
||||||
|
|
||||||
# /path/to/project/root/build/#path#to#project#root#subdir#the_file.c.gcov
|
|
||||||
# ->
|
|
||||||
# #path#to#project#root#subdir#the_file.c.gcov
|
|
||||||
get_filename_component(_GCOV_FILENAME_WEXT ${_GCOV_FILENAME} NAME)
|
|
||||||
|
|
||||||
# #path#to#project#root#subdir#the_file.c.gcov -> /path/to/project/root/subdir/the_file.c
|
|
||||||
string(REGEX REPLACE "\\.gcov$" "" SRC_FILENAME_TMP ${_GCOV_FILENAME_WEXT})
|
|
||||||
string(REGEX REPLACE "\#" "/" SRC_FILENAME_TMP ${SRC_FILENAME_TMP})
|
|
||||||
string(REGEX REPLACE "~" ":" SRC_FILENAME_TMP ${SRC_FILENAME_TMP})
|
|
||||||
set(${_SRC_FILENAME} "${SRC_FILENAME_TMP}")
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# Get the coverage data.
|
|
||||||
file(GLOB_RECURSE GCDA_FILES "${COV_PATH}/*.gcda")
|
|
||||||
message("GCDA files:")
|
|
||||||
|
|
||||||
# Get a list of all the object directories needed by gcov
|
|
||||||
# (The directories the .gcda files and .o files are found in)
|
|
||||||
# and run gcov on those.
|
|
||||||
foreach(GCDA ${GCDA_FILES})
|
|
||||||
message("Process: ${GCDA}")
|
|
||||||
message("------------------------------------------------------------------------------")
|
|
||||||
get_filename_component(GCDA_DIR ${GCDA} PATH)
|
|
||||||
|
|
||||||
#
|
|
||||||
# The -p below refers to "Preserve path components",
|
|
||||||
# This means that the generated gcov filename of a source file will
|
|
||||||
# keep the original files entire filepath, but / is replaced with #.
|
|
||||||
# Example:
|
|
||||||
#
|
|
||||||
# /path/to/project/root/build/CMakeFiles/the_file.dir/subdir/the_file.c.gcda
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
# File '/path/to/project/root/subdir/the_file.c'
|
|
||||||
# Lines executed:68.34% of 199
|
|
||||||
# /path/to/project/root/subdir/the_file.c:creating '#path#to#project#root#subdir#the_file.c.gcov'
|
|
||||||
#
|
|
||||||
# If -p is not specified then the file is named only "the_file.c.gcov"
|
|
||||||
#
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GCOV_EXECUTABLE} -p -o ${GCDA_DIR} ${GCDA}
|
|
||||||
WORKING_DIRECTORY ${COV_PATH}
|
|
||||||
)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# TODO: Make these be absolute path
|
|
||||||
file(GLOB ALL_GCOV_FILES ${COV_PATH}/*.gcov)
|
|
||||||
|
|
||||||
# Get only the filenames to use for filtering.
|
|
||||||
#set(COVERAGE_SRCS_NAMES "")
|
|
||||||
#foreach (COVSRC ${COVERAGE_SRCS})
|
|
||||||
# get_filename_component(COVSRC_NAME ${COVSRC} NAME)
|
|
||||||
# message("${COVSRC} -> ${COVSRC_NAME}")
|
|
||||||
# list(APPEND COVERAGE_SRCS_NAMES "${COVSRC_NAME}")
|
|
||||||
#endforeach()
|
|
||||||
|
|
||||||
#
|
|
||||||
# Filter out all but the gcov files we want.
|
|
||||||
#
|
|
||||||
# We do this by comparing the list of COVERAGE_SRCS filepaths that the
|
|
||||||
# user wants the coverage data for with the paths of the generated .gcov files,
|
|
||||||
# so that we only keep the relevant gcov files.
|
|
||||||
#
|
|
||||||
# Example:
|
|
||||||
# COVERAGE_SRCS =
|
|
||||||
# /path/to/project/root/subdir/the_file.c
|
|
||||||
#
|
|
||||||
# ALL_GCOV_FILES =
|
|
||||||
# /path/to/project/root/build/#path#to#project#root#subdir#the_file.c.gcov
|
|
||||||
# /path/to/project/root/build/#path#to#project#root#subdir#other_file.c.gcov
|
|
||||||
#
|
|
||||||
# Result should be:
|
|
||||||
# GCOV_FILES =
|
|
||||||
# /path/to/project/root/build/#path#to#project#root#subdir#the_file.c.gcov
|
|
||||||
#
|
|
||||||
set(GCOV_FILES "")
|
|
||||||
#message("Look in coverage sources: ${COVERAGE_SRCS}")
|
|
||||||
message("\nFilter out unwanted GCOV files:")
|
|
||||||
message("===============================")
|
|
||||||
|
|
||||||
set(COVERAGE_SRCS_REMAINING ${COVERAGE_SRCS})
|
|
||||||
|
|
||||||
foreach (GCOV_FILE ${ALL_GCOV_FILES})
|
|
||||||
|
|
||||||
#
|
|
||||||
# /path/to/project/root/build/#path#to#project#root#subdir#the_file.c.gcov
|
|
||||||
# ->
|
|
||||||
# /path/to/project/root/subdir/the_file.c
|
|
||||||
get_source_path_from_gcov_filename(GCOV_SRC_PATH ${GCOV_FILE})
|
|
||||||
file(RELATIVE_PATH GCOV_SRC_REL_PATH "${PROJECT_ROOT}" "${GCOV_SRC_PATH}")
|
|
||||||
|
|
||||||
# Is this in the list of source files?
|
|
||||||
# TODO: We want to match against relative path filenames from the source file root...
|
|
||||||
list(FIND COVERAGE_SRCS ${GCOV_SRC_PATH} WAS_FOUND)
|
|
||||||
|
|
||||||
if (NOT WAS_FOUND EQUAL -1)
|
|
||||||
message("YES: ${GCOV_FILE}")
|
|
||||||
list(APPEND GCOV_FILES ${GCOV_FILE})
|
|
||||||
|
|
||||||
# We remove it from the list, so we don't bother searching for it again.
|
|
||||||
# Also files left in COVERAGE_SRCS_REMAINING after this loop ends should
|
|
||||||
# have coverage data generated from them (no lines are covered).
|
|
||||||
list(REMOVE_ITEM COVERAGE_SRCS_REMAINING ${GCOV_SRC_PATH})
|
|
||||||
else()
|
|
||||||
message("NO: ${GCOV_FILE}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# TODO: Enable setting these
|
|
||||||
if (NOT DEFINED ENV{CI_NAME})
|
|
||||||
set(JSON_SERVICE_NAME "travis-ci")
|
|
||||||
else ()
|
|
||||||
set(JSON_SERVICE_NAME $ENV{CI_NAME})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT DEFINED ENV{CI_JOB_ID})
|
|
||||||
set(JSON_SERVICE_JOB_ID $ENV{TRAVIS_JOB_ID})
|
|
||||||
else ()
|
|
||||||
set(JSON_SERVICE_JOB_ID $ENV{CI_JOB_ID})
|
|
||||||
endif()
|
|
||||||
set(JSON_REPO_TOKEN $ENV{COVERALLS_REPO_TOKEN})
|
|
||||||
|
|
||||||
set(JSON_TEMPLATE
|
|
||||||
"{
|
|
||||||
\"repo_token\": \"\@JSON_REPO_TOKEN\@\",
|
|
||||||
\"service_name\": \"\@JSON_SERVICE_NAME\@\",
|
|
||||||
\"service_job_id\": \"\@JSON_SERVICE_JOB_ID\@\",
|
|
||||||
\"source_files\": \@JSON_GCOV_FILES\@,
|
|
||||||
\"git\": \@JSON_REPO_DATA\@
|
|
||||||
}"
|
|
||||||
)
|
|
||||||
|
|
||||||
set(SRC_FILE_TEMPLATE
|
|
||||||
"{
|
|
||||||
\"name\": \"\@GCOV_SRC_REL_PATH\@\",
|
|
||||||
\"source_digest\": \"\@GCOV_CONTENTS_MD5\@\",
|
|
||||||
\"coverage\": \@GCOV_FILE_COVERAGE\@
|
|
||||||
}"
|
|
||||||
)
|
|
||||||
|
|
||||||
message("\nGenerate JSON for files:")
|
|
||||||
message("=========================")
|
|
||||||
|
|
||||||
set(JSON_GCOV_FILES "[")
|
|
||||||
|
|
||||||
# Read the GCOV files line by line and get the coverage data.
|
|
||||||
foreach (GCOV_FILE ${GCOV_FILES})
|
|
||||||
|
|
||||||
get_source_path_from_gcov_filename(GCOV_SRC_PATH ${GCOV_FILE})
|
|
||||||
file(RELATIVE_PATH GCOV_SRC_REL_PATH "${PROJECT_ROOT}" "${GCOV_SRC_PATH}")
|
|
||||||
|
|
||||||
# The new coveralls API doesn't need the entire source (Yay!)
|
|
||||||
# However, still keeping that part for now. Will cleanup in the future.
|
|
||||||
file(MD5 "${GCOV_SRC_PATH}" GCOV_CONTENTS_MD5)
|
|
||||||
message("MD5: ${GCOV_SRC_PATH} = ${GCOV_CONTENTS_MD5}")
|
|
||||||
|
|
||||||
# Loads the gcov file as a list of lines.
|
|
||||||
# (We first open the file and replace all occurences of [] with _
|
|
||||||
# because CMake will fail to parse a line containing unmatched brackets...
|
|
||||||
# also the \ to escaped \n in macros screws up things.)
|
|
||||||
# https://public.kitware.com/Bug/view.php?id=15369
|
|
||||||
file(READ ${GCOV_FILE} GCOV_CONTENTS)
|
|
||||||
string(REPLACE "[" "_" GCOV_CONTENTS "${GCOV_CONTENTS}")
|
|
||||||
string(REPLACE "]" "_" GCOV_CONTENTS "${GCOV_CONTENTS}")
|
|
||||||
string(REPLACE "\\" "_" GCOV_CONTENTS "${GCOV_CONTENTS}")
|
|
||||||
|
|
||||||
# Remove file contents to avoid encoding issues (cmake 2.8 has no ENCODING option)
|
|
||||||
string(REGEX REPLACE "([^:]*):([^:]*):([^\n]*)\n" "\\1:\\2: \n" GCOV_CONTENTS "${GCOV_CONTENTS}")
|
|
||||||
file(WRITE ${GCOV_FILE}_tmp "${GCOV_CONTENTS}")
|
|
||||||
|
|
||||||
file(STRINGS ${GCOV_FILE}_tmp GCOV_LINES)
|
|
||||||
list(LENGTH GCOV_LINES LINE_COUNT)
|
|
||||||
|
|
||||||
# Instead of trying to parse the source from the
|
|
||||||
# gcov file, simply read the file contents from the source file.
|
|
||||||
# (Parsing it from the gcov is hard because C-code uses ; in many places
|
|
||||||
# which also happens to be the same as the CMake list delimeter).
|
|
||||||
file(READ ${GCOV_SRC_PATH} GCOV_FILE_SOURCE)
|
|
||||||
|
|
||||||
string(REPLACE "\\" "\\\\" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
string(REGEX REPLACE "\"" "\\\\\"" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
string(REPLACE "\t" "\\\\t" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
string(REPLACE "\r" "\\\\r" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
string(REPLACE "\n" "\\\\n" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
# According to http://json.org/ these should be escaped as well.
|
|
||||||
# Don't know how to do that in CMake however...
|
|
||||||
#string(REPLACE "\b" "\\\\b" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
#string(REPLACE "\f" "\\\\f" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
#string(REGEX REPLACE "\u([a-fA-F0-9]{4})" "\\\\u\\1" GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}")
|
|
||||||
|
|
||||||
# We want a json array of coverage data as a single string
|
|
||||||
# start building them from the contents of the .gcov
|
|
||||||
set(GCOV_FILE_COVERAGE "[")
|
|
||||||
|
|
||||||
set(GCOV_LINE_COUNT 1) # Line number for the .gcov.
|
|
||||||
set(DO_SKIP 0)
|
|
||||||
foreach (GCOV_LINE ${GCOV_LINES})
|
|
||||||
#message("${GCOV_LINE}")
|
|
||||||
# Example of what we're parsing:
|
|
||||||
# Hitcount |Line | Source
|
|
||||||
# " 8: 26: if (!allowed || (strlen(allowed) == 0))"
|
|
||||||
string(REGEX REPLACE
|
|
||||||
"^([^:]*):([^:]*):(.*)$"
|
|
||||||
"\\1;\\2;\\3"
|
|
||||||
RES
|
|
||||||
"${GCOV_LINE}")
|
|
||||||
|
|
||||||
# Check if we should exclude lines using the Lcov syntax.
|
|
||||||
string(REGEX MATCH "LCOV_EXCL_START" START_SKIP "${GCOV_LINE}")
|
|
||||||
string(REGEX MATCH "LCOV_EXCL_END" END_SKIP "${GCOV_LINE}")
|
|
||||||
string(REGEX MATCH "LCOV_EXCL_LINE" LINE_SKIP "${GCOV_LINE}")
|
|
||||||
|
|
||||||
set(RESET_SKIP 0)
|
|
||||||
if (LINE_SKIP AND NOT DO_SKIP)
|
|
||||||
set(DO_SKIP 1)
|
|
||||||
set(RESET_SKIP 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (START_SKIP)
|
|
||||||
set(DO_SKIP 1)
|
|
||||||
message("${GCOV_LINE_COUNT}: Start skip")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (END_SKIP)
|
|
||||||
set(DO_SKIP 0)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(LENGTH RES RES_COUNT)
|
|
||||||
|
|
||||||
if (RES_COUNT GREATER 2)
|
|
||||||
list(GET RES 0 HITCOUNT)
|
|
||||||
list(GET RES 1 LINE)
|
|
||||||
list(GET RES 2 SOURCE)
|
|
||||||
|
|
||||||
string(STRIP ${HITCOUNT} HITCOUNT)
|
|
||||||
string(STRIP ${LINE} LINE)
|
|
||||||
|
|
||||||
# Lines with 0 line numbers are metadata and can be ignored.
|
|
||||||
if (NOT ${LINE} EQUAL 0)
|
|
||||||
|
|
||||||
if (DO_SKIP)
|
|
||||||
set(GCOV_FILE_COVERAGE "${GCOV_FILE_COVERAGE}null, ")
|
|
||||||
else()
|
|
||||||
# Translate the hitcount into valid JSON values.
|
|
||||||
if (${HITCOUNT} STREQUAL "#####" OR ${HITCOUNT} STREQUAL "=====")
|
|
||||||
set(GCOV_FILE_COVERAGE "${GCOV_FILE_COVERAGE}0, ")
|
|
||||||
elseif (${HITCOUNT} STREQUAL "-")
|
|
||||||
set(GCOV_FILE_COVERAGE "${GCOV_FILE_COVERAGE}null, ")
|
|
||||||
else()
|
|
||||||
set(GCOV_FILE_COVERAGE "${GCOV_FILE_COVERAGE}${HITCOUNT}, ")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(WARNING "Failed to properly parse line (RES_COUNT = ${RES_COUNT}) ${GCOV_FILE}:${GCOV_LINE_COUNT}\n-->${GCOV_LINE}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (RESET_SKIP)
|
|
||||||
set(DO_SKIP 0)
|
|
||||||
endif()
|
|
||||||
math(EXPR GCOV_LINE_COUNT "${GCOV_LINE_COUNT}+1")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
message("${GCOV_LINE_COUNT} of ${LINE_COUNT} lines read!")
|
|
||||||
|
|
||||||
# Advanced way of removing the trailing comma in the JSON array.
|
|
||||||
# "[1, 2, 3, " -> "[1, 2, 3"
|
|
||||||
string(REGEX REPLACE ",[ ]*$" "" GCOV_FILE_COVERAGE ${GCOV_FILE_COVERAGE})
|
|
||||||
|
|
||||||
# Append the trailing ] to complete the JSON array.
|
|
||||||
set(GCOV_FILE_COVERAGE "${GCOV_FILE_COVERAGE}]")
|
|
||||||
|
|
||||||
# Generate the final JSON for this file.
|
|
||||||
message("Generate JSON for file: ${GCOV_SRC_REL_PATH}...")
|
|
||||||
string(CONFIGURE ${SRC_FILE_TEMPLATE} FILE_JSON)
|
|
||||||
|
|
||||||
set(JSON_GCOV_FILES "${JSON_GCOV_FILES}${FILE_JSON}, ")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Loop through all files we couldn't find any coverage for
|
|
||||||
# as well, and generate JSON for those as well with 0% coverage.
|
|
||||||
foreach(NOT_COVERED_SRC ${COVERAGE_SRCS_REMAINING})
|
|
||||||
|
|
||||||
# Set variables for json replacement
|
|
||||||
set(GCOV_SRC_PATH ${NOT_COVERED_SRC})
|
|
||||||
file(MD5 "${GCOV_SRC_PATH}" GCOV_CONTENTS_MD5)
|
|
||||||
file(RELATIVE_PATH GCOV_SRC_REL_PATH "${PROJECT_ROOT}" "${GCOV_SRC_PATH}")
|
|
||||||
|
|
||||||
# Loads the source file as a list of lines.
|
|
||||||
file(STRINGS ${NOT_COVERED_SRC} SRC_LINES)
|
|
||||||
|
|
||||||
set(GCOV_FILE_COVERAGE "[")
|
|
||||||
set(GCOV_FILE_SOURCE "")
|
|
||||||
|
|
||||||
foreach (SOURCE ${SRC_LINES})
|
|
||||||
set(GCOV_FILE_COVERAGE "${GCOV_FILE_COVERAGE}null, ")
|
|
||||||
|
|
||||||
string(REPLACE "\\" "\\\\" SOURCE "${SOURCE}")
|
|
||||||
string(REGEX REPLACE "\"" "\\\\\"" SOURCE "${SOURCE}")
|
|
||||||
string(REPLACE "\t" "\\\\t" SOURCE "${SOURCE}")
|
|
||||||
string(REPLACE "\r" "\\\\r" SOURCE "${SOURCE}")
|
|
||||||
set(GCOV_FILE_SOURCE "${GCOV_FILE_SOURCE}${SOURCE}\\n")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Remove trailing comma, and complete JSON array with ]
|
|
||||||
string(REGEX REPLACE ",[ ]*$" "" GCOV_FILE_COVERAGE ${GCOV_FILE_COVERAGE})
|
|
||||||
set(GCOV_FILE_COVERAGE "${GCOV_FILE_COVERAGE}]")
|
|
||||||
|
|
||||||
# Generate the final JSON for this file.
|
|
||||||
message("Generate JSON for non-gcov file: ${NOT_COVERED_SRC}...")
|
|
||||||
string(CONFIGURE ${SRC_FILE_TEMPLATE} FILE_JSON)
|
|
||||||
set(JSON_GCOV_FILES "${JSON_GCOV_FILES}${FILE_JSON}, ")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Get rid of trailing comma.
|
|
||||||
string(REGEX REPLACE ",[ ]*$" "" JSON_GCOV_FILES ${JSON_GCOV_FILES})
|
|
||||||
set(JSON_GCOV_FILES "${JSON_GCOV_FILES}]")
|
|
||||||
|
|
||||||
# Generate the final complete JSON!
|
|
||||||
message("Generate final JSON...")
|
|
||||||
string(CONFIGURE ${JSON_TEMPLATE} JSON)
|
|
||||||
|
|
||||||
file(WRITE "${COVERALLS_OUTPUT_FILE}" "${JSON}")
|
|
||||||
message("###########################################################################")
|
|
||||||
message("Generated coveralls JSON containing coverage data:")
|
|
||||||
message("${COVERALLS_OUTPUT_FILE}")
|
|
||||||
message("###########################################################################")
|
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
set(PATH_VAR
|
|
||||||
"${PROJECT_BINARY_DIR}/samples"
|
|
||||||
"${PROJECT_BINARY_DIR}/samples/tests"
|
|
||||||
"${PROJECT_BINARY_DIR}/external/lib"
|
|
||||||
"${PROJECT_BINARY_DIR}/external/bin"
|
|
||||||
)
|
|
||||||
|
|
||||||
set(NEW_PATH "")
|
|
||||||
foreach (P ${PATH_VAR})
|
|
||||||
file (TO_NATIVE_PATH "${P}" P)
|
|
||||||
list (APPEND NEW_PATH "${P}")
|
|
||||||
endforeach ()
|
|
||||||
set (PATH_VAR "${NEW_PATH}")
|
|
||||||
|
|
||||||
if (NOT WIN32)
|
|
||||||
string (REPLACE ";" ":" PATH_VAR "${PATH_VAR}")
|
|
||||||
set(ENV{PATH} "$ENV{PATH}:${PATH_VAR}")
|
|
||||||
else ()
|
|
||||||
set(ENV{PATH} "$ENV{PATH};${PATH_VAR}")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(ENV{LC_ALL} "en_US.utf8")
|
|
||||||
set(ENV{CRITERION_ALWAYS_SUCCEED} "1")
|
|
||||||
set(ENV{CRITERION_SHORT_FILENAME} "1")
|
|
||||||
set(ENV{CRITERION_JOBS} "1")
|
|
||||||
set(ENV{CRITERION_DISABLE_TIME_MEASUREMENTS} "1")
|
|
||||||
set(ENV{MSYS2_ARG_CONV_EXCL} "--filter=")
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
if (ENV{MINGW} STREQUAL "")
|
|
||||||
set (MINGW_HOME "C:/MinGW")
|
|
||||||
else ()
|
|
||||||
file (TO_CMAKE_PATH "$ENV{MINGW}" MINGW_HOME)
|
|
||||||
endif ()
|
|
||||||
if (ENV{CRAM_SHELL} STREQUAL "" AND MINGW_HOME)
|
|
||||||
set (CRAM_SHELL "${MINGW_HOME}/msys/1.0/bin/sh.exe")
|
|
||||||
else ()
|
|
||||||
file (TO_CMAKE_PATH "$ENV{CRAM_SHELL}" CRAM_SHELL)
|
|
||||||
endif ()
|
|
||||||
if (CRAM_SHELL)
|
|
||||||
set(CRAM_OPTS "--shell=${CRAM_SHELL}")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if ("$ENV{TRAVIS}" STREQUAL "true")
|
|
||||||
execute_process (COMMAND cram -v ${CRAM_OPTS} "${CRAM_PATH}" TIMEOUT 60 RESULT_VARIABLE RES)
|
|
||||||
else ()
|
|
||||||
if ("$ENV{PYTHON_BIN}" STREQUAL "")
|
|
||||||
set (PYTHON "python")
|
|
||||||
else ()
|
|
||||||
set (PYTHON "$ENV{PYTHON_BIN}")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
execute_process (COMMAND ${PYTHON} -m cram -v ${CRAM_OPTS} "${CRAM_PATH}" TIMEOUT 60 RESULT_VARIABLE RES)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT RES STREQUAL "0")
|
|
||||||
message (FATAL_ERROR "Cram tests failed")
|
|
||||||
endif ()
|
|
|
@ -1,43 +0,0 @@
|
||||||
# build a Debian package for Launchpad
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_NAME "criterion")
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_SECTION "libs")
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/Snaipe/Criterion")
|
|
||||||
set(CPACK_DEBIAN_BUILD_DEPENDS
|
|
||||||
debhelper
|
|
||||||
cmake
|
|
||||||
gettext
|
|
||||||
)
|
|
||||||
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS)
|
|
||||||
|
|
||||||
set(CPACK_DEBIAN_CMAKE_OPTIONS)
|
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/description.txt")
|
|
||||||
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_SOURCE_COPY "${PROJECT_SOURCE_DIR}/.cmake/copy-source.sh")
|
|
||||||
|
|
||||||
set(CPACK_DEBIAN_DISTRIBUTION_NAME ubuntu)
|
|
||||||
set(CPACK_DEBIAN_DISTRIBUTION_RELEASES precise trusty vivid wily xenial)
|
|
||||||
|
|
||||||
set(DPUT_HOST "snaipewastaken-ppa")
|
|
||||||
set(DPUT_SNAPSHOT_HOST "snaipewastaken-ppa")
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_DOCS "")
|
|
||||||
set(CPACK_DEBIAN_PACKAGE_INSTALL
|
|
||||||
"/usr/lib/*.so"
|
|
||||||
"/usr/lib/*.so.*"
|
|
||||||
"/usr/share/locale/*"
|
|
||||||
)
|
|
||||||
|
|
||||||
set(CPACK_COMPONENTS_ALL "dev")
|
|
||||||
set(CPACK_COMPONENT_DEV_DISPLAY_NAME "Criterion library development files")
|
|
||||||
set(CPACK_COMPONENT_DEV_DESCRIPTION "These are the development files.")
|
|
||||||
set(CPACK_COMPONENT_DEV_SECTION "devel")
|
|
||||||
|
|
||||||
set(CPACK_COMPONENT_DEV_DEPENDS
|
|
||||||
criterion
|
|
||||||
)
|
|
||||||
|
|
||||||
set(CPACK_COMPONENT_DEV_DOCS "")
|
|
||||||
set(CPACK_COMPONENT_DEV_INSTALL "/usr/include")
|
|
||||||
|
|
||||||
include (DebSourcePPA)
|
|
|
@ -1,347 +0,0 @@
|
||||||
## Debian Source Package Generator
|
|
||||||
#
|
|
||||||
# Copyright (c) 2010 Daniel Pfeifer <daniel@pfeifer-mail.de>
|
|
||||||
# Many modifications by Rosen Diankov <rosen.diankov@gmail.com>
|
|
||||||
#
|
|
||||||
# Creates source debian files and manages library dependencies
|
|
||||||
#
|
|
||||||
# Features:
|
|
||||||
#
|
|
||||||
# - Automatically generates symbols and run-time dependencies from the build dependencies
|
|
||||||
# - Custom copy of source directory via CPACK_DEBIAN_PACKAGE_SOURCE_COPY
|
|
||||||
# - Simultaneous output of multiple debian source packages for each distribution
|
|
||||||
# - Can specificy distribution-specific dependencies by suffixing DEPENDS with _${DISTRO_NAME}, for example: CPACK_DEBIAN_PACKAGE_DEPENDS_LUCID, CPACK_COMPONENT_MYCOMP0_DEPENDS_LUCID
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
#
|
|
||||||
# set(CPACK_DEBIAN_BUILD_DEPENDS debhelper cmake)
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_PRIORITY optional)
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_SECTION devel)
|
|
||||||
# set(CPACK_DEBIAN_CMAKE_OPTIONS "-DMYOPTION=myvalue")
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_DEPENDS mycomp0 mycomp1 some_ubuntu_package)
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_DEPENDS_UBUNTU_LUCID mycomp0 mycomp1 lucid_specific_package)
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_NAME mypackage)
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_REMOVE_SOURCE_FILES unnecessary_file unnecessary_dir/file0)
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_SOURCE_COPY svn export --force) # if using subversion
|
|
||||||
# set(CPACK_DEBIAN_DISTRIBUTION_NAME ubuntu)
|
|
||||||
# set(CPACK_DEBIAN_DISTRIBUTION_RELEASES karmic lucid maverick natty)
|
|
||||||
# set(CPACK_DEBIAN_CHANGELOG " * Extra change log lines")
|
|
||||||
# set(CPACK_DEBIAN_PACKAGE_SUGGESTS "ipython")
|
|
||||||
# set(CPACK_COMPONENT_X_RECOMMENDS "recommended-package")
|
|
||||||
##
|
|
||||||
|
|
||||||
find_program(DEBUILD_EXECUTABLE debuild)
|
|
||||||
find_program(DPUT_EXECUTABLE dput)
|
|
||||||
|
|
||||||
if(NOT DEBUILD_EXECUTABLE OR NOT DPUT_EXECUTABLE)
|
|
||||||
return()
|
|
||||||
endif(NOT DEBUILD_EXECUTABLE OR NOT DPUT_EXECUTABLE)
|
|
||||||
|
|
||||||
# DEBIAN/control
|
|
||||||
# debian policy enforce lower case for package name
|
|
||||||
# Package: (mandatory)
|
|
||||||
IF(NOT CPACK_DEBIAN_PACKAGE_NAME)
|
|
||||||
STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
|
|
||||||
ENDIF(NOT CPACK_DEBIAN_PACKAGE_NAME)
|
|
||||||
|
|
||||||
# Section: (recommended)
|
|
||||||
IF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
|
|
||||||
SET(CPACK_DEBIAN_PACKAGE_SECTION "devel")
|
|
||||||
ENDIF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
|
|
||||||
|
|
||||||
# Priority: (recommended)
|
|
||||||
IF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
|
|
||||||
SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
|
|
||||||
ENDIF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
|
|
||||||
|
|
||||||
file(STRINGS ${CPACK_PACKAGE_DESCRIPTION_FILE} DESC_LINES)
|
|
||||||
foreach(LINE ${DESC_LINES})
|
|
||||||
set(DEB_LONG_DESCRIPTION "${DEB_LONG_DESCRIPTION} ${LINE}\n")
|
|
||||||
endforeach(LINE ${DESC_LINES})
|
|
||||||
|
|
||||||
file(REMOVE_RECURSE "${PROJECT_BINARY_DIR}/Debian")
|
|
||||||
file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/Debian")
|
|
||||||
set(DEBIAN_SOURCE_ORIG_DIR "${PROJECT_BINARY_DIR}/Debian/${CPACK_DEBIAN_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
|
||||||
|
|
||||||
if( CPACK_DEBIAN_PACKAGE_SOURCE_COPY )
|
|
||||||
execute_process(COMMAND ${CPACK_DEBIAN_PACKAGE_SOURCE_COPY} "${PROJECT_SOURCE_DIR}" "${DEBIAN_SOURCE_ORIG_DIR}.orig")
|
|
||||||
else()
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR} "${DEBIAN_SOURCE_ORIG_DIR}.orig")
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${DEBIAN_SOURCE_ORIG_DIR}.orig/.git")
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${DEBIAN_SOURCE_ORIG_DIR}.orig/.svn")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# remove unnecessary folders
|
|
||||||
foreach(REMOVE_DIR ${CPACK_DEBIAN_PACKAGE_REMOVE_SOURCE_FILES})
|
|
||||||
file(REMOVE_RECURSE ${DEBIAN_SOURCE_ORIG_DIR}.orig/${REMOVE_DIR})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# create the original source tar
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar czf "${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}.orig.tar.gz" "${CPACK_DEBIAN_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}.orig" WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Debian)
|
|
||||||
|
|
||||||
set(DEB_SOURCE_CHANGES)
|
|
||||||
foreach(RELEASE ${CPACK_DEBIAN_DISTRIBUTION_RELEASES})
|
|
||||||
set(DEBIAN_SOURCE_DIR "${DEBIAN_SOURCE_ORIG_DIR}-${CPACK_DEBIAN_DISTRIBUTION_NAME}1~${RELEASE}1")
|
|
||||||
set(RELEASE_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}-${CPACK_DEBIAN_DISTRIBUTION_NAME}1~${RELEASE}1")
|
|
||||||
string(TOUPPER ${RELEASE} RELEASE_UPPER)
|
|
||||||
string(TOUPPER ${CPACK_DEBIAN_DISTRIBUTION_NAME} DISTRIBUTION_NAME_UPPER)
|
|
||||||
file(MAKE_DIRECTORY ${DEBIAN_SOURCE_DIR}/debian)
|
|
||||||
##############################################################################
|
|
||||||
# debian/control
|
|
||||||
set(DEBIAN_CONTROL ${DEBIAN_SOURCE_DIR}/debian/control)
|
|
||||||
file(WRITE ${DEBIAN_CONTROL}
|
|
||||||
"Source: ${CPACK_DEBIAN_PACKAGE_NAME}\n"
|
|
||||||
"Section: ${CPACK_DEBIAN_PACKAGE_SECTION}\n"
|
|
||||||
"Priority: ${CPACK_DEBIAN_PACKAGE_PRIORITY}\n"
|
|
||||||
"DM-Upload-Allowed: yes\n"
|
|
||||||
"Maintainer: ${CPACK_PACKAGE_CONTACT}\n"
|
|
||||||
"Build-Depends: "
|
|
||||||
)
|
|
||||||
|
|
||||||
if( CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
if( CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_BUILD_DEPENDS})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_BUILD_DEPENDS})
|
|
||||||
endif( CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
endif( CPACK_DEBIAN_BUILD_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
|
|
||||||
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "\n"
|
|
||||||
"Standards-Version: 3.8.4\n"
|
|
||||||
"Homepage: ${CPACK_PACKAGE_VENDOR}\n"
|
|
||||||
"\n"
|
|
||||||
"Package: ${CPACK_DEBIAN_PACKAGE_NAME}\n"
|
|
||||||
"Architecture: any\n"
|
|
||||||
"Depends: "
|
|
||||||
)
|
|
||||||
|
|
||||||
if( CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
if( CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_DEPENDS})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_DEPENDS})
|
|
||||||
endif( CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
endif( CPACK_DEBIAN_PACKAGE_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "\nRecommends: ")
|
|
||||||
if( CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
if( CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_RECOMMENDS})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_RECOMMENDS})
|
|
||||||
endif( CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
endif( CPACK_DEBIAN_PACKAGE_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "\nSuggests: ")
|
|
||||||
if( CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
if( CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
else( CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_DEBIAN_PACKAGE_SUGGESTS})
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_DEBIAN_PACKAGE_SUGGESTS})
|
|
||||||
endif( CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
endif( CPACK_DEBIAN_PACKAGE_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "\n"
|
|
||||||
"Description: ${CPACK_PACKAGE_DISPLAY_NAME} ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}\n"
|
|
||||||
"${DEB_LONG_DESCRIPTION}"
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach(COMPONENT ${CPACK_COMPONENTS_ALL})
|
|
||||||
string(TOUPPER ${COMPONENT} UPPER_COMPONENT)
|
|
||||||
set(DEPENDS "\${shlibs:Depends}")
|
|
||||||
if( CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
set(DEPENDS "${DEPENDS}, ${DEP}")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
else( CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
if( CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
set(DEPENDS "${DEPENDS}, ${DEP}")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
else( CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS})
|
|
||||||
set(DEPENDS "${DEPENDS}, ${DEP}")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS})
|
|
||||||
endif( CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
endif( CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
|
|
||||||
set(RECOMMENDS)
|
|
||||||
if( CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
set(RECOMMENDS "${RECOMMENDS} ${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
else( CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
if( CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
set(RECOMMENDS "${RECOMMENDS} ${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
else( CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS})
|
|
||||||
set(RECOMMENDS "${RECOMMENDS} ${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS})
|
|
||||||
endif( CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
endif( CPACK_COMPONENT_${UPPER_COMPONENT}_RECOMMENDS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
|
|
||||||
set(SUGGESTS)
|
|
||||||
if( CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
set(SUGGESTS "${SUGGESTS} ${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER}})
|
|
||||||
else( CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
if( CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
set(SUGGESTS "${SUGGESTS} ${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER}})
|
|
||||||
else( CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS})
|
|
||||||
set(SUGGESTS "${SUGGESTS} ${DEP}, ")
|
|
||||||
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS})
|
|
||||||
endif( CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER} )
|
|
||||||
endif( CPACK_COMPONENT_${UPPER_COMPONENT}_SUGGESTS_${DISTRIBUTION_NAME_UPPER}_${RELEASE_UPPER} )
|
|
||||||
|
|
||||||
file(APPEND ${DEBIAN_CONTROL} "\n"
|
|
||||||
"Package: ${CPACK_DEBIAN_PACKAGE_NAME}-${COMPONENT}\n"
|
|
||||||
"Architecture: any\n"
|
|
||||||
"Depends: ${DEPENDS}\n"
|
|
||||||
"Recommends: ${RECOMMENDS}\n"
|
|
||||||
"Suggests: ${SUGGESTS}\n"
|
|
||||||
"Description: ${CPACK_PACKAGE_DISPLAY_NAME} ${CPACK_COMPONENT_${UPPER_COMPONENT}_DISPLAY_NAME}\n"
|
|
||||||
"${DEB_LONG_DESCRIPTION}"
|
|
||||||
" .\n"
|
|
||||||
" ${CPACK_COMPONENT_${UPPER_COMPONENT}_DESCRIPTION}\n"
|
|
||||||
)
|
|
||||||
endforeach(COMPONENT ${CPACK_COMPONENTS_ALL})
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# debian/copyright
|
|
||||||
set(DEBIAN_COPYRIGHT ${DEBIAN_SOURCE_DIR}/debian/copyright)
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E
|
|
||||||
copy ${CPACK_RESOURCE_FILE_LICENSE} ${DEBIAN_COPYRIGHT}
|
|
||||||
)
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# debian/rules
|
|
||||||
set(DEBIAN_RULES ${DEBIAN_SOURCE_DIR}/debian/rules)
|
|
||||||
file(WRITE ${DEBIAN_RULES}
|
|
||||||
"#!/usr/bin/make -f\n"
|
|
||||||
"\n"
|
|
||||||
"BUILDDIR = build_dir\n"
|
|
||||||
"\n"
|
|
||||||
"build:\n"
|
|
||||||
" mkdir $(BUILDDIR)\n"
|
|
||||||
" cd $(BUILDDIR); cmake -DCMAKE_BUILD_TYPE=Release ${CPACK_DEBIAN_CMAKE_OPTIONS} -DCMAKE_INSTALL_PREFIX=/usr ..\n"
|
|
||||||
" $(MAKE) -C $(BUILDDIR) preinstall\n"
|
|
||||||
" touch build\n"
|
|
||||||
"\n"
|
|
||||||
"binary: binary-indep binary-arch\n"
|
|
||||||
"\n"
|
|
||||||
"binary-indep: build\n"
|
|
||||||
"\n"
|
|
||||||
"binary-arch: build\n"
|
|
||||||
" cd $(BUILDDIR); cmake -DCOMPONENT=Unspecified -DCMAKE_INSTALL_PREFIX=../debian/tmp/usr -P cmake_install.cmake\n"
|
|
||||||
" mkdir -p debian/tmp/DEBIAN\n"
|
|
||||||
" dpkg-gensymbols -p${CPACK_DEBIAN_PACKAGE_NAME}\n"
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach(COMPONENT ${CPACK_COMPONENTS_ALL})
|
|
||||||
set(PATH debian/${COMPONENT})
|
|
||||||
file(APPEND ${DEBIAN_RULES}
|
|
||||||
" cd $(BUILDDIR); cmake -DCOMPONENT=${COMPONENT} -DCMAKE_INSTALL_PREFIX=../${PATH}/usr -P cmake_install.cmake\n"
|
|
||||||
" mkdir -p ${PATH}/DEBIAN\n"
|
|
||||||
" dpkg-gensymbols -p${CPACK_DEBIAN_PACKAGE_NAME}-${COMPONENT} -P${PATH}\n"
|
|
||||||
)
|
|
||||||
endforeach(COMPONENT ${CPACK_COMPONENTS_ALL})
|
|
||||||
|
|
||||||
file(APPEND ${DEBIAN_RULES}
|
|
||||||
" dh_shlibdeps\n"
|
|
||||||
" dh_strip\n" # for reducing size
|
|
||||||
" dpkg-gencontrol -p${CPACK_DEBIAN_PACKAGE_NAME}\n"
|
|
||||||
" dpkg --build debian/tmp ..\n"
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach(COMPONENT ${CPACK_COMPONENTS_ALL})
|
|
||||||
set(PATH debian/${COMPONENT})
|
|
||||||
file(APPEND ${DEBIAN_RULES}
|
|
||||||
" dpkg-gencontrol -p${CPACK_DEBIAN_PACKAGE_NAME}-${COMPONENT} -P${PATH} -Tdebian/${COMPONENT}.substvars\n"
|
|
||||||
" dpkg --build ${PATH} ..\n"
|
|
||||||
)
|
|
||||||
endforeach(COMPONENT ${CPACK_COMPONENTS_ALL})
|
|
||||||
|
|
||||||
file(APPEND ${DEBIAN_RULES}
|
|
||||||
"\n"
|
|
||||||
"clean:\n"
|
|
||||||
" rm -f build\n"
|
|
||||||
" rm -rf $(BUILDDIR)\n"
|
|
||||||
"\n"
|
|
||||||
".PHONY: binary binary-arch binary-indep clean\n"
|
|
||||||
)
|
|
||||||
|
|
||||||
execute_process(COMMAND chmod +x ${DEBIAN_RULES})
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# debian/compat
|
|
||||||
file(WRITE ${DEBIAN_SOURCE_DIR}/debian/compat "7")
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# debian/source/format
|
|
||||||
file(WRITE ${DEBIAN_SOURCE_DIR}/debian/source/format "3.0 (quilt)")
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# debian/changelog
|
|
||||||
set(DEBIAN_CHANGELOG ${DEBIAN_SOURCE_DIR}/debian/changelog)
|
|
||||||
execute_process(COMMAND date -R OUTPUT_VARIABLE DATE_TIME)
|
|
||||||
file(WRITE ${DEBIAN_CHANGELOG}
|
|
||||||
"${CPACK_DEBIAN_PACKAGE_NAME} (${RELEASE_PACKAGE_VERSION}) ${RELEASE}; urgency=medium\n\n"
|
|
||||||
" * Package built with CMake\n\n"
|
|
||||||
"${CPACK_DEBIAN_CHANGELOG}"
|
|
||||||
" -- ${CPACK_PACKAGE_CONTACT} ${DATE_TIME}"
|
|
||||||
)
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# debuild -S
|
|
||||||
if( DEB_SOURCE_CHANGES )
|
|
||||||
set(DEBUILD_OPTIONS "-sd")
|
|
||||||
else()
|
|
||||||
set(DEBUILD_OPTIONS "-sa")
|
|
||||||
endif()
|
|
||||||
set(SOURCE_CHANGES_FILE "${CPACK_DEBIAN_PACKAGE_NAME}_${RELEASE_PACKAGE_VERSION}_source.changes")
|
|
||||||
set(DEB_SOURCE_CHANGES ${DEB_SOURCE_CHANGES} "${SOURCE_CHANGES_FILE}")
|
|
||||||
add_custom_command(OUTPUT "${SOURCE_CHANGES_FILE}" COMMAND ${DEBUILD_EXECUTABLE} -S ${DEBUILD_OPTIONS} WORKING_DIRECTORY ${DEBIAN_SOURCE_DIR})
|
|
||||||
endforeach(RELEASE ${CPACK_DEBIAN_DISTRIBUTION_RELEASES})
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# dput ppa:your-lp-id/ppa <source.changes>
|
|
||||||
add_custom_target(dput ${DPUT_EXECUTABLE} ${DPUT_HOST} ${DEB_SOURCE_CHANGES} DEPENDS ${DEB_SOURCE_CHANGES} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Debian)
|
|
|
@ -1,9 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
# Add toolchain patch number for incremental deb builds
|
|
||||||
set(PROJECT_VERSION "${PROJECT_VERSION}-2")
|
|
||||||
|
|
||||||
include (PackageConfig)
|
|
||||||
include (DebConfig)
|
|
|
@ -1,31 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
# - Find dyncall
|
|
||||||
# Find the native libcsptr headers and libraries.
|
|
||||||
#
|
|
||||||
# DYNCALL_INCLUDE_DIRS - where to find smart_ptr.h, etc.
|
|
||||||
# DYNCALL_LIBRARIES - List of libraries when using libcsptr.
|
|
||||||
# DYNCALL_FOUND - True if libcsptr has been found.
|
|
||||||
|
|
||||||
# Look for the header file.
|
|
||||||
FIND_PATH(DYNCALL_INCLUDE_DIR dyncall.h)
|
|
||||||
|
|
||||||
# Look for the library.
|
|
||||||
FIND_LIBRARY(DYNCALL_LIBRARY NAMES dyncall_s)
|
|
||||||
|
|
||||||
# Handle the QUIETLY and REQUIRED arguments and set DYNCALL_FOUND to TRUE if all listed variables are TRUE.
|
|
||||||
INCLUDE(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(DYNCALL DEFAULT_MSG DYNCALL_LIBRARY DYNCALL_INCLUDE_DIR)
|
|
||||||
|
|
||||||
# Copy the results to the output variables.
|
|
||||||
IF(DYNCALL_FOUND)
|
|
||||||
SET(DYNCALL_LIBRARIES ${DYNCALL_LIBRARY})
|
|
||||||
SET(DYNCALL_INCLUDE_DIRS ${DYNCALL_INCLUDE_DIR})
|
|
||||||
ELSE(DYNCALL_FOUND)
|
|
||||||
SET(DYNCALL_LIBRARIES)
|
|
||||||
SET(DYNCALL_INCLUDE_DIRS)
|
|
||||||
ENDIF(DYNCALL_FOUND)
|
|
||||||
|
|
||||||
MARK_AS_ADVANCED(DYNCALL_INCLUDE_DIRS DYNCALL_LIBRARIES)
|
|
|
@ -1,31 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
# - Find libcsptr
|
|
||||||
# Find the native libcsptr headers and libraries.
|
|
||||||
#
|
|
||||||
# CSPTR_INCLUDE_DIRS - where to find smart_ptr.h, etc.
|
|
||||||
# CSPTR_LIBRARIES - List of libraries when using libcsptr.
|
|
||||||
# CSPTR_FOUND - True if libcsptr has been found.
|
|
||||||
|
|
||||||
# Look for the header file.
|
|
||||||
FIND_PATH(CSPTR_INCLUDE_DIR csptr/smart_ptr.h PATH_SUFFIXES csptr)
|
|
||||||
|
|
||||||
# Look for the library.
|
|
||||||
FIND_LIBRARY(CSPTR_LIBRARY NAMES csptr)
|
|
||||||
|
|
||||||
# Handle the QUIETLY and REQUIRED arguments and set CSPTR_FOUND to TRUE if all listed variables are TRUE.
|
|
||||||
INCLUDE(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(CSPTR DEFAULT_MSG CSPTR_LIBRARY CSPTR_INCLUDE_DIR)
|
|
||||||
|
|
||||||
# Copy the results to the output variables.
|
|
||||||
IF(CSPTR_FOUND)
|
|
||||||
SET(CSPTR_LIBRARIES ${CSPTR_LIBRARY})
|
|
||||||
SET(CSPTR_INCLUDE_DIRS ${CSPTR_INCLUDE_DIR})
|
|
||||||
ELSE(CSPTR_FOUND)
|
|
||||||
SET(CSPTR_LIBRARIES)
|
|
||||||
SET(CSPTR_INCLUDE_DIRS)
|
|
||||||
ENDIF(CSPTR_FOUND)
|
|
||||||
|
|
||||||
MARK_AS_ADVANCED(CSPTR_INCLUDE_DIRS CSPTR_LIBRARIES)
|
|
|
@ -1,62 +0,0 @@
|
||||||
# Try to find Libintl functionality
|
|
||||||
# Once done this will define
|
|
||||||
#
|
|
||||||
# LIBINTL_FOUND - system has Libintl
|
|
||||||
# LIBINTL_INCLUDE_DIR - Libintl include directory
|
|
||||||
# LIBINTL_LIBRARIES - Libraries needed to use Libintl
|
|
||||||
#
|
|
||||||
# TODO: This will enable translations only if Gettext functionality is
|
|
||||||
# present in libc. Must have more robust system for release, where Gettext
|
|
||||||
# functionality can also reside in standalone Gettext library, or the one
|
|
||||||
# embedded within kdelibs (cf. gettext.m4 from Gettext source).
|
|
||||||
|
|
||||||
# Copyright (c) 2006, Chusslove Illich, <caslav.ilic@gmx.net>
|
|
||||||
# Copyright (c) 2007, Alexander Neundorf, <neundorf@kde.org>
|
|
||||||
#
|
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
|
||||||
|
|
||||||
|
|
||||||
SET(LIBINTL_SEARCH_PATHS
|
|
||||||
/usr/local/opt/
|
|
||||||
/usr/local/
|
|
||||||
/usr/
|
|
||||||
)
|
|
||||||
|
|
||||||
if(LIBINTL_INCLUDE_DIR AND LIBINTL_LIB_FOUND)
|
|
||||||
set(Libintl_FIND_QUIETLY TRUE)
|
|
||||||
endif(LIBINTL_INCLUDE_DIR AND LIBINTL_LIB_FOUND)
|
|
||||||
|
|
||||||
find_path(LIBINTL_INCLUDE_DIR libintl.h
|
|
||||||
HINTS
|
|
||||||
PATH_SUFFIXES gettext/include
|
|
||||||
PATHS ${LIBINTL_SEARCH_PATHS}
|
|
||||||
)
|
|
||||||
|
|
||||||
set(LIBINTL_LIB_FOUND FALSE)
|
|
||||||
|
|
||||||
if(LIBINTL_INCLUDE_DIR)
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
check_symbol_exists(dgettext libintl.h LIBINTL_LIBC_HAS_DGETTEXT)
|
|
||||||
|
|
||||||
if (LIBINTL_LIBC_HAS_DGETTEXT)
|
|
||||||
set(LIBINTL_LIBRARIES)
|
|
||||||
set(LIBINTL_LIB_FOUND TRUE)
|
|
||||||
else (LIBINTL_LIBC_HAS_DGETTEXT)
|
|
||||||
find_library(LIBINTL_LIBRARIES
|
|
||||||
NAMES intl
|
|
||||||
HINTS
|
|
||||||
PATH_SUFFIXES gettext/lib
|
|
||||||
PATHS ${LIBINTL_SEARCH_PATHS}
|
|
||||||
)
|
|
||||||
if(LIBINTL_LIBRARIES)
|
|
||||||
set(LIBINTL_LIB_FOUND TRUE)
|
|
||||||
endif(LIBINTL_LIBRARIES)
|
|
||||||
endif (LIBINTL_LIBC_HAS_DGETTEXT)
|
|
||||||
|
|
||||||
endif(LIBINTL_INCLUDE_DIR)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(Libintl DEFAULT_MSG LIBINTL_INCLUDE_DIR LIBINTL_LIB_FOUND)
|
|
||||||
|
|
||||||
mark_as_advanced(LIBINTL_INCLUDE_DIR LIBINTL_LIBRARIES LIBINTL_LIBC_HAS_DGETTEXT LIBINTL_LIB_FOUND)
|
|
|
@ -1,26 +0,0 @@
|
||||||
|
|
||||||
if (NOT DEFINED ENV{GCOV})
|
|
||||||
find_program(GCOV_EXECUTABLE gcov)
|
|
||||||
else()
|
|
||||||
find_program(GCOV_EXECUTABLE $ENV{GCOV})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#file(GLOB_RECURSE GCNO_FILES "${CMAKE_CURRENT_BINARY_DIR}/*.gcno")
|
|
||||||
if (WIN32)
|
|
||||||
file(GLOB_RECURSE GCDA_FILES "${COV_PATH}\\*.gcda")
|
|
||||||
else ()
|
|
||||||
file(GLOB_RECURSE GCDA_FILES "${COV_PATH}/*.gcda")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
#execute_process(
|
|
||||||
# COMMAND ${GCOV_EXECUTABLE} -lcp ${GCNO_FILES}
|
|
||||||
# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
#)
|
|
||||||
|
|
||||||
foreach (GCDA ${GCDA_FILES})
|
|
||||||
get_filename_component(DIR ${GCDA} PATH)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GCOV_EXECUTABLE} -lcp -o ${DIR} ${GCDA}
|
|
||||||
WORKING_DIRECTORY ${COV_PATH}
|
|
||||||
)
|
|
||||||
endforeach ()
|
|
|
@ -1,313 +0,0 @@
|
||||||
# Copyright (c) 2012, Jarryd Beck
|
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
# 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 THE COPYRIGHT HOLDER 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.
|
|
||||||
|
|
||||||
|
|
||||||
# This module creates build rules for updating translation files made
|
|
||||||
# with gettext
|
|
||||||
# In your top level CMakeLists.txt, do
|
|
||||||
# include(GettextTranslate)
|
|
||||||
# then in any po directory where you want things to be translated, write
|
|
||||||
# GettextTranslate()
|
|
||||||
#
|
|
||||||
# This module also finds the gettext binaries. If these are in a non-standard
|
|
||||||
# location, you can define the following variables to provide paths to search
|
|
||||||
# in
|
|
||||||
# GettextTranslate_BINARIES --- a path in which to look for every program
|
|
||||||
# GettextTranslate_XGETTEXT --- the xgettext program
|
|
||||||
# GettextTranslate_MSGINIT --- the msginit program
|
|
||||||
# GettextTranslate_MSGFILTER --- the msgfilter program
|
|
||||||
# GettextTranslate_MSGCONV --- the msgconv program
|
|
||||||
# GettextTranslate_MSGMERGE --- the msgmerge program
|
|
||||||
# GettextTranslate_MSGFMT --- the msgfmt program
|
|
||||||
# these are searched first before $PATH, so set this if you have your own
|
|
||||||
# version that overrides the system version
|
|
||||||
#
|
|
||||||
# it reads variables from Makevars, one of the most important being DOMAIN
|
|
||||||
# it reads the languages to generate from LINGUAS
|
|
||||||
#
|
|
||||||
# it adds the following targets
|
|
||||||
# update-po
|
|
||||||
# update-gmo
|
|
||||||
# ${DOMAIN}-pot.update
|
|
||||||
# generate-${DOMAIN}-${lang}-po
|
|
||||||
# generate-${DOMAIN}-${lang}-gmo
|
|
||||||
#
|
|
||||||
# where ${DOMAIN} is the DOMAIN variable read from Makevars
|
|
||||||
# and ${lang} is each language mentioned in LINGUAS
|
|
||||||
#
|
|
||||||
# if you want update-gmo to be added to the "all" target, then define the
|
|
||||||
# variable GettextTranslate_ALL before including this file
|
|
||||||
#
|
|
||||||
# by default, the gmo files are built in the source directory. If you want
|
|
||||||
# them to be built in the binary directory, then define the variable
|
|
||||||
# GettextTranslate_GMO_BINARY
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# add the update-po and update-gmo targets, the actual files that need to
|
|
||||||
# depend on this will be added as we go
|
|
||||||
|
|
||||||
if (DEFINED GettextTranslate_ALL)
|
|
||||||
set(_addToALL "ALL")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_target(update-po)
|
|
||||||
add_custom_target(update-gmo ${_addToALL})
|
|
||||||
|
|
||||||
#look for all the programs
|
|
||||||
#xgettext, msginit, msgfilter, msgconv, msgmerge, msgfmt
|
|
||||||
|
|
||||||
function(REQUIRE_BINARY binname varname)
|
|
||||||
if (defined ${${varname}-NOTFOUND})
|
|
||||||
message(FATAL_ERROR "Could not find " binname)
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
find_program(GettextTranslate_XGETTEXT_EXECUTABLE xgettext
|
|
||||||
HINTS ${GettextTranslate_XGETTEXT} ${GettextTranslate_BINARIES}
|
|
||||||
)
|
|
||||||
REQUIRE_BINARY(xgettext GettextTranslate_XGETTEXT_EXECUTABLE)
|
|
||||||
|
|
||||||
find_program(GettextTranslate_MSGINIT_EXECUTABLE msginit
|
|
||||||
HINTS ${GettextTranslate_MSGINIT} ${GettextTranslate_BINARIES}
|
|
||||||
)
|
|
||||||
REQUIRE_BINARY(msginit GettextTranslate_MSGINIT_EXECUTABLE)
|
|
||||||
|
|
||||||
find_program(GettextTranslate_MSGFILTER_EXECUTABLE msgfilter
|
|
||||||
HINTS ${GettextTranslate_MSGFILTER} ${GettextTranslate_BINARIES}
|
|
||||||
)
|
|
||||||
REQUIRE_BINARY(msgfilter GettextTranslate_MSGFILTER_EXECUTABLE)
|
|
||||||
|
|
||||||
find_program(GettextTranslate_MSGCONV_EXECUTABLE msgconv
|
|
||||||
HINTS ${GettextTranslate_MSGCONV} ${GettextTranslate_BINARIES}
|
|
||||||
)
|
|
||||||
REQUIRE_BINARY(msgconv GettextTranslate_MSGCONV_EXECUTABLE)
|
|
||||||
|
|
||||||
find_program(GettextTranslate_MSGMERGE_EXECUTABLE msgmerge
|
|
||||||
HINTS ${GettextTranslate_MSGMERGE} ${GettextTranslate_BINARIES}
|
|
||||||
)
|
|
||||||
REQUIRE_BINARY(msgmerge GettextTranslate_MSGMERGE_EXECUTABLE)
|
|
||||||
|
|
||||||
find_program(GettextTranslate_MSGFMT_EXECUTABLE msgfmt
|
|
||||||
HINTS ${GettextTranslate_MSGFMT} ${GettextTranslate_BINARIES}
|
|
||||||
)
|
|
||||||
REQUIRE_BINARY(msgfmt GettextTranslate_MSGFMT_EXECUTABLE)
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
GettextTranslate_MSGCONV_EXECUTABLE
|
|
||||||
GettextTranslate_MSGFILTER_EXECUTABLE
|
|
||||||
GettextTranslate_MSGFMT_EXECUTABLE
|
|
||||||
GettextTranslate_MSGINIT_EXECUTABLE
|
|
||||||
GettextTranslate_MSGMERGE_EXECUTABLE
|
|
||||||
GettextTranslate_XGETTEXT_EXECUTABLE
|
|
||||||
)
|
|
||||||
|
|
||||||
macro(GettextTranslate)
|
|
||||||
|
|
||||||
if(GettextTranslate_GMO_BINARY)
|
|
||||||
set (GMO_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
else()
|
|
||||||
set (GMO_BUILD_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in)
|
|
||||||
message(FATAL_ERROR "There is no POTFILES.in in
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Makevars)
|
|
||||||
message(FATAL_ERROR "There is no Makevars in ${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Makevars makevars
|
|
||||||
REGEX "^[^=]+=(.*)$"
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach(makevar ${makevars})
|
|
||||||
string(REGEX REPLACE "^([^= ]+) =[ ]?(.*)$" "\\1" MAKEVAR_KEY ${makevar})
|
|
||||||
string(REGEX REPLACE "^([^= ]+) =[ ]?(.*)$" "\\2"
|
|
||||||
MAKEVAR_${MAKEVAR_KEY} ${makevar})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/POTFILES
|
|
||||||
COPYONLY
|
|
||||||
)
|
|
||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/LINGUAS
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/LINGUAS
|
|
||||||
COPYONLY
|
|
||||||
)
|
|
||||||
|
|
||||||
#set the directory to not clean
|
|
||||||
#set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
# PROPERTY CLEAN_NO_CUSTOM true)
|
|
||||||
|
|
||||||
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in potfiles
|
|
||||||
REGEX "^[^#].*"
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach(potfile ${potfiles})
|
|
||||||
list(APPEND source_translatable
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/${MAKEVAR_top_builddir}/${potfile})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(TEMPLATE_FILE ${MAKEVAR_DOMAIN}.pot)
|
|
||||||
set(TEMPLATE_FILE_ABS ${CMAKE_CURRENT_SOURCE_DIR}/${TEMPLATE_FILE})
|
|
||||||
string(REGEX MATCHALL "[^ ]+" XGETTEXT_OPTS ${MAKEVAR_XGETTEXT_OPTIONS})
|
|
||||||
#add_custom_target(${MAKEVAR_DOMAIN}.pot-update DEPENDS
|
|
||||||
# ${TEMPLATE_FILE_ABS}
|
|
||||||
#)
|
|
||||||
|
|
||||||
add_custom_target(${MAKEVAR_DOMAIN}.pot-update
|
|
||||||
COMMAND ${GettextTranslate_XGETTEXT_EXECUTABLE} ${XGETTEXT_OPTS}
|
|
||||||
-o ${TEMPLATE_FILE_ABS}
|
|
||||||
--default-domain=${MAKEVAR_DOMAIN}
|
|
||||||
--add-comments=TRANSLATORS:
|
|
||||||
--copyright-holder=${MAKEVAR_COPYRIGHT_HOLDER}
|
|
||||||
--msgid-bugs-address="${MAKEVAR_MSGID_BUGS_ADDRESS}"
|
|
||||||
--directory=${MAKEVAR_top_builddir}
|
|
||||||
--files-from=${CMAKE_CURRENT_BINARY_DIR}/POTFILES
|
|
||||||
--package-version=${VERSION}
|
|
||||||
--package-name=${CMAKE_PROJECT_NAME}
|
|
||||||
DEPENDS ${source_translatable}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
#add_custom_command(OUTPUT ${TEMPLATE_FILE_ABS}
|
|
||||||
# COMMAND ${GettextTranslate_XGETTEXT_EXECUTABLE} ${XGETTEXT_OPTS}
|
|
||||||
# -o ${TEMPLATE_FILE_ABS}
|
|
||||||
# --default-domain=${MAKEVAR_DOMAIN}
|
|
||||||
# --add-comments=TRANSLATORS:
|
|
||||||
# --copyright-holder=${MAKEVAR_COPYRIGHT_HOLDER}
|
|
||||||
# --msgid-bugs-address="${MAKEVAR_MSGID_BUGS_ADDRESS}"
|
|
||||||
# --directory=${MAKEVAR_top_builddir}
|
|
||||||
# --files-from=${CMAKE_CURRENT_BINARY_DIR}/POTFILES
|
|
||||||
# --package-version=${VERSION}
|
|
||||||
# --package-name=${CMAKE_PROJECT_NAME}
|
|
||||||
# DEPENDS ${source_translatable}
|
|
||||||
# ${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in
|
|
||||||
# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
#)
|
|
||||||
|
|
||||||
#add_dependencies(update-po ${MAKEVAR_DOMAIN}.pot-update)
|
|
||||||
|
|
||||||
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/LINGUAS LINGUAS
|
|
||||||
REGEX "^[^#].*")
|
|
||||||
string(REGEX MATCHALL "[^ ]+" languages ${LINGUAS})
|
|
||||||
|
|
||||||
foreach(lang ${languages})
|
|
||||||
set(PO_FILE_NAME "${CMAKE_CURRENT_SOURCE_DIR}/${lang}.po")
|
|
||||||
set(GMO_FILE_NAME "${GMO_BUILD_DIR}/${lang}.gmo")
|
|
||||||
set(PO_TARGET "generate-${MAKEVAR_DOMAIN}-${lang}-po")
|
|
||||||
set(GMO_TARGET "generate-${MAKEVAR_DOMAIN}-${lang}-gmo")
|
|
||||||
list(APPEND po_files ${PO_TARGET})
|
|
||||||
list(APPEND gmo_files ${GMO_TARGET})
|
|
||||||
|
|
||||||
if(${lang} MATCHES "en@(.*)quot")
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${lang}.insert-header
|
|
||||||
COMMAND
|
|
||||||
sed -e "'/^#/d'" -e 's/HEADER/${lang}.header/g'
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/insert-header.sin > ${lang}.insert-header
|
|
||||||
)
|
|
||||||
|
|
||||||
#generate the en@quot files
|
|
||||||
add_custom_target(${PO_TARGET}
|
|
||||||
COMMAND
|
|
||||||
${GettextTranslate_MSGINIT_EXECUTABLE} -i ${TEMPLATE_FILE_ABS}
|
|
||||||
--no-translator -l ${lang}
|
|
||||||
-o - 2>/dev/null
|
|
||||||
| sed -f ${CMAKE_CURRENT_BINARY_DIR}/${lang}.insert-header
|
|
||||||
| ${GettextTranslate_MSGCONV_EXECUTABLE} -t UTF-8
|
|
||||||
| ${GettextTranslate_MSGFILTER_EXECUTABLE} sed -f
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/`echo ${lang}
|
|
||||||
| sed -e 's/.*@//'`.sed 2>/dev/null >
|
|
||||||
${PO_FILE_NAME}
|
|
||||||
DEPENDS ${lang}.insert-header ${TEMPLATE_FILE_ABS}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
else()
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GettextTranslate_MSGMERGE_EXECUTABLE} --version
|
|
||||||
OUTPUT_VARIABLE MSGMERGE_VERSION_MSG
|
|
||||||
)
|
|
||||||
string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" MSGMERGE_VERSION "${MSGMERGE_VERSION_MSG}")
|
|
||||||
|
|
||||||
if ("${MSGMERGE_VERSION}" VERSION_GREATER "0.17")
|
|
||||||
add_custom_target(${PO_TARGET}
|
|
||||||
COMMAND ${GettextTranslate_MSGMERGE_EXECUTABLE} --lang=${lang}
|
|
||||||
${PO_FILE_NAME} ${TEMPLATE_FILE_ABS}
|
|
||||||
-o ${PO_FILE_NAME}.new
|
|
||||||
COMMAND if diff ${PO_FILE_NAME} ${PO_FILE_NAME}.new
|
|
||||||
--unchanged-line-format='' --old-line-format=''
|
|
||||||
| grep -v 'POT-Creation-Date' >/dev/null\; then
|
|
||||||
mv ${PO_FILE_NAME}.new ${PO_FILE_NAME}\;
|
|
||||||
else
|
|
||||||
rm ${PO_FILE_NAME}.new\;
|
|
||||||
fi
|
|
||||||
DEPENDS ${TEMPLATE_FILE_ABS}
|
|
||||||
)
|
|
||||||
else ()
|
|
||||||
add_custom_target(${PO_TARGET}
|
|
||||||
COMMAND ${GettextTranslate_MSGMERGE_EXECUTABLE}
|
|
||||||
${PO_FILE_NAME} ${TEMPLATE_FILE_ABS}
|
|
||||||
-o ${PO_FILE_NAME}.new
|
|
||||||
COMMAND if diff ${PO_FILE_NAME} ${PO_FILE_NAME}.new
|
|
||||||
--unchanged-line-format='' --old-line-format=''
|
|
||||||
| grep -v 'POT-Creation-Date' >/dev/null\; then
|
|
||||||
mv ${PO_FILE_NAME}.new ${PO_FILE_NAME}\;
|
|
||||||
else
|
|
||||||
rm ${PO_FILE_NAME}.new\;
|
|
||||||
fi
|
|
||||||
DEPENDS ${TEMPLATE_FILE_ABS}
|
|
||||||
)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_target(${GMO_TARGET}
|
|
||||||
COMMAND ${GettextTranslate_MSGFMT_EXECUTABLE} -c --statistics --verbose
|
|
||||||
-o ${GMO_FILE_NAME} ${PO_FILE_NAME}
|
|
||||||
DEPENDS ${PO_TARGET}
|
|
||||||
)
|
|
||||||
|
|
||||||
add_dependencies(${PO_TARGET} ${MAKEVAR_DOMAIN}.pot-update)
|
|
||||||
|
|
||||||
install(FILES ${GMO_FILE_NAME} DESTINATION
|
|
||||||
${LOCALEDIR_REL}/${lang}/LC_MESSAGES
|
|
||||||
RENAME ${MAKEVAR_DOMAIN}.mo
|
|
||||||
)
|
|
||||||
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
add_dependencies(update-po ${po_files})
|
|
||||||
add_dependencies(update-gmo ${gmo_files})
|
|
||||||
|
|
||||||
#string(REGEX MATCH "^[^=]+=(.*)$" parsed_variables ${makevars})
|
|
||||||
|
|
||||||
endmacro()
|
|
|
@ -1,13 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
option(LANG_CXX "Turn on C++ support" ON)
|
|
||||||
option(THEORIES "Activate the support for theories" ON)
|
|
||||||
option(MINGW_DEFINE_OFF_T "Define off_t and off64_t ourselves before including io.h" OFF)
|
|
||||||
option(COVERALLS "Turn on coveralls support" OFF)
|
|
||||||
option(COVERALLS_UPLOAD "Upload the generated coveralls json" ON)
|
|
||||||
option(DEV_BUILD "Compile in developer mode" OFF)
|
|
||||||
option(CTESTS "Turn on the samples and test" ${DEV_BUILD})
|
|
||||||
option(I18N "Turn on internationalization" ON)
|
|
||||||
option(UPLOAD_DEB "Upload package to launchpad" OFF)
|
|
|
@ -1,79 +0,0 @@
|
||||||
|
|
||||||
function(extract_version version major minor patch extra)
|
|
||||||
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" version_valid ${version})
|
|
||||||
if(version_valid)
|
|
||||||
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" "\\1;\\2;\\3;\\4" VERSION_MATCHES ${version})
|
|
||||||
list(GET VERSION_MATCHES 0 version_major)
|
|
||||||
set(${major} ${version_major} PARENT_SCOPE)
|
|
||||||
list(GET VERSION_MATCHES 1 version_minor)
|
|
||||||
set(${minor} ${version_minor} PARENT_SCOPE)
|
|
||||||
list(GET VERSION_MATCHES 2 version_patch)
|
|
||||||
set(${patch} ${version_patch} PARENT_SCOPE)
|
|
||||||
list(GET VERSION_MATCHES 3 version_extra)
|
|
||||||
set(${extra} ${version_extra} PARENT_SCOPE)
|
|
||||||
else(version_valid)
|
|
||||||
message(AUTHOR_WARNING "Bad version ${version}; falling back to 0 (have you made an initial release?)")
|
|
||||||
set(${major} "0" PARENT_SCOPE)
|
|
||||||
set(${minor} "" PARENT_SCOPE)
|
|
||||||
set(${patch} "" PARENT_SCOPE)
|
|
||||||
set(${extra} "" PARENT_SCOPE)
|
|
||||||
endif(version_valid)
|
|
||||||
endfunction(extract_version)
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
set(CPACK_GENERATOR "ZIP")
|
|
||||||
set(CPACK_SOURCE_GENERATOR "ZIP")
|
|
||||||
else ()
|
|
||||||
set(CPACK_GENERATOR "TGZ")
|
|
||||||
set(CPACK_SOURCE_GENERATOR "TGZ")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A KISS, modern unit testing framework for C and C++.")
|
|
||||||
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-binary-${PROJECT_VERSION}")
|
|
||||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}")
|
|
||||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}")
|
|
||||||
set(CPACK_PACKAGE_VENDOR "Franklin \"Snaipe\" Mathieu")
|
|
||||||
set(CPACK_PACKAGE_CONTACT "Franklin \"Snaipe\" Mathieu <franklinmathieu@gmail.com>")
|
|
||||||
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
# add snapshot specific versioning information
|
|
||||||
if (CPACK_DEBIAN_PACKAGE_TYPE STREQUAL "snapshot")
|
|
||||||
execute_process(COMMAND date +%Y%m%d%0k%0M%0S%z OUTPUT_VARIABLE SNAPSHOT_DATE_TIME)
|
|
||||||
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}-snapshot-${SNAPSHOT_DATE_TIME}")
|
|
||||||
STRING(REPLACE "\n" "" CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/debian.copyright")
|
|
||||||
extract_version(${PROJECT_VERSION}
|
|
||||||
CPACK_PACKAGE_VERSION_MAJOR
|
|
||||||
CPACK_PACKAGE_VERSION_MINOR
|
|
||||||
CPACK_PACKAGE_VERSION_PATCH
|
|
||||||
VERSION_EXTRA
|
|
||||||
)
|
|
||||||
|
|
||||||
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
|
||||||
|
|
||||||
file(GLOB TRASH_FILES "${PROJECT_SOURCE_DIR}/*")
|
|
||||||
set(KEEP_FILES
|
|
||||||
"${PROJECT_SOURCE_DIR}/.cmake"
|
|
||||||
"${PROJECT_SOURCE_DIR}/src"
|
|
||||||
"${PROJECT_SOURCE_DIR}/include"
|
|
||||||
"${PROJECT_SOURCE_DIR}/doc"
|
|
||||||
"${PROJECT_SOURCE_DIR}/dev"
|
|
||||||
"${PROJECT_SOURCE_DIR}/po"
|
|
||||||
"${PROJECT_SOURCE_DIR}/dependencies"
|
|
||||||
"${PROJECT_SOURCE_DIR}/CMakeLists.txt"
|
|
||||||
"${PROJECT_SOURCE_DIR}/README.md"
|
|
||||||
"${PROJECT_SOURCE_DIR}/CONTRIBUTING.md"
|
|
||||||
"${PROJECT_SOURCE_DIR}/LICENSE"
|
|
||||||
"${PROJECT_SOURCE_DIR}/ChangeLog"
|
|
||||||
"${PROJECT_SOURCE_DIR}/description.txt"
|
|
||||||
)
|
|
||||||
list(REMOVE_ITEM TRASH_FILES ${KEEP_FILES})
|
|
||||||
# Escape any '.' characters
|
|
||||||
string(REPLACE "." "\\\\." TRASH_FILES "${TRASH_FILES}")
|
|
||||||
set(CPACK_SOURCE_IGNORE_FILES "${TRASH_FILES}")
|
|
||||||
|
|
||||||
include(CPack)
|
|
|
@ -1,97 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
include(CMakeParseArguments)
|
|
||||||
|
|
||||||
function (cr_link_package _TARGET _PKG)
|
|
||||||
if (${_PKG}_LIB_FOUND OR ${_PKG}_FOUND)
|
|
||||||
target_link_libraries(${_TARGET} ${${_PKG}_LIBRARIES})
|
|
||||||
include_directories(${${_PKG}_INCLUDE_DIRS})
|
|
||||||
endif ()
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
function (cr_link_libraries _TARGET)
|
|
||||||
set (multiValueArgs IF)
|
|
||||||
cmake_parse_arguments (ARGS "" "" "${multiValueArgs}" ${ARGN})
|
|
||||||
|
|
||||||
if (ARGS_IF)
|
|
||||||
if (${ARGS_IF})
|
|
||||||
else ()
|
|
||||||
return ()
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
target_link_libraries(${_TARGET} ${ARGS_UNPARSED_ARGUMENTS})
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
function (cr_add_library _LIB)
|
|
||||||
set (options SHARED STATIC)
|
|
||||||
set (oneValueArgs COMPONENT)
|
|
||||||
set (multiValueArgs SOURCES HEADERS PROPERTIES)
|
|
||||||
cmake_parse_arguments (ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
||||||
|
|
||||||
set (flags "")
|
|
||||||
if (ARGS_SHARED)
|
|
||||||
set (flags ${flags} SHARED)
|
|
||||||
elseif (ARGS_STATIC)
|
|
||||||
set (flags ${flags} STATIC)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
add_library(${_LIB} ${flags} ${ARGS_SOURCES} ${ARGS_HEADERS})
|
|
||||||
set_target_properties(${_LIB} PROPERTIES ${ARGS_PROPERTIES})
|
|
||||||
|
|
||||||
foreach (F ${INTERFACE_FILES})
|
|
||||||
get_filename_component(DEST "${F}" PATH)
|
|
||||||
if (ARGS_COMPONENT)
|
|
||||||
set (install_flags COMPONENT ${ARGS_COMPONENT})
|
|
||||||
endif ()
|
|
||||||
install(FILES "${F}" DESTINATION "${DEST}" ${install_flags})
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
install(TARGETS ${_LIB}
|
|
||||||
RUNTIME DESTINATION bin
|
|
||||||
LIBRARY DESTINATION lib
|
|
||||||
ARCHIVE DESTINATION lib ${install_flags}
|
|
||||||
)
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
find_package(PkgConfig)
|
|
||||||
|
|
||||||
macro (cr_find_package _PKG)
|
|
||||||
set (options REQUIRED)
|
|
||||||
set (oneValueArgs PKGCONFIG)
|
|
||||||
cmake_parse_arguments (ARGS "${options}" "${oneValueArgs}" "" ${ARGN})
|
|
||||||
|
|
||||||
string (TOUPPER "${_PKG}" _PKG_UP)
|
|
||||||
|
|
||||||
find_package (${_PKG})
|
|
||||||
if (NOT ${_PKG_UP}_FOUND AND ${_PKG_UP}_LIB_FOUND)
|
|
||||||
set (${_PKG_UP}_FOUND ON)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT ${_PKG_UP}_FOUND AND PKGCONFIG_FOUND)
|
|
||||||
message (STATUS "Checking for package ${_PKG} with pkg-config")
|
|
||||||
if (NOT ARGS_PKGCONFIG)
|
|
||||||
set (ARGS_PKGCONFIG ${_PKG})
|
|
||||||
endif ()
|
|
||||||
pkg_check_modules(${_PKG_UP}_PKG ${ARGS_PKGCONFIG})
|
|
||||||
|
|
||||||
if (${_PKG_UP}_PKG_FOUND)
|
|
||||||
if (${_PKG_UP}_PKG_LIBRARY_DIRS)
|
|
||||||
link_directories(${${_PKG_UP}_PKG_LIBRARY_DIRS})
|
|
||||||
endif ()
|
|
||||||
set (${_PKG_UP}_LIBRARIES ${${_PKG_UP}_PKG_LIBRARIES})
|
|
||||||
set (${_PKG_UP}_INCLUDE_DIRS ${${_PKG_UP}_PKG_INCLUDE_DIRS})
|
|
||||||
set (${_PKG_UP}_FOUND 1)
|
|
||||||
endif()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT ${_PKG_UP}_FOUND AND ARGS_REQUIRED)
|
|
||||||
message (FATAL_ERROR "Could not find required package ${_PKG}")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (${_PKG_UP}_FOUND)
|
|
||||||
set (HAVE_${_PKG_UP} 1)
|
|
||||||
endif ()
|
|
||||||
endmacro ()
|
|
|
@ -1,41 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
set (PROJECT_VERSION "2.3.0-rc1")
|
|
||||||
set (PROJECT_SOVERSION 3)
|
|
||||||
set (PROJECT_SONAME 3.1.0)
|
|
||||||
|
|
||||||
set (LOCALEDIR_REL "share/locale")
|
|
||||||
set (LOCALEDIR "${CMAKE_INSTALL_PREFIX}/${LOCALEDIR_REL}")
|
|
||||||
string (TOLOWER "${PROJECT_NAME}" PROJECT_NAME_LOWER)
|
|
||||||
|
|
||||||
add_definitions(
|
|
||||||
-DCRITERION_BUILDING_DLL=1
|
|
||||||
-DPB_ENABLE_MALLOC=1
|
|
||||||
)
|
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS_DEFAULT "${CMAKE_C_FLAGS}")
|
|
||||||
set (CMAKE_CXX_FLAGS_DEFAULT "${CMAKE_CXX_FLAGS}")
|
|
||||||
|
|
||||||
if (MSVC)
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
|
|
||||||
add_definitions (-D_CRT_SECURE_NO_WARNINGS=1)
|
|
||||||
add_definitions (-DVC_EXTRALEAN)
|
|
||||||
add_definitions (-DWIN32_LEAN_AND_MEAN)
|
|
||||||
add_definitions (-D_WIN32_WINNT=0x600)
|
|
||||||
else ()
|
|
||||||
if (WIN32)
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-no-undefined")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -std=gnu99 -fvisibility=hidden")
|
|
||||||
if (CMAKE_CXX_COMPILER_WORKS)
|
|
||||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra ${CXX11_FLAG} -fvisibility=hidden")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
include_directories(SYSTEM
|
|
||||||
/usr/local/include
|
|
||||||
/usr/include/GNUstep
|
|
||||||
)
|
|
|
@ -1,29 +0,0 @@
|
||||||
if(EXISTS "${PROJECT_SOURCE_DIR}/.gitmodules")
|
|
||||||
message(STATUS "Updating submodules to their latest/fixed versions")
|
|
||||||
message(STATUS "(this can take a while, please be patient)")
|
|
||||||
|
|
||||||
### set the direcory where the submodules live
|
|
||||||
set(GIT_SUBMODULES_DIRECTORY dependencies)
|
|
||||||
|
|
||||||
### set the directory names of the submodules
|
|
||||||
set(GIT_SUBMODULES libcsptr dyncall)
|
|
||||||
|
|
||||||
### set each submodules's commit or tag that is to be checked out
|
|
||||||
### (leave empty if you want master)
|
|
||||||
|
|
||||||
### First, get all submodules in
|
|
||||||
if(${GIT_SUBMODULES_CHECKOUT_QUIET})
|
|
||||||
execute_process(
|
|
||||||
COMMAND git submodule update --init --recursive
|
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
||||||
OUTPUT_QUIET
|
|
||||||
ERROR_QUIET
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
execute_process(
|
|
||||||
COMMAND git submodule update --init --recursive
|
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endif()
|
|
|
@ -1,123 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
include(ExternalProject)
|
|
||||||
include(CMakeParseArguments)
|
|
||||||
|
|
||||||
function (cr_add_subproject _NAME)
|
|
||||||
set (options CMAKE AUTOTOOLS)
|
|
||||||
set (oneValueArgs GIT PATH PREFIX GENERATOR)
|
|
||||||
set (multiValueArgs OPTS IF)
|
|
||||||
cmake_parse_arguments (ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
||||||
|
|
||||||
if (ARGS_IF)
|
|
||||||
if (${ARGS_IF})
|
|
||||||
set (${_NAME}_SUBPROJECT_EXISTS 1 PARENT_SCOPE)
|
|
||||||
else ()
|
|
||||||
return ()
|
|
||||||
endif ()
|
|
||||||
else ()
|
|
||||||
set (${_NAME}_SUBPROJECT_EXISTS 1 PARENT_SCOPE)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (ARGS_PREFIX)
|
|
||||||
set (install_prefix ${CMAKE_BINARY_DIR}/external/${ARGS_PREFIX})
|
|
||||||
else ()
|
|
||||||
set (install_prefix ${CMAKE_BINARY_DIR}/external)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (ARGS_GIT)
|
|
||||||
string(REPLACE "#" ";" git_opts "${ARGS_GIT}")
|
|
||||||
list(LENGTH git_opts git_opts_len)
|
|
||||||
list(GET git_opts 0 repo)
|
|
||||||
set (epa_opts GIT_REPOSITORY "${repo}")
|
|
||||||
if (git_opts_len GREATER 1)
|
|
||||||
list(GET git_opts 1 object)
|
|
||||||
set (epa_opts ${epa_opts} GIT_TAG "${object}")
|
|
||||||
endif ()
|
|
||||||
elseif (ARGS_PATH)
|
|
||||||
set (epa_opts SOURCE_DIR "${CMAKE_SOURCE_DIR}/${ARGS_PATH}")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (ARGS_CMAKE)
|
|
||||||
if (NOT ARGS_GENERATOR)
|
|
||||||
set (ARGS_GENERATOR ${CMAKE_GENERATOR})
|
|
||||||
endif ()
|
|
||||||
if (CMAKE_TOOLCHAIN_FILE)
|
|
||||||
set (ARGS_OPTS ${ARGS_OPTS}
|
|
||||||
"-DCMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}"
|
|
||||||
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
|
|
||||||
endif ()
|
|
||||||
set (build_cmds
|
|
||||||
CONFIGURE_COMMAND ${CMAKE_COMMAND} <SOURCE_DIR>
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${install_prefix}
|
|
||||||
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
|
||||||
-G "${ARGS_GENERATOR}"
|
|
||||||
${ARGS_OPTS}
|
|
||||||
BUILD_COMMAND ${CMAKE_COMMAND} --build "${CMAKE_BINARY_DIR}/${_NAME}"
|
|
||||||
INSTALL_COMMAND ${CMAKE_COMMAND} --build "${CMAKE_BINARY_DIR}/${_NAME}" --target install
|
|
||||||
)
|
|
||||||
elseif (ARGS_AUTOTOOLS)
|
|
||||||
set (make_opts "")
|
|
||||||
if (ARGS_PARALLELIZED)
|
|
||||||
set (make_opts "${make_opts} -j4")
|
|
||||||
endif ()
|
|
||||||
set (build_cmds
|
|
||||||
UPDATE_COMMAND <SOURCE_DIR>/autogen.sh
|
|
||||||
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${install_prefix} ${ARGS_OPTS}
|
|
||||||
BUILD_COMMAND make ${make_opts}
|
|
||||||
INSTALL_COMMAND make install
|
|
||||||
)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
externalproject_add(
|
|
||||||
${_NAME}
|
|
||||||
${epa_opts}
|
|
||||||
|
|
||||||
PREFIX "${CMAKE_BINARY_DIR}/${_NAME}-build"
|
|
||||||
BINARY_DIR "${CMAKE_BINARY_DIR}/${_NAME}"
|
|
||||||
|
|
||||||
${build_cmds}
|
|
||||||
)
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
set ("${_NAME}_SHARED_LIB" "${install_prefix}/lib/${_NAME}.dll" PARENT_SCOPE)
|
|
||||||
if (ARGS_GENERATOR MATCHES "(Unix|MSYS|MinGW) Makefiles")
|
|
||||||
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/lib${_NAME}.a" PARENT_SCOPE)
|
|
||||||
else ()
|
|
||||||
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/${_NAME}.lib" PARENT_SCOPE)
|
|
||||||
endif ()
|
|
||||||
elseif (APPLE)
|
|
||||||
set ("${_NAME}_SHARED_LIB" "${install_prefix}/lib/lib${_NAME}.dylib" PARENT_SCOPE)
|
|
||||||
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/lib${_NAME}.a" PARENT_SCOPE)
|
|
||||||
elseif (UNIX)
|
|
||||||
set ("${_NAME}_SHARED_LIB" "${install_prefix}/lib/lib${_NAME}.so" PARENT_SCOPE)
|
|
||||||
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/lib${_NAME}.a" PARENT_SCOPE)
|
|
||||||
else ()
|
|
||||||
message (FATAL_ERROR "Could not set proper library path for the current platform")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
function (cr_link_subproject _TARGET _SUBPROJECT)
|
|
||||||
if (NOT ${_SUBPROJECT}_SUBPROJECT_EXISTS)
|
|
||||||
return ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set (options STATIC SHARED)
|
|
||||||
cmake_parse_arguments (ARGS "${options}" "" "" ${ARGN})
|
|
||||||
|
|
||||||
add_dependencies("${_TARGET}" "${_SUBPROJECT}")
|
|
||||||
if (ARGS_SHARED)
|
|
||||||
target_link_libraries("${_TARGET}" "${${_SUBPROJECT}_SHARED_LIB}")
|
|
||||||
endif ()
|
|
||||||
if (ARGS_STATIC)
|
|
||||||
target_link_libraries("${_TARGET}" "${${_SUBPROJECT}_STATIC_LIB}")
|
|
||||||
endif ()
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
include_directories(${CMAKE_BINARY_DIR}/external/include)
|
|
||||||
link_directories(${CMAKE_BINARY_DIR}/external/lib)
|
|
||||||
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt")
|
|
||||||
|
|
||||||
if(NOT EXISTS ${MANIFEST})
|
|
||||||
message(FATAL_ERROR "Cannot find install manifest: '${MANIFEST}'")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
file(STRINGS ${MANIFEST} files)
|
|
||||||
foreach(file ${files})
|
|
||||||
message(STATUS "Removing file: '${file}'")
|
|
||||||
|
|
||||||
exec_program(
|
|
||||||
${CMAKE_COMMAND} ARGS "-E remove ${file}"
|
|
||||||
OUTPUT_VARIABLE stdout
|
|
||||||
RETURN_VALUE result
|
|
||||||
)
|
|
||||||
if (NOT "${result}" STREQUAL 0)
|
|
||||||
message(FATAL_ERROR "Failed to remove file: '${file}'.")
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
CURDIR=$(dirname $0)
|
|
||||||
SOURCE_DIR=$1; shift
|
|
||||||
DEST_DIR=$1; shift
|
|
||||||
|
|
||||||
(
|
|
||||||
cd "$SOURCE_DIR"
|
|
||||||
mkdir -p "$DEST_DIR"
|
|
||||||
"$CURDIR/git-archive-all.sh" --format tar -- - | tar -x -C "$DEST_DIR"
|
|
||||||
)
|
|
|
@ -1,18 +0,0 @@
|
||||||
--- _test.py.orig 2016-09-03 00:50:27.505527300 +0200
|
|
||||||
+++ "/c/Program Files/Python35/lib/site-packages/cram/_test.py" 2016-09-03 00:48:48.708932100 +0200
|
|
||||||
@@ -143,11 +143,15 @@
|
|
||||||
after.setdefault(pos, []).append(line)
|
|
||||||
stdin.append(b('echo %s %s $?\n' % (usalt, i + 1)))
|
|
||||||
|
|
||||||
+ env = {k: v.decode('utf-8') if isinstance(v, bytes) else v for k, v in env.items()}
|
|
||||||
+
|
|
||||||
output, retcode = execute(shell + ['-'], stdin=b('').join(stdin),
|
|
||||||
stdout=PIPE, stderr=STDOUT, env=env)
|
|
||||||
if retcode == 80:
|
|
||||||
return (refout, None, [])
|
|
||||||
|
|
||||||
+ output = output.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
|
|
||||||
+
|
|
||||||
pos = -1
|
|
||||||
ret = 0
|
|
||||||
for i, line in enumerate(output[:-1].splitlines(True)):
|
|
|
@ -1,39 +0,0 @@
|
||||||
diff --git a/cram.py b/cram.py
|
|
||||||
index 20c4681..3b9f144 100755
|
|
||||||
--- a/cram.py
|
|
||||||
+++ b/cram.py
|
|
||||||
@@ -168,14 +168,14 @@ def test(path, shell, indent=2):
|
|
||||||
cmdline = '%s$ ' % indent
|
|
||||||
conline = '%s> ' % indent
|
|
||||||
|
|
||||||
- f = open(path)
|
|
||||||
+ f = open(path, 'r', encoding='utf-8')
|
|
||||||
abspath = os.path.abspath(path)
|
|
||||||
env = os.environ.copy()
|
|
||||||
env['TESTDIR'] = os.path.dirname(abspath)
|
|
||||||
env['TESTFILE'] = os.path.basename(abspath)
|
|
||||||
p = subprocess.Popen([shell, '-'], bufsize=-1, stdin=subprocess.PIPE,
|
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
|
||||||
- universal_newlines=True, env=env,
|
|
||||||
+ universal_newlines=False, env=env,
|
|
||||||
preexec_fn=makeresetsigpipe(),
|
|
||||||
close_fds=os.name == 'posix')
|
|
||||||
salt = 'CRAM%s' % time.time()
|
|
||||||
@@ -199,7 +199,7 @@ def test(path, shell, indent=2):
|
|
||||||
after.setdefault(pos, []).append(line)
|
|
||||||
stdin.append('echo "\n%s %s $?"\n' % (salt, i + 1))
|
|
||||||
|
|
||||||
- output = p.communicate(input=''.join(stdin))[0]
|
|
||||||
+ output = p.communicate(input=''.join(stdin).encode('utf-8'))[0].decode('utf-8')
|
|
||||||
if p.returncode == 80:
|
|
||||||
return (refout, None, [])
|
|
||||||
|
|
||||||
@@ -336,7 +336,7 @@ def run(paths, tmpdir, shell, quiet=False, verbose=False, patchcmd=None,
|
|
||||||
log('!', 'failed\n', verbose)
|
|
||||||
if not quiet:
|
|
||||||
log('\n', None, verbose)
|
|
||||||
- errfile = open(errpath, 'w')
|
|
||||||
+ errfile = open(errpath, 'w', encoding='utf-8')
|
|
||||||
try:
|
|
||||||
for line in postout:
|
|
||||||
errfile.write(line)
|
|
|
@ -1,302 +0,0 @@
|
||||||
#!/bin/bash -
|
|
||||||
#
|
|
||||||
# File: git-archive-all.sh
|
|
||||||
#
|
|
||||||
# Description: A utility script that builds an archive file(s) of all
|
|
||||||
# git repositories and submodules in the current path.
|
|
||||||
# Useful for creating a single tarfile of a git super-
|
|
||||||
# project that contains other submodules.
|
|
||||||
#
|
|
||||||
# Examples: Use git-archive-all.sh to create archive distributions
|
|
||||||
# from git repositories. To use, simply do:
|
|
||||||
#
|
|
||||||
# cd $GIT_DIR; git-archive-all.sh
|
|
||||||
#
|
|
||||||
# where $GIT_DIR is the root of your git superproject.
|
|
||||||
#
|
|
||||||
# License: GPL3+
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
# DEBUGGING
|
|
||||||
set -e
|
|
||||||
set -C # noclobber
|
|
||||||
|
|
||||||
# TRAP SIGNALS
|
|
||||||
trap 'cleanup' QUIT EXIT
|
|
||||||
|
|
||||||
# For security reasons, explicitly set the internal field separator
|
|
||||||
# to newline, space, tab
|
|
||||||
OLD_IFS=$IFS
|
|
||||||
IFS='
|
|
||||||
'
|
|
||||||
|
|
||||||
function cleanup () {
|
|
||||||
rm -f $TMPFILE
|
|
||||||
rm -f $TOARCHIVE
|
|
||||||
IFS="$OLD_IFS"
|
|
||||||
}
|
|
||||||
|
|
||||||
function usage () {
|
|
||||||
echo "Usage is as follows:"
|
|
||||||
echo
|
|
||||||
echo "$PROGRAM <--version>"
|
|
||||||
echo " Prints the program version number on a line by itself and exits."
|
|
||||||
echo
|
|
||||||
echo "$PROGRAM <--usage|--help|-?>"
|
|
||||||
echo " Prints this usage output and exits."
|
|
||||||
echo
|
|
||||||
echo "$PROGRAM [--format <fmt>] [--prefix <path>] [--verbose|-v] [--separate|-s]"
|
|
||||||
echo " [--tree-ish|-t <tree-ish>] [output_file]"
|
|
||||||
echo " Creates an archive for the entire git superproject, and its submodules"
|
|
||||||
echo " using the passed parameters, described below."
|
|
||||||
echo
|
|
||||||
echo " If '--format' is specified, the archive is created with the named"
|
|
||||||
echo " git archiver backend. Obviously, this must be a backend that git archive"
|
|
||||||
echo " understands. The format defaults to 'tar' if not specified."
|
|
||||||
echo
|
|
||||||
echo " If '--prefix' is specified, the archive's superproject and all submodules"
|
|
||||||
echo " are created with the <path> prefix named. The default is to not use one."
|
|
||||||
echo
|
|
||||||
echo " If '--separate' or '-s' is specified, individual archives will be created"
|
|
||||||
echo " for each of the superproject itself and its submodules. The default is to"
|
|
||||||
echo " concatenate individual archives into one larger archive."
|
|
||||||
echo
|
|
||||||
echo " If '--tree-ish' is specified, the archive will be created based on whatever"
|
|
||||||
echo " you define the tree-ish to be. Branch names, commit hash, etc. are acceptable."
|
|
||||||
echo " Defaults to HEAD if not specified. See git archive's documentation for more"
|
|
||||||
echo " information on what a tree-ish is."
|
|
||||||
echo
|
|
||||||
echo " If 'output_file' is specified, the resulting archive is created as the"
|
|
||||||
echo " file named. This parameter is essentially a path that must be writeable."
|
|
||||||
echo " When combined with '--separate' ('-s') this path must refer to a directory."
|
|
||||||
echo " Without this parameter or when combined with '--separate' the resulting"
|
|
||||||
echo " archive(s) are named with a dot-separated path of the archived directory and"
|
|
||||||
echo " a file extension equal to their format (e.g., 'superdir.submodule1dir.tar')."
|
|
||||||
echo
|
|
||||||
echo " The special value '-' (single dash) is treated as STDOUT and, when used, the"
|
|
||||||
echo " --separate option is ignored. Use a double-dash to separate the outfile from"
|
|
||||||
echo " the value of previous options. For example, to write a .zip file to STDOUT:"
|
|
||||||
echo
|
|
||||||
echo " ./$PROGRAM --format zip -- -"
|
|
||||||
echo
|
|
||||||
echo " If '--verbose' or '-v' is specified, progress will be printed."
|
|
||||||
}
|
|
||||||
|
|
||||||
function version () {
|
|
||||||
echo "$PROGRAM version $VERSION"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Internal variables and initializations.
|
|
||||||
readonly PROGRAM=`basename "$0"`
|
|
||||||
readonly VERSION=0.3
|
|
||||||
|
|
||||||
SEPARATE=0
|
|
||||||
VERBOSE=0
|
|
||||||
|
|
||||||
TARCMD=`command -v gnutar || command -v tar`
|
|
||||||
FORMAT=tar
|
|
||||||
PREFIX=
|
|
||||||
TREEISH=HEAD
|
|
||||||
|
|
||||||
# RETURN VALUES/EXIT STATUS CODES
|
|
||||||
readonly E_BAD_OPTION=254
|
|
||||||
readonly E_UNKNOWN=255
|
|
||||||
|
|
||||||
# Process command-line arguments.
|
|
||||||
while test $# -gt 0; do
|
|
||||||
if [ x"$1" == x"--" ]; then
|
|
||||||
# detect argument termination
|
|
||||||
shift
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
case $1 in
|
|
||||||
--format )
|
|
||||||
shift
|
|
||||||
FORMAT="$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--prefix )
|
|
||||||
shift
|
|
||||||
PREFIX="$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--separate | -s )
|
|
||||||
shift
|
|
||||||
SEPARATE=1
|
|
||||||
;;
|
|
||||||
|
|
||||||
--tree-ish | -t )
|
|
||||||
shift
|
|
||||||
TREEISH="$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--version )
|
|
||||||
version
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
|
|
||||||
--verbose | -v )
|
|
||||||
shift
|
|
||||||
VERBOSE=1
|
|
||||||
;;
|
|
||||||
|
|
||||||
-? | --usage | --help )
|
|
||||||
usage
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
|
|
||||||
-* )
|
|
||||||
echo "Unrecognized option: $1" >&2
|
|
||||||
usage
|
|
||||||
exit $E_BAD_OPTION
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
OLD_PWD="`pwd`"
|
|
||||||
TMPDIR=${TMPDIR:-/tmp}
|
|
||||||
TMPFILE=`mktemp "$TMPDIR/$PROGRAM.XXXXXX"` # Create a place to store our work's progress
|
|
||||||
TOARCHIVE=`mktemp "$TMPDIR/$PROGRAM.toarchive.XXXXXX"`
|
|
||||||
OUT_FILE=$OLD_PWD # assume "this directory" without a name change by default
|
|
||||||
|
|
||||||
if [ ! -z "$1" ]; then
|
|
||||||
OUT_FILE="$1"
|
|
||||||
if [ "-" == $OUT_FILE ]; then
|
|
||||||
SEPARATE=0
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Validate parameters; error early, error often.
|
|
||||||
if [ "-" == $OUT_FILE -o $SEPARATE -ne 1 ] && [ "$FORMAT" == "tar" -a `$TARCMD --help | grep -q -- "--concatenate"; echo $?` -ne 0 ]; then
|
|
||||||
echo "Your 'tar' does not support the '--concatenate' option, which we need"
|
|
||||||
echo "to produce a single tarfile. Either install a compatible tar (such as"
|
|
||||||
echo "gnutar), or invoke $PROGRAM with the '--separate' option."
|
|
||||||
exit
|
|
||||||
elif [ $SEPARATE -eq 1 -a ! -d $OUT_FILE ]; then
|
|
||||||
echo "When creating multiple archives, your destination must be a directory."
|
|
||||||
echo "If it's not, you risk being surprised when your files are overwritten."
|
|
||||||
exit
|
|
||||||
elif [ `git config -l | grep -q '^core\.bare=false'; echo $?` -ne 0 ]; then
|
|
||||||
echo "$PROGRAM must be run from a git working copy (i.e., not a bare repository)."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create the superproject's git-archive
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo -n "creating superproject archive..."
|
|
||||||
fi
|
|
||||||
git archive --format=$FORMAT --prefix="$PREFIX" $TREEISH > $TMPDIR/$(basename "$(pwd)").$FORMAT
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo "done"
|
|
||||||
fi
|
|
||||||
echo $TMPDIR/$(basename "$(pwd)").$FORMAT >| $TMPFILE # clobber on purpose
|
|
||||||
superfile=`head -n 1 $TMPFILE`
|
|
||||||
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo -n "looking for subprojects..."
|
|
||||||
fi
|
|
||||||
# find all '.git' dirs, these show us the remaining to-be-archived dirs
|
|
||||||
# we only want directories that are below the current directory
|
|
||||||
find . -mindepth 2 -name '.git' -type d -print | sed -e 's/^\.\///' -e 's/\.git$//' >> $TOARCHIVE
|
|
||||||
# as of version 1.7.8, git places the submodule .git directories under the superprojects .git dir
|
|
||||||
# the submodules get a .git file that points to their .git dir. we need to find all of these too
|
|
||||||
find . -mindepth 2 -name '.git' -type f -print | xargs grep -l "gitdir" | sed -e 's/^\.\///' -e 's/\.git$//' >> $TOARCHIVE
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo "done"
|
|
||||||
echo " found:"
|
|
||||||
cat $TOARCHIVE | while read arch
|
|
||||||
do
|
|
||||||
echo " $arch"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo -n "archiving submodules..."
|
|
||||||
fi
|
|
||||||
while read path; do
|
|
||||||
TREEISH=$(git submodule | grep "^ .*${path%/} " | cut -d ' ' -f 2) # git submodule does not list trailing slashes in $path
|
|
||||||
cd "$path"
|
|
||||||
git archive --format=$FORMAT --prefix="${PREFIX}$path" ${TREEISH:-HEAD} > "$TMPDIR"/"$(echo "$path" | sed -e 's/\//./g')"$FORMAT
|
|
||||||
if [ $FORMAT == 'zip' ]; then
|
|
||||||
# delete the empty directory entry; zipped submodules won't unzip if we don't do this
|
|
||||||
zip -d "$(tail -n 1 $TMPFILE)" "${PREFIX}${path%/}" >/dev/null # remove trailing '/'
|
|
||||||
fi
|
|
||||||
echo "$TMPDIR"/"$(echo "$path" | sed -e 's/\//./g')"$FORMAT >> $TMPFILE
|
|
||||||
cd "$OLD_PWD"
|
|
||||||
done < $TOARCHIVE
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo "done"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo -n "concatenating archives into single archive..."
|
|
||||||
fi
|
|
||||||
# Concatenate archives into a super-archive.
|
|
||||||
if [ $SEPARATE -eq 0 -o "-" == $OUT_FILE ]; then
|
|
||||||
if [ $FORMAT == 'tar.gz' ]; then
|
|
||||||
gunzip $superfile
|
|
||||||
superfile=${superfile:0: -3} # Remove '.gz'
|
|
||||||
sed -e '1d' $TMPFILE | while read file; do
|
|
||||||
gunzip $file
|
|
||||||
file=${file:0: -3}
|
|
||||||
$TARCMD --concatenate -f "$superfile" "$file" && rm -f "$file"
|
|
||||||
done
|
|
||||||
gzip $superfile
|
|
||||||
superfile=$superfile.gz
|
|
||||||
elif [ $FORMAT == 'tar' ]; then
|
|
||||||
sed -e '1d' $TMPFILE | while read file; do
|
|
||||||
$TARCMD --concatenate -f "$superfile" "$file" && rm -f "$file"
|
|
||||||
done
|
|
||||||
elif [ $FORMAT == 'zip' ]; then
|
|
||||||
sed -e '1d' $TMPFILE | while read file; do
|
|
||||||
# zip incorrectly stores the full path, so cd and then grow
|
|
||||||
cd `dirname "$file"`
|
|
||||||
zip -g "$superfile" `basename "$file"` && rm -f "$file"
|
|
||||||
done
|
|
||||||
cd "$OLD_PWD"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$superfile" >| $TMPFILE # clobber on purpose
|
|
||||||
fi
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo "done"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo -n "moving archive to $OUT_FILE..."
|
|
||||||
fi
|
|
||||||
while read file; do
|
|
||||||
if [ "-" == $OUT_FILE ]; then
|
|
||||||
cat "$file" && rm -f "$file"
|
|
||||||
else
|
|
||||||
mv "$file" "$OUT_FILE"
|
|
||||||
fi
|
|
||||||
done < $TMPFILE
|
|
||||||
if [ $VERBOSE -eq 1 ]; then
|
|
||||||
echo "done"
|
|
||||||
fi
|
|
|
@ -1,229 +0,0 @@
|
||||||
# Sample script to install Python and pip under Windows
|
|
||||||
# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer
|
|
||||||
# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
|
|
||||||
|
|
||||||
$MINICONDA_URL = "http://repo.continuum.io/miniconda/"
|
|
||||||
$BASE_URL = "https://www.python.org/ftp/python/"
|
|
||||||
$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py"
|
|
||||||
$GET_PIP_PATH = "C:\get-pip.py"
|
|
||||||
|
|
||||||
$PYTHON_PRERELEASE_REGEX = @"
|
|
||||||
(?x)
|
|
||||||
(?<major>\d+)
|
|
||||||
\.
|
|
||||||
(?<minor>\d+)
|
|
||||||
\.
|
|
||||||
(?<micro>\d+)
|
|
||||||
(?<prerelease>[a-z]{1,2}\d+)
|
|
||||||
"@
|
|
||||||
|
|
||||||
|
|
||||||
function Download ($filename, $url) {
|
|
||||||
$webclient = New-Object System.Net.WebClient
|
|
||||||
|
|
||||||
$basedir = $pwd.Path + "\"
|
|
||||||
$filepath = $basedir + $filename
|
|
||||||
if (Test-Path $filename) {
|
|
||||||
Write-Host "Reusing" $filepath
|
|
||||||
return $filepath
|
|
||||||
}
|
|
||||||
|
|
||||||
# Download and retry up to 3 times in case of network transient errors.
|
|
||||||
Write-Host "Downloading" $filename "from" $url
|
|
||||||
$retry_attempts = 2
|
|
||||||
for ($i = 0; $i -lt $retry_attempts; $i++) {
|
|
||||||
try {
|
|
||||||
$webclient.DownloadFile($url, $filepath)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
Catch [Exception]{
|
|
||||||
Start-Sleep 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Test-Path $filepath) {
|
|
||||||
Write-Host "File saved at" $filepath
|
|
||||||
} else {
|
|
||||||
# Retry once to get the error message if any at the last try
|
|
||||||
$webclient.DownloadFile($url, $filepath)
|
|
||||||
}
|
|
||||||
return $filepath
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function ParsePythonVersion ($python_version) {
|
|
||||||
if ($python_version -match $PYTHON_PRERELEASE_REGEX) {
|
|
||||||
return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro,
|
|
||||||
$matches.prerelease)
|
|
||||||
}
|
|
||||||
$version_obj = [version]$python_version
|
|
||||||
return ($version_obj.major, $version_obj.minor, $version_obj.build, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function DownloadPython ($python_version, $platform_suffix) {
|
|
||||||
$major, $minor, $micro, $prerelease = ParsePythonVersion $python_version
|
|
||||||
|
|
||||||
if (($major -le 2 -and $micro -eq 0) `
|
|
||||||
-or ($major -eq 3 -and $minor -le 2 -and $micro -eq 0) `
|
|
||||||
) {
|
|
||||||
$dir = "$major.$minor"
|
|
||||||
$python_version = "$major.$minor$prerelease"
|
|
||||||
} else {
|
|
||||||
$dir = "$major.$minor.$micro"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($prerelease) {
|
|
||||||
if (($major -le 2) `
|
|
||||||
-or ($major -eq 3 -and $minor -eq 1) `
|
|
||||||
-or ($major -eq 3 -and $minor -eq 2) `
|
|
||||||
-or ($major -eq 3 -and $minor -eq 3) `
|
|
||||||
) {
|
|
||||||
$dir = "$dir/prev"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($major -le 2) -or ($major -le 3 -and $minor -le 4)) {
|
|
||||||
$ext = "msi"
|
|
||||||
if ($platform_suffix) {
|
|
||||||
$platform_suffix = ".$platform_suffix"
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$ext = "exe"
|
|
||||||
if ($platform_suffix) {
|
|
||||||
$platform_suffix = "-$platform_suffix"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$filename = "python-$python_version$platform_suffix.$ext"
|
|
||||||
$url = "$BASE_URL$dir/$filename"
|
|
||||||
$filepath = Download $filename $url
|
|
||||||
return $filepath
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function InstallPython ($python_version, $architecture, $python_home) {
|
|
||||||
Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
|
|
||||||
if (Test-Path $python_home) {
|
|
||||||
Write-Host $python_home "already exists, skipping."
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
if ($architecture -eq "32") {
|
|
||||||
$platform_suffix = ""
|
|
||||||
} else {
|
|
||||||
$platform_suffix = "amd64"
|
|
||||||
}
|
|
||||||
$installer_path = DownloadPython $python_version $platform_suffix
|
|
||||||
$installer_ext = [System.IO.Path]::GetExtension($installer_path)
|
|
||||||
Write-Host "Installing $installer_path to $python_home"
|
|
||||||
$install_log = $python_home + ".log"
|
|
||||||
if ($installer_ext -eq '.msi') {
|
|
||||||
InstallPythonMSI $installer_path $python_home $install_log
|
|
||||||
} else {
|
|
||||||
InstallPythonEXE $installer_path $python_home $install_log
|
|
||||||
}
|
|
||||||
if (Test-Path $python_home) {
|
|
||||||
Write-Host "Python $python_version ($architecture) installation complete"
|
|
||||||
} else {
|
|
||||||
Write-Host "Failed to install Python in $python_home"
|
|
||||||
Get-Content -Path $install_log
|
|
||||||
Exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function InstallPythonEXE ($exepath, $python_home, $install_log) {
|
|
||||||
$install_args = "/quiet InstallAllUsers=1 TargetDir=$python_home"
|
|
||||||
RunCommand $exepath $install_args
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function InstallPythonMSI ($msipath, $python_home, $install_log) {
|
|
||||||
$install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home"
|
|
||||||
$uninstall_args = "/qn /x $msipath"
|
|
||||||
RunCommand "msiexec.exe" $install_args
|
|
||||||
if (-not(Test-Path $python_home)) {
|
|
||||||
Write-Host "Python seems to be installed else-where, reinstalling."
|
|
||||||
RunCommand "msiexec.exe" $uninstall_args
|
|
||||||
RunCommand "msiexec.exe" $install_args
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function RunCommand ($command, $command_args) {
|
|
||||||
Write-Host $command $command_args
|
|
||||||
Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function InstallPip ($python_home) {
|
|
||||||
$pip_path = $python_home + "\Scripts\pip.exe"
|
|
||||||
$python_path = $python_home + "\python.exe"
|
|
||||||
if (-not(Test-Path $pip_path)) {
|
|
||||||
Write-Host "Installing pip..."
|
|
||||||
$webclient = New-Object System.Net.WebClient
|
|
||||||
$webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH)
|
|
||||||
Write-Host "Executing:" $python_path $GET_PIP_PATH
|
|
||||||
& $python_path $GET_PIP_PATH
|
|
||||||
} else {
|
|
||||||
Write-Host "pip already installed."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function DownloadMiniconda ($python_version, $platform_suffix) {
|
|
||||||
if ($python_version -eq "3.4") {
|
|
||||||
$filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe"
|
|
||||||
} else {
|
|
||||||
$filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe"
|
|
||||||
}
|
|
||||||
$url = $MINICONDA_URL + $filename
|
|
||||||
$filepath = Download $filename $url
|
|
||||||
return $filepath
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function InstallMiniconda ($python_version, $architecture, $python_home) {
|
|
||||||
Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
|
|
||||||
if (Test-Path $python_home) {
|
|
||||||
Write-Host $python_home "already exists, skipping."
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
if ($architecture -eq "32") {
|
|
||||||
$platform_suffix = "x86"
|
|
||||||
} else {
|
|
||||||
$platform_suffix = "x86_64"
|
|
||||||
}
|
|
||||||
$filepath = DownloadMiniconda $python_version $platform_suffix
|
|
||||||
Write-Host "Installing" $filepath "to" $python_home
|
|
||||||
$install_log = $python_home + ".log"
|
|
||||||
$args = "/S /D=$python_home"
|
|
||||||
Write-Host $filepath $args
|
|
||||||
Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru
|
|
||||||
if (Test-Path $python_home) {
|
|
||||||
Write-Host "Python $python_version ($architecture) installation complete"
|
|
||||||
} else {
|
|
||||||
Write-Host "Failed to install Python in $python_home"
|
|
||||||
Get-Content -Path $install_log
|
|
||||||
Exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function InstallMinicondaPip ($python_home) {
|
|
||||||
$pip_path = $python_home + "\Scripts\pip.exe"
|
|
||||||
$conda_path = $python_home + "\Scripts\conda.exe"
|
|
||||||
if (-not(Test-Path $pip_path)) {
|
|
||||||
Write-Host "Installing pip..."
|
|
||||||
$args = "install --yes pip"
|
|
||||||
Write-Host $conda_path $args
|
|
||||||
Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru
|
|
||||||
} else {
|
|
||||||
Write-Host "pip already installed."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function main () {
|
|
||||||
InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
|
|
||||||
InstallPip $env:PYTHON
|
|
||||||
}
|
|
||||||
|
|
||||||
main
|
|
|
@ -1,48 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Provide the canonicalize filename (physical filename with out any symlinks)
|
|
||||||
# like the GNU version readlink with the -f option regardless of the version of
|
|
||||||
# readlink (GNU or BSD).
|
|
||||||
|
|
||||||
# This file is part of a set of unofficial pre-commit hooks available
|
|
||||||
# at github.
|
|
||||||
# Link: https://github.com/githubbrowser/Pre-commit-hooks
|
|
||||||
# Contact: David Martin, david.martin.mailbox@googlemail.com
|
|
||||||
|
|
||||||
###########################################################
|
|
||||||
# There should be no need to change anything below this line.
|
|
||||||
|
|
||||||
# Canonicalize by recursively following every symlink in every component of the
|
|
||||||
# specified filename. This should reproduce the results of the GNU version of
|
|
||||||
# readlink with the -f option.
|
|
||||||
#
|
|
||||||
# Reference: http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
|
|
||||||
canonicalize_filename () {
|
|
||||||
local target_file="$1"
|
|
||||||
local physical_directory=""
|
|
||||||
local result=""
|
|
||||||
|
|
||||||
# Need to restore the working directory after work.
|
|
||||||
local working_dir="`pwd`"
|
|
||||||
|
|
||||||
cd -- "$(dirname -- "$target_file")"
|
|
||||||
target_file="$(basename -- "$target_file")"
|
|
||||||
|
|
||||||
# Iterate down a (possible) chain of symlinks
|
|
||||||
while [ -L "$target_file" ]
|
|
||||||
do
|
|
||||||
target_file="$(readlink -- "$target_file")"
|
|
||||||
cd -- "$(dirname -- "$target_file")"
|
|
||||||
target_file="$(basename -- "$target_file")"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Compute the canonicalized name by finding the physical path
|
|
||||||
# for the directory we're in and appending the target file.
|
|
||||||
physical_directory="`pwd -P`"
|
|
||||||
result="$physical_directory/$target_file"
|
|
||||||
|
|
||||||
# restore the working directory after work.
|
|
||||||
cd -- "$working_dir"
|
|
||||||
|
|
||||||
echo "$result"
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
rm -Rf .git/hooks
|
|
||||||
ln -s ../.githooks .git/hooks
|
|
|
@ -1,171 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# git pre-commit hook that runs an Uncrustify stylecheck.
|
|
||||||
# Features:
|
|
||||||
# - abort commit when commit does not comply with the style guidelines
|
|
||||||
# - create a patch of the proposed style changes
|
|
||||||
#
|
|
||||||
# More info on Uncrustify: http://uncrustify.sourceforge.net/
|
|
||||||
|
|
||||||
# This file is part of a set of unofficial pre-commit hooks available
|
|
||||||
# at github.
|
|
||||||
# Link: https://github.com/githubbrowser/Pre-commit-hooks
|
|
||||||
# Contact: David Martin, david.martin.mailbox@googlemail.com
|
|
||||||
|
|
||||||
|
|
||||||
##################################################################
|
|
||||||
# CONFIGURATION
|
|
||||||
# set uncrustify path or executable
|
|
||||||
# UNCRUSTIFY="/usr/bin/uncrustify"
|
|
||||||
UNCRUSTIFY="uncrustify"
|
|
||||||
|
|
||||||
# set uncrustify config location
|
|
||||||
# CONFIG="/home/user/.config/uncrustify.cfg"
|
|
||||||
CONFIG=".uncrustify.cfg"
|
|
||||||
|
|
||||||
# the source language: C, CPP, D, CS, JAVA, PAWN, VALA, OC, OC+
|
|
||||||
# use AUTO to let Uncrustify decide which language a given file uses.
|
|
||||||
# the detected language is printed to the console when Uncrustify is called.
|
|
||||||
# override if the automatic detection seems off.
|
|
||||||
# SOURCE_LANGUAGE="AUTO"
|
|
||||||
SOURCE_LANGUAGE="AUTO"
|
|
||||||
|
|
||||||
# remove any older patches from previous commits. Set to true or false.
|
|
||||||
# DELETE_OLD_PATCHES=false
|
|
||||||
DELETE_OLD_PATCHES=false
|
|
||||||
|
|
||||||
# only parse files with the extensions in FILE_EXTS. Set to true or false.
|
|
||||||
# if false every changed file in the commit will be parsed with Uncrustify.
|
|
||||||
# if true only files matching one of the extensions are parsed with Uncrustify.
|
|
||||||
# PARSE_EXTS=true
|
|
||||||
PARSE_EXTS=true
|
|
||||||
|
|
||||||
# file types to parse. Only effective when PARSE_EXTS is true.
|
|
||||||
# FILE_EXTS=".c .h .cpp .hpp"
|
|
||||||
FILE_EXTS=".c .h .cc .hh .cpp .hpp .hxx"
|
|
||||||
|
|
||||||
##################################################################
|
|
||||||
# There should be no need to change anything below this line.
|
|
||||||
|
|
||||||
. "$(dirname -- "$0")/canonicalize_filename.sh"
|
|
||||||
|
|
||||||
# exit on error
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# check whether the given file matches any of the set extensions
|
|
||||||
matches_extension() {
|
|
||||||
local filename="$(basename -- "$1")"
|
|
||||||
local extension=".${filename##*.}"
|
|
||||||
local ext
|
|
||||||
|
|
||||||
for ext in $FILE_EXTS; do [ "$ext" = "$extension" ] && return 0; done
|
|
||||||
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# necessary check for initial commit
|
|
||||||
if git rev-parse --verify HEAD >/dev/null 2>&1 ; then
|
|
||||||
against=HEAD
|
|
||||||
else
|
|
||||||
# Initial commit: diff against an empty tree object
|
|
||||||
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
|
|
||||||
fi
|
|
||||||
|
|
||||||
# make sure the config file and executable are correctly set
|
|
||||||
if [ ! -f "$CONFIG" ] ; then
|
|
||||||
printf "Error: uncrustify config file not found.\n"
|
|
||||||
printf "Set the correct path in $(canonicalize_filename "$0").\n"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! command -v "$UNCRUSTIFY" > /dev/null ; then
|
|
||||||
printf "Error: uncrustify executable not found.\n"
|
|
||||||
printf "Set the correct path in $(canonicalize_filename "$0").\n"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# create a filename to store our generated patch
|
|
||||||
prefix="pre-commit-uncrustify"
|
|
||||||
suffix="$(date +%C%y-%m-%d_%Hh%Mm%Ss)"
|
|
||||||
patch="/tmp/$prefix-$suffix.patch"
|
|
||||||
diff="/tmp/$prefix-$suffix.diff"
|
|
||||||
|
|
||||||
# clean up any older uncrustify patches
|
|
||||||
$DELETE_OLD_PATCHES && rm -f /tmp/$prefix*.patch
|
|
||||||
|
|
||||||
# create one patch containing all changes to the files
|
|
||||||
# sed to remove quotes around the filename, if inserted by the system
|
|
||||||
# (done sometimes, if the filename contains special characters, like the quote itself)
|
|
||||||
git diff-index --cached --diff-filter=ACMR --name-only $against -- | \
|
|
||||||
sed -e 's/^"\(.*\)"$/\1/' | \
|
|
||||||
while read file
|
|
||||||
do
|
|
||||||
# ignore file if we do check for file extensions and the file
|
|
||||||
# does not match any of the extensions specified in $FILE_EXTS
|
|
||||||
if $PARSE_EXTS && ! matches_extension "$file"; then
|
|
||||||
continue;
|
|
||||||
fi
|
|
||||||
|
|
||||||
# escape special characters in the source filename:
|
|
||||||
# - '\': backslash needs to be escaped
|
|
||||||
# - '*': used as matching string => '*' would mean expansion
|
|
||||||
# (curiously, '?' must not be escaped)
|
|
||||||
# - '[': used as matching string => '[' would mean start of set
|
|
||||||
# - '|': used as sed split char instead of '/', so it needs to be escaped
|
|
||||||
# in the filename
|
|
||||||
# printf %s particularly important if the filename contains the % character
|
|
||||||
file_escaped_source=$(printf "%s" "$file" | sed -e 's/[\*[|]/\\&/g')
|
|
||||||
|
|
||||||
# escape special characters in the target filename:
|
|
||||||
# phase 1 (characters escaped in the output diff):
|
|
||||||
# - '\': backslash needs to be escaped in the output diff
|
|
||||||
# - '"': quote needs to be escaped in the output diff if present inside
|
|
||||||
# of the filename, as it used to bracket the entire filename part
|
|
||||||
# phase 2 (characters escaped in the match replacement):
|
|
||||||
# - '\': backslash needs to be escaped again for sed itself
|
|
||||||
# (i.e. double escaping after phase 1)
|
|
||||||
# - '&': would expand to matched string
|
|
||||||
# - '|': used as sed split char instead of '/'
|
|
||||||
# printf %s particularly important if the filename contains the % character
|
|
||||||
file_escaped_target=$(printf "%s" "$file" | sed -e 's/[\"]/\\&/g' -e 's/[\&|]/\\&/g')
|
|
||||||
|
|
||||||
# Uncrustify detects the language automatically if it is not specified
|
|
||||||
language_option=""
|
|
||||||
if [ "$SOURCE_LANGUAGE" != "AUTO" ] ; then
|
|
||||||
language_option="-l $SOURCE_LANGUAGE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# uncrustify our sourcefile, create a patch with diff and append it to our $patch
|
|
||||||
# The sed call is necessary to transform the patch from
|
|
||||||
# --- $file timestamp
|
|
||||||
# +++ - timestamp
|
|
||||||
# to both lines working on the same file and having a a/ and b/ prefix.
|
|
||||||
# Else it can not be applied with 'git apply'.
|
|
||||||
"$UNCRUSTIFY" -q -c "$CONFIG" -f "$file" $language_option | \
|
|
||||||
git --no-pager diff --color=always --no-index -- "$file" - | \
|
|
||||||
tail -n +3 | \
|
|
||||||
sed -e "1s|--- a/$file_escaped_source|--- \"a/$file_escaped_target\"|" \
|
|
||||||
-e "2s|+++ b/-|+++ \"b/$file_escaped_target\"|" | \
|
|
||||||
tee -a "$diff" | \
|
|
||||||
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" >> "$patch"
|
|
||||||
done
|
|
||||||
|
|
||||||
# if no patch has been generated all is ok, clean up the file stub and exit
|
|
||||||
if [ ! -s "$patch" ] ; then
|
|
||||||
printf "Files in this commit comply with the uncrustify rules.\n"
|
|
||||||
rm -f "$patch"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# a patch has been created, notify the user and exit
|
|
||||||
printf "\nThe following differences were found between the code to commit "
|
|
||||||
printf "and the uncrustify rules:\n\n"
|
|
||||||
cat "$diff"
|
|
||||||
rm -f "$diff"
|
|
||||||
|
|
||||||
printf "\nYou can apply these changes with:\n git apply $patch\n"
|
|
||||||
printf "(may need to be called from the root directory of your repository)\n"
|
|
||||||
printf "Aborting commit. Apply changes and commit again or skip checking with"
|
|
||||||
printf " --no-verify (not recommended).\n"
|
|
||||||
|
|
||||||
exit 1
|
|
38
.gitignore
vendored
|
@ -1,38 +0,0 @@
|
||||||
*
|
|
||||||
!*/
|
|
||||||
|
|
||||||
!.gitignore
|
|
||||||
!.bumpversion.cfg
|
|
||||||
!.ci/*
|
|
||||||
!.cmake/*
|
|
||||||
|
|
||||||
!dev/*
|
|
||||||
!doc/*
|
|
||||||
|
|
||||||
!*.c
|
|
||||||
!*.m
|
|
||||||
!*.cc
|
|
||||||
!*.h
|
|
||||||
!*.hxx
|
|
||||||
!*.rst
|
|
||||||
!*.po
|
|
||||||
!*.in
|
|
||||||
!*.t
|
|
||||||
!*.proto
|
|
||||||
!.cmake/Modules/*.cmake
|
|
||||||
!samples/tests/*.sh
|
|
||||||
!samples/**/*.expected
|
|
||||||
|
|
||||||
!LICENSE
|
|
||||||
!HEADER
|
|
||||||
!ChangeLog
|
|
||||||
|
|
||||||
CMakeFiles/
|
|
||||||
!CMakeLists.txt
|
|
||||||
|
|
||||||
src/config.h
|
|
||||||
build
|
|
||||||
|
|
||||||
*~
|
|
||||||
*.swp
|
|
||||||
.*.swp
|
|
24
.gitmodules
vendored
|
@ -1,24 +0,0 @@
|
||||||
[submodule "dependencies/libcsptr"]
|
|
||||||
path = dependencies/libcsptr
|
|
||||||
url = https://github.com/Snaipe/libcsptr.git
|
|
||||||
[submodule "dependencies/dyncall"]
|
|
||||||
path = dependencies/dyncall
|
|
||||||
url = https://github.com/Snaipe/dyncall.git
|
|
||||||
[submodule "dependencies/wingetopt"]
|
|
||||||
path = dependencies/wingetopt
|
|
||||||
url = https://github.com/alex85k/wingetopt.git
|
|
||||||
[submodule "dependencies/klib"]
|
|
||||||
path = dependencies/klib
|
|
||||||
url = https://github.com/attractivechaos/klib.git
|
|
||||||
[submodule "dependencies/nanopb"]
|
|
||||||
path = dependencies/nanopb
|
|
||||||
url = https://github.com/nanopb/nanopb.git
|
|
||||||
[submodule "dependencies/nanomsg"]
|
|
||||||
path = dependencies/nanomsg
|
|
||||||
url = https://github.com/nanomsg/nanomsg.git
|
|
||||||
[submodule "dependencies/debugbreak"]
|
|
||||||
path = dependencies/debugbreak
|
|
||||||
url = https://github.com/scottt/debugbreak
|
|
||||||
[submodule "dependencies/boxfort"]
|
|
||||||
path = dependencies/boxfort
|
|
||||||
url = https://github.com/Snaipe/BoxFort
|
|
172
.travis.yml
|
@ -1,172 +0,0 @@
|
||||||
language: c
|
|
||||||
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
_anchors:
|
|
||||||
- &gcc49-packages
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- gcc-4.9
|
|
||||||
- g++-4.9
|
|
||||||
- gobjc-4.9
|
|
||||||
- gnustep-devel
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
# Style check
|
|
||||||
- compiler: uncrustify
|
|
||||||
language: cpp
|
|
||||||
before_install:
|
|
||||||
- if [[ "$TRAVIS_PULL_REQUEST" == false ]]; then exit 0; fi
|
|
||||||
- |
|
|
||||||
git clone https://github.com/uncrustify/uncrustify /tmp/uncrustify &&
|
|
||||||
pushd /tmp/uncrustify &&
|
|
||||||
git checkout -q 7ae7af9d3483f5f92766ec41bb3ba3efe4747494 &&
|
|
||||||
mkdir build && cd build &&
|
|
||||||
CC=gcc CXX=g++ cmake -DCMAKE_INSTALL_PREFIX=$HOME .. &&
|
|
||||||
make -j4 && make install &&
|
|
||||||
export PATH="$PATH:$HOME/bin" &&
|
|
||||||
popd
|
|
||||||
- >
|
|
||||||
export SOURCES=$(find src include test samples \( \
|
|
||||||
-type f \( \
|
|
||||||
-iname "*.c" -or \
|
|
||||||
-iname "*.h" -or \
|
|
||||||
-iname "*.cc" -or \
|
|
||||||
-iname "*.hxx" \
|
|
||||||
\) -and -not \
|
|
||||||
-iname "*.pb.*" \))
|
|
||||||
- export STYLE_OK=true
|
|
||||||
script:
|
|
||||||
- >
|
|
||||||
for f in $SOURCES; do
|
|
||||||
if ! uncrustify -q --check -c .uncrustify.cfg $f; then
|
|
||||||
uncrustify -q -c .uncrustify.cfg -f $f | git --no-pager diff --no-index --color=always $f -
|
|
||||||
export STYLE_OK=false
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
- $STYLE_OK
|
|
||||||
after_success:
|
|
||||||
- echo "Style check passed."
|
|
||||||
|
|
||||||
# Linux Debug, GCC 4.9
|
|
||||||
- compiler: gcc-4.9
|
|
||||||
addons: *gcc49-packages
|
|
||||||
env:
|
|
||||||
CONFIGURATION: Debug
|
|
||||||
GCOV: gcov-4.9
|
|
||||||
COVERAGE: "ON"
|
|
||||||
# Linux RelWithDebInfo, GCC 4.9
|
|
||||||
- compiler: gcc-4.9
|
|
||||||
addons: *gcc49-packages
|
|
||||||
env:
|
|
||||||
CONFIGURATION: RelWithDebInfo
|
|
||||||
DEPLOY: true
|
|
||||||
# Linux Debug, GCC 4.6
|
|
||||||
- compiler: gcc
|
|
||||||
env: CONFIGURATION=Debug TESTS=OFF
|
|
||||||
# Linux RelWithDebInfo, GCC 4.6
|
|
||||||
- compiler: gcc
|
|
||||||
env:
|
|
||||||
- CONFIGURATION=RelWithDebInfo
|
|
||||||
- TESTS=OFF
|
|
||||||
# Coverity token
|
|
||||||
- secure: >-
|
|
||||||
n6BHG86ISeYSAVE/i7m1K+XVW0j8PrJ5JxoJwhAGBb1
|
|
||||||
hkCn9sWybGo1HzZsf7rxpkQh/5Va4i+eyOrUt7VWAuF
|
|
||||||
EJN2+mEWqERkWZxiXrS3N9xi74cPFI79eDOTFnPm13e
|
|
||||||
diUX8Ts+IuFy890+tsNHqkEn055l6yOVMtj1LWWtRs=
|
|
||||||
# OSX Debug, GCC 4.9
|
|
||||||
- os: osx
|
|
||||||
compiler: gcc-4.9
|
|
||||||
env:
|
|
||||||
CONFIGURATION: Debug
|
|
||||||
GCOV: gcov-4.9
|
|
||||||
COVERAGE: "ON"
|
|
||||||
# OSX RelWithDebInfo, GCC 4.9
|
|
||||||
- os: osx
|
|
||||||
compiler: gcc-4.9
|
|
||||||
env: CONFIGURATION=RelWithDebInfo
|
|
||||||
# OSX Debug, Clang
|
|
||||||
- os: osx
|
|
||||||
compiler: clang
|
|
||||||
env:
|
|
||||||
CONFIGURATION: Debug
|
|
||||||
# OSX RelWithDebInfo, Clang
|
|
||||||
- os: osx
|
|
||||||
compiler: clang
|
|
||||||
env:
|
|
||||||
CONFIGURATION: RelWithDebInfo
|
|
||||||
DEPLOY: true
|
|
||||||
|
|
||||||
allow_failures:
|
|
||||||
- compiler: gcc
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- |
|
|
||||||
if [ "${TESTS:-ON}" = "ON" ]; then
|
|
||||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
|
||||||
export PATH="$(python -m site --user-base)/bin:$PATH"
|
|
||||||
fi
|
|
||||||
travis_retry pip install --user cram==0.7
|
|
||||||
fi
|
|
||||||
- export CXX=${CC/gcc/g++}; export CXX=${CXX/clang/clang++}
|
|
||||||
- $CC --version
|
|
||||||
- $CXX --version
|
|
||||||
|
|
||||||
script:
|
|
||||||
- mkdir -p build && cd $_
|
|
||||||
- >
|
|
||||||
cmake
|
|
||||||
-Wno-dev
|
|
||||||
-DCTESTS=${TESTS:-ON}
|
|
||||||
-DCOVERALLS=${COVERAGE:-OFF}
|
|
||||||
-DCMAKE_BUILD_TYPE=${CONFIGURATION}
|
|
||||||
-DCMAKE_INSTALL_PREFIX=criterion-${TRAVIS_TAG}
|
|
||||||
${CMAKE_OPTS}
|
|
||||||
..
|
|
||||||
- |
|
|
||||||
if [ "${TESTS:-ON}" = "ON" ]; then
|
|
||||||
TERM=dumb cmake --build . --target criterion_tests -- -j4
|
|
||||||
ctest --output-on-failure -j4 --timeout=20
|
|
||||||
else
|
|
||||||
TERM=dumb cmake --build . -- -j4
|
|
||||||
fi
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- |
|
|
||||||
if [ "$COVERAGE" = "ON" ]; then
|
|
||||||
make gcov
|
|
||||||
bash <(curl -s https://codecov.io/bash)
|
|
||||||
fi
|
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
- make install
|
|
||||||
- tar -cvjf criterion-${TRAVIS_TAG}-${TRAVIS_OS_NAME}-x86_64.tar.bz2 criterion-${TRAVIS_TAG}
|
|
||||||
- cd ..
|
|
||||||
- ./.cmake/git-archive-all.sh --prefix criterion-${TRAVIS_TAG} criterion-${TRAVIS_TAG}.tar && bzip2 $_
|
|
||||||
|
|
||||||
addons:
|
|
||||||
coverity_scan:
|
|
||||||
project:
|
|
||||||
name: "Snaipe/Criterion"
|
|
||||||
description: "A KISS, Cross-platform C unit testing framework"
|
|
||||||
notification_email: franklinmathieu@gmail.com
|
|
||||||
build_command_prepend: "cmake ."
|
|
||||||
build_command: "make -j4"
|
|
||||||
branch_pattern: coverity_scan
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: releases
|
|
||||||
skip_cleanup: true
|
|
||||||
api_key:
|
|
||||||
secure: d3l2Ohb2FF3tSXku1d0ASR5dntdnQ48Jyc39IEloDBxFXCselCkYruUQv6p0TA3P+Dmrz4wS7/AFlBMMsQ3XfGFVIOnITiTaGWg5fEpIf7zYsDf0zECPE0MOHMGqJMn3/SrSKdtEA4N84Q4JS7Ou+ewG65mxUDO5Ce60OoEG5JA=
|
|
||||||
file:
|
|
||||||
- criterion-${TRAVIS_TAG}-${TRAVIS_OS_NAME}-x86_64.tar.bz2
|
|
||||||
- criterion-${TRAVIS_TAG}.tar.bz2
|
|
||||||
on:
|
|
||||||
repo: Snaipe/Criterion
|
|
||||||
tags: true
|
|
||||||
condition: $DEPLOY = true
|
|
239
.uncrustify.cfg
|
@ -1,239 +0,0 @@
|
||||||
#
|
|
||||||
# uncrustify config file (initially based on the linux kernel coding style)
|
|
||||||
#
|
|
||||||
|
|
||||||
input_tab_size = 4 # original tab size
|
|
||||||
output_tab_size = 4 # new tab size
|
|
||||||
|
|
||||||
newlines = lf # \n
|
|
||||||
|
|
||||||
utf8_force = true
|
|
||||||
utf8_bom = remove
|
|
||||||
|
|
||||||
# Indent
|
|
||||||
|
|
||||||
indent_with_tabs = 0 # 1=indent to level only, 2=indent with tabs
|
|
||||||
indent_columns = 4 # indents are 4 cols
|
|
||||||
indent_continue = 8 # line continuations are indented by 8 columns
|
|
||||||
indent_label = -4 # pos: absolute col, neg: relative column
|
|
||||||
indent_xml_string = 2 # embedded XML indents are 2 cols
|
|
||||||
indent_ctor_init = 4 # indent c++ ctor initializer list
|
|
||||||
indent_switch_case = 4 # indent 'case' inside switch statements
|
|
||||||
indent_namespace = false
|
|
||||||
indent_extern = false
|
|
||||||
indent_class = false
|
|
||||||
indent_class_colon = true
|
|
||||||
indent_access_spec_body = true
|
|
||||||
|
|
||||||
# Newlines
|
|
||||||
|
|
||||||
nl_max = 2 # no duplicate blank lines
|
|
||||||
nl_func_paren = remove # "int foo()" vs "int foo\n()"
|
|
||||||
nl_func_decl_start = ignore
|
|
||||||
nl_func_decl_empty = remove
|
|
||||||
nl_func_decl_args = ignore
|
|
||||||
nl_func_decl_end = remove
|
|
||||||
nl_enum_brace = remove # "enum {" vs "enum \n {"
|
|
||||||
nl_union_brace = remove # "union {" vs "union \n {"
|
|
||||||
nl_struct_brace = remove # "struct {" vs "struct \n {"
|
|
||||||
nl_do_brace = remove # "do {" vs "do \n {"
|
|
||||||
nl_if_brace = remove # "if () {" vs "if () \n {"
|
|
||||||
nl_for_brace = remove # "for () {" vs "for () \n {"
|
|
||||||
nl_else_brace = remove # "else {" vs "else \n {"
|
|
||||||
nl_while_brace = remove # "while () {" vs "while () \n {"
|
|
||||||
nl_switch_brace = remove # "switch () {" vs "switch () \n {"
|
|
||||||
nl_brace_while = remove # "} while" vs "} \n while" - cuddle while
|
|
||||||
nl_brace_else = remove # "} else" vs "} \n else" - cuddle else
|
|
||||||
nl_namespace_brace = force # "namespace name {" vs "namespace name \n {"
|
|
||||||
nl_func_var_def_blk = 1
|
|
||||||
nl_fcall_brace = remove # "list_for_each() {" vs "list_for_each()\n{"
|
|
||||||
nl_fdef_brace = add # "int foo() {" vs "int foo()\n{"
|
|
||||||
nl_after_label_colon = false # "fail:\nfree(foo);" vs "fail: free(foo);"
|
|
||||||
nl_start_of_file = remove
|
|
||||||
nl_end_of_file = force
|
|
||||||
nl_end_of_file_min = 1
|
|
||||||
nl_comment_func_def = 1
|
|
||||||
nl_assign_leave_one_liners = true
|
|
||||||
nl_class_leave_one_liners = true
|
|
||||||
nl_enum_leave_one_liners = true
|
|
||||||
nl_getset_leave_one_liners = true
|
|
||||||
nl_func_leave_one_liners = true
|
|
||||||
nl_cpp_lambda_leave_one_liners = true
|
|
||||||
nl_while_leave_one_liners = false
|
|
||||||
nl_if_leave_one_liners = false
|
|
||||||
nl_multi_line_define = true
|
|
||||||
nl_func_call_start_multi_line = false
|
|
||||||
nl_func_call_end_multi_line = false
|
|
||||||
|
|
||||||
# Source code modifications
|
|
||||||
|
|
||||||
mod_paren_on_return = remove # "return 1;" vs "return (1);"
|
|
||||||
mod_full_brace_if = remove # "if (a) a--;" vs "if (a) { a--; }"
|
|
||||||
mod_full_brace_if_chain = true
|
|
||||||
mod_full_brace_for = remove # "for () a--;" vs "for () { a--; }"
|
|
||||||
mod_full_brace_do = force # "do a--; while ();" vs "do { a--; } while ();"
|
|
||||||
mod_full_brace_while = remove # "while (a) a--;" vs "while (a) { a--; }"
|
|
||||||
mod_full_brace_nl = 3 # don't remove if more than 3 newlines
|
|
||||||
|
|
||||||
# Spacing
|
|
||||||
|
|
||||||
sp_addr = remove
|
|
||||||
sp_after_angle = force
|
|
||||||
sp_after_byref = remove
|
|
||||||
sp_after_byref_func = remove
|
|
||||||
sp_after_cast = force # "(int) a" vs "(int)a"
|
|
||||||
sp_after_class_colon = force
|
|
||||||
sp_after_comma = force
|
|
||||||
sp_after_dc = remove
|
|
||||||
sp_after_new = force
|
|
||||||
sp_after_operator = remove
|
|
||||||
sp_after_operator_sym = remove
|
|
||||||
sp_after_ptr_star = remove # "int *foo" vs "int * foo"
|
|
||||||
sp_after_ptr_star_func = remove
|
|
||||||
sp_after_semi = force
|
|
||||||
sp_after_semi_for = force
|
|
||||||
sp_after_semi_for_empty = remove
|
|
||||||
sp_after_sparen = force # "if () {" vs "if (){"
|
|
||||||
sp_after_type = force
|
|
||||||
sp_angle_paren = remove
|
|
||||||
sp_angle_shift = ignore
|
|
||||||
sp_angle_word = force
|
|
||||||
sp_arith = force
|
|
||||||
sp_assign = add
|
|
||||||
sp_assign_default = force
|
|
||||||
sp_attribute_paren = remove
|
|
||||||
sp_balance_nested_parens = false
|
|
||||||
sp_before_angle = remove
|
|
||||||
sp_before_byref = force
|
|
||||||
sp_before_byref_func = force
|
|
||||||
sp_before_case_colon = remove
|
|
||||||
sp_before_class_colon = force
|
|
||||||
sp_before_comma = remove
|
|
||||||
sp_before_dc = remove
|
|
||||||
sp_before_ellipsis = remove
|
|
||||||
sp_before_nl_cont = force
|
|
||||||
sp_before_ptr_star = force # "int*" vs "int *"
|
|
||||||
sp_before_ptr_star_func = force
|
|
||||||
sp_before_semi = remove
|
|
||||||
sp_before_semi_for = remove
|
|
||||||
sp_before_semi_for_empty = remove
|
|
||||||
sp_before_sparen = force # "if (" vs "if("
|
|
||||||
sp_before_square = remove
|
|
||||||
sp_before_tr_emb_cmt = force
|
|
||||||
sp_before_unnamed_byref = force
|
|
||||||
sp_between_ptr_star = remove # "int **" vs "int * *"
|
|
||||||
sp_bool = force
|
|
||||||
sp_brace_catch = force
|
|
||||||
sp_brace_else = force # "}else" vs "} else"
|
|
||||||
sp_brace_finally = force
|
|
||||||
sp_brace_typedef = force
|
|
||||||
sp_case_label = force
|
|
||||||
sp_catch_brace = force
|
|
||||||
sp_catch_paren = force
|
|
||||||
sp_cmt_cpp_start = force
|
|
||||||
sp_compare = force
|
|
||||||
sp_cond_colon = add
|
|
||||||
sp_cond_question = add
|
|
||||||
sp_cpp_cast_paren = force
|
|
||||||
sp_defined_paren = force
|
|
||||||
sp_deref = remove
|
|
||||||
sp_else_brace = force # "else{" vs "else {"
|
|
||||||
sp_endif_cmt = force
|
|
||||||
sp_enum_assign = force
|
|
||||||
sp_finally_brace = force
|
|
||||||
sp_fparen_brace = force
|
|
||||||
sp_func_call_paren = remove # "foo (" vs "foo("
|
|
||||||
sp_func_call_user_paren = remove
|
|
||||||
sp_func_class_paren = remove
|
|
||||||
sp_func_def_paren = remove # "int foo (){" vs "int foo(){"
|
|
||||||
sp_func_proto_paren = remove # "int foo ();" vs "int foo();"
|
|
||||||
sp_getset_brace = force
|
|
||||||
sp_incdec = remove
|
|
||||||
sp_inside_angle = remove
|
|
||||||
sp_inside_braces = force # "{ 1 }" vs "{1}"
|
|
||||||
sp_inside_braces_empty = remove
|
|
||||||
sp_inside_braces_enum = force # "{ 1 }" vs "{1}"
|
|
||||||
sp_inside_braces_struct = force # "{ 1 }" vs "{1}"
|
|
||||||
sp_inside_fparen = remove
|
|
||||||
sp_inside_fparens = remove
|
|
||||||
sp_inside_paren = remove
|
|
||||||
sp_inside_paren_cast = remove
|
|
||||||
sp_inside_sparen = remove
|
|
||||||
sp_inside_square = remove
|
|
||||||
sp_inv = remove
|
|
||||||
sp_macro = force
|
|
||||||
sp_macro_func = force
|
|
||||||
sp_member = remove
|
|
||||||
sp_not = remove
|
|
||||||
sp_num_before_tr_emb_cmt = 1
|
|
||||||
sp_paren_brace = force
|
|
||||||
sp_paren_comma = ignore
|
|
||||||
sp_paren_paren = remove # "((" vs "( ("
|
|
||||||
sp_pp_concat = force
|
|
||||||
sp_pp_stringify = remove
|
|
||||||
sp_return_paren = force # "return (1);" vs "return(1);"
|
|
||||||
sp_sign = remove
|
|
||||||
sp_sizeof_paren = force # "sizeof (int)" vs "sizeof(int)"
|
|
||||||
sp_sparen_brace = force
|
|
||||||
sp_special_semi = remove
|
|
||||||
sp_square_fparen = remove
|
|
||||||
sp_template_angle = add
|
|
||||||
sp_throw_paren = force
|
|
||||||
sp_try_brace = force
|
|
||||||
|
|
||||||
cmt_sp_before_star_cont = 0
|
|
||||||
cmt_sp_after_star_cont = 1
|
|
||||||
|
|
||||||
# Positioning
|
|
||||||
|
|
||||||
pos_arith = lead
|
|
||||||
pos_assign = trail
|
|
||||||
pos_bool = lead
|
|
||||||
pos_compare = lead
|
|
||||||
pos_conditional = lead
|
|
||||||
pos_comma = trail
|
|
||||||
pos_class_comma = trail
|
|
||||||
pos_class_colon = lead
|
|
||||||
|
|
||||||
# Alignment
|
|
||||||
|
|
||||||
align_with_tabs = false # use tabs to align
|
|
||||||
align_on_tabstop = false # align on tabstops
|
|
||||||
align_enum_equ_span = 4 # '=' in enum definition
|
|
||||||
align_nl_cont = true
|
|
||||||
align_assign_span = 0
|
|
||||||
align_struct_init_span = 3 # align stuff in a structure init '= { }'
|
|
||||||
align_right_cmt_span = 3
|
|
||||||
align_pp_define_span = 8
|
|
||||||
align_pp_define_gap = 4
|
|
||||||
align_func_params = false
|
|
||||||
align_var_struct_span = 0
|
|
||||||
|
|
||||||
# Comment
|
|
||||||
|
|
||||||
cmt_indent_multi = true
|
|
||||||
cmt_c_group = false
|
|
||||||
cmt_c_nl_start = false
|
|
||||||
cmt_c_nl_end = false
|
|
||||||
cmt_cpp_group = true
|
|
||||||
cmt_cpp_nl_start = false
|
|
||||||
cmt_cpp_nl_end = false
|
|
||||||
cmt_cpp_to_c = true
|
|
||||||
cmt_star_cont = false
|
|
||||||
cmt_multi_check_last = true
|
|
||||||
|
|
||||||
eat_blanks_after_open_brace = true
|
|
||||||
eat_blanks_before_close_brace = true
|
|
||||||
|
|
||||||
# Preprocessor
|
|
||||||
|
|
||||||
pp_indent = remove
|
|
||||||
pp_space = force
|
|
||||||
pp_space_count = 1
|
|
||||||
|
|
||||||
# Misc
|
|
||||||
|
|
||||||
set cpp_cast nonstd # nonstd cast attributes
|
|
||||||
set compare Op # typical (A) Op (B) macro scenarios
|
|
||||||
set func_call_user _ N_ # gettext macros
|
|
||||||
set attribute CR_FORMAT CR_API CR_PURE CR_INLINE
|
|
14
AUTHORS
|
@ -1,14 +0,0 @@
|
||||||
Maintainer:
|
|
||||||
|
|
||||||
* Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
|
|
||||||
* Adeel "am11" Mujahid <adeelbm@outlook.com>
|
|
||||||
* Matthias "ailu" Günzel <a1lu@arcor.de>
|
|
||||||
* Ben "blinskey" Linskey <ben@benlinskey.com>
|
|
||||||
* "kaidowei" <kaidowei@users.noreply.github.com>
|
|
||||||
* Howard "hppritcha" Pritchard <howardp@lanl.gov>
|
|
||||||
* Kevin "kevinoid" Locke <kevin@kevinlocke.name>
|
|
||||||
* László "MrAnno" Várady <laszlo.varady@balabit.com>
|
|
||||||
* "offa" <bm-dev@yandex.com>
|
|
149
CMakeLists.txt
|
@ -1,149 +0,0 @@
|
||||||
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
||||||
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
||||||
# For details see the LICENSE file distributed with Criterion.
|
|
||||||
|
|
||||||
cmake_minimum_required (VERSION 2.8)
|
|
||||||
|
|
||||||
project (Criterion C)
|
|
||||||
|
|
||||||
set (MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.cmake/Modules")
|
|
||||||
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${MODULE_DIR})
|
|
||||||
|
|
||||||
if (POLICY CMP0054)
|
|
||||||
# http://www.cmake.org/cmake/help/v3.1/policy/CMP0054.html
|
|
||||||
# This is here to allow conditions to be passed as function parameters
|
|
||||||
cmake_policy (SET CMP0054 OLD)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Initialization
|
|
||||||
|
|
||||||
include (Options)
|
|
||||||
include (Submodules)
|
|
||||||
include (Capabilities)
|
|
||||||
include (Subprojects)
|
|
||||||
include (PackageUtils)
|
|
||||||
|
|
||||||
if (NOT WIN32)
|
|
||||||
set (PIC_C_FLAGS "-fPIC")
|
|
||||||
set (VISI_C_FLAGS "-fvisibility=hidden")
|
|
||||||
else ()
|
|
||||||
set (PIC_C_FLAGS "")
|
|
||||||
set (VISI_C_FLAGS "")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
cr_add_subproject (csptr PATH dependencies/libcsptr
|
|
||||||
OPTS
|
|
||||||
-DLIBCSPTR_TESTS=OFF
|
|
||||||
"-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ${PIC_C_FLAGS} ${VISI_C_FLAGS}"
|
|
||||||
CMAKE)
|
|
||||||
|
|
||||||
cr_add_subproject (dyncall_s PATH dependencies/dyncall
|
|
||||||
OPTS
|
|
||||||
-DLANG_CXX=${LANG_CXX}
|
|
||||||
"-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ${PIC_C_FLAGS} ${VISI_C_FLAGS}"
|
|
||||||
CMAKE IF THEORIES)
|
|
||||||
|
|
||||||
cr_add_subproject (nanomsg
|
|
||||||
PATH dependencies/nanomsg
|
|
||||||
OPTS
|
|
||||||
-DNN_TESTS=OFF
|
|
||||||
-DNN_TOOLS=OFF
|
|
||||||
-DNN_STATIC_LIB=ON
|
|
||||||
-DCMAKE_INSTALL_LIBDIR=lib
|
|
||||||
"-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ${PIC_C_FLAGS} ${VISI_C_FLAGS}"
|
|
||||||
CMAKE
|
|
||||||
)
|
|
||||||
|
|
||||||
cr_add_subproject (boxfort PATH dependencies/boxfort
|
|
||||||
OPTS
|
|
||||||
-DBXF_TESTS=OFF
|
|
||||||
-DBXF_SAMPLES=OFF
|
|
||||||
-DBXF_STATIC_LIB=ON
|
|
||||||
-DBXF_FORK_RESILIENCE=OFF
|
|
||||||
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
|
||||||
"-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ${PIC_C_FLAGS} ${VISI_C_FLAGS}"
|
|
||||||
CMAKE)
|
|
||||||
|
|
||||||
add_definitions(-DBXF_STATIC_LIB -DNN_STATIC_LIB)
|
|
||||||
|
|
||||||
cr_add_subproject (wingetopt PATH dependencies/wingetopt CMAKE IF MSVC)
|
|
||||||
|
|
||||||
include (Properties)
|
|
||||||
|
|
||||||
add_definitions (-DNN_STATIC_LIB)
|
|
||||||
|
|
||||||
include_directories(
|
|
||||||
dependencies/valgrind/include/
|
|
||||||
dependencies/klib/
|
|
||||||
dependencies/nanopb/
|
|
||||||
dependencies/debugbreak/
|
|
||||||
)
|
|
||||||
|
|
||||||
# Coverage
|
|
||||||
|
|
||||||
if (COVERALLS)
|
|
||||||
include(Coveralls)
|
|
||||||
coveralls_turn_on_coverage()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# I18N
|
|
||||||
|
|
||||||
if (I18N AND GETTEXT_FOUND AND LIBINTL_LIB_FOUND)
|
|
||||||
include(GettextTranslate)
|
|
||||||
add_subdirectory(po)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Project
|
|
||||||
|
|
||||||
include_directories(include src)
|
|
||||||
add_subdirectory (src)
|
|
||||||
|
|
||||||
cr_add_library(criterion SHARED
|
|
||||||
SOURCES ${SOURCE_FILES}
|
|
||||||
HEADERS ${INTERFACE_FILES}
|
|
||||||
COMPONENT dev
|
|
||||||
PROPERTIES
|
|
||||||
VERSION ${PROJECT_SONAME}
|
|
||||||
SOVERSION ${PROJECT_SOVERSION}
|
|
||||||
)
|
|
||||||
|
|
||||||
cr_link_subproject(criterion csptr STATIC)
|
|
||||||
cr_link_subproject(criterion nanomsg STATIC)
|
|
||||||
cr_link_subproject(criterion dyncall_s STATIC)
|
|
||||||
cr_link_subproject(criterion wingetopt STATIC)
|
|
||||||
cr_link_subproject(criterion boxfort STATIC)
|
|
||||||
|
|
||||||
cr_link_libraries(criterion pthread IF NOT WIN32)
|
|
||||||
cr_link_libraries(criterion rt IF HAVE_LIBRT)
|
|
||||||
|
|
||||||
# Required by nanomsg
|
|
||||||
cr_link_libraries(criterion anl IF HAVE_GETADDRINFO_A)
|
|
||||||
cr_link_libraries(criterion ws2_32 mswsock IF WIN32)
|
|
||||||
|
|
||||||
cr_link_package(criterion LIBINTL)
|
|
||||||
|
|
||||||
if (COVERALLS)
|
|
||||||
coveralls_setup("${SOURCE_FILES}" ${COVERALLS_UPLOAD})
|
|
||||||
|
|
||||||
add_custom_target(gcov
|
|
||||||
"${CMAKE_COMMAND}"
|
|
||||||
-DSOURCE_FILES="${SOURCE_FILES}"
|
|
||||||
-DCOV_PATH="${CMAKE_CURRENT_BINARY_DIR}"
|
|
||||||
-P "${CMAKE_MODULE_PATH}/Gcov.cmake"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_target(uninstall
|
|
||||||
"${CMAKE_COMMAND}" -P "${CMAKE_MODULE_PATH}/uninstall.cmake"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (CTESTS)
|
|
||||||
enable_testing()
|
|
||||||
add_custom_target(criterion_tests)
|
|
||||||
add_subdirectory(samples)
|
|
||||||
add_subdirectory(test)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (UPLOAD_DEB)
|
|
||||||
include (DebUpload)
|
|
||||||
endif ()
|
|
|
@ -1,71 +0,0 @@
|
||||||
# Contributing
|
|
||||||
|
|
||||||
Contributions are welcomed, but must follow a simple set of rules in order to
|
|
||||||
be merged.
|
|
||||||
|
|
||||||
**Please follow these conventions if you want your pull request(s) accepted.**
|
|
||||||
|
|
||||||
## General
|
|
||||||
|
|
||||||
* Try to respect a 80 chars column limit. Not mandatory, but appreciated.
|
|
||||||
* No trash files. Trash files are by-products of the compilation process, or
|
|
||||||
generated files that does not need to be under version control.
|
|
||||||
* Pull requests must pass the style check. See "Passing the style check" section below.
|
|
||||||
* Pull requests must compile and work properly.
|
|
||||||
* Pull requests must pass all tests.
|
|
||||||
* Pull requests must be mergeable without conflicts.
|
|
||||||
* Number of commits in a pull request should be kept to one commit and all
|
|
||||||
additional commits must be squashed.
|
|
||||||
* You may have more than one commit in a pull request if the commits are
|
|
||||||
separate changes, otherwise squash them.
|
|
||||||
* Keep your commit messages simple and concise. Good commit messages start
|
|
||||||
with a verb ('Add', 'Fix', ...).
|
|
||||||
* Commit messages should follow the format `topic: message`, e.g. `cli: Added --foo flag`.
|
|
||||||
In cases where multiple topics are relevant, use a comma-separated list of topics, e.g.
|
|
||||||
`api,float: Fixed printf format specifiers for long double`
|
|
||||||
|
|
||||||
## Passing the style check
|
|
||||||
|
|
||||||
This project use an automated style checking process for pull requests defined as
|
|
||||||
an uncrustify configuration file named `.uncrustify.cfg`.
|
|
||||||
|
|
||||||
To ease the development process, a pre-commit hook is installable by running
|
|
||||||
`.githooks/install.sh` from the project root directory. This pre-commit hook
|
|
||||||
checks for style, outputs a diff of the changes that need to be done, and
|
|
||||||
produces a patch to fix them automatically.
|
|
||||||
|
|
||||||
As the automatic style checker is bound to have errors, parts of the code
|
|
||||||
that make the checker fail because of their tricky grammar (e.g. Duff devices)
|
|
||||||
may be enclosed by `/* *INDENT-OFF* */` and `/* *INDENT-ON* */` to disable
|
|
||||||
the style checker on the region. Note that this feature should be used
|
|
||||||
*exceptionally*, and that the maintainer will always have the last word regarding
|
|
||||||
stylistic choices that cannot pass the style check.
|
|
||||||
|
|
||||||
## Translations
|
|
||||||
|
|
||||||
* You can contribute new translation files for output messages, on the
|
|
||||||
condition that you are fluent with the language itself.
|
|
||||||
* Each correction on existing translations must be followed by a
|
|
||||||
rationale ("why would the translation be better if the change is applied?")
|
|
||||||
|
|
||||||
## Roadmap
|
|
||||||
|
|
||||||
.
|
|
||||||
|- .cmake/: CMake modules
|
|
||||||
|- dependencies/: dependencies for building libcriterion
|
|
||||||
|- doc/: Sphinx documentation files
|
|
||||||
|- dev/: Developer files
|
|
||||||
|- include/criterion/: Public API
|
|
||||||
|- src/: Sources for libcriterion
|
|
||||||
| |- compat/: Cross-platform abstractions for platform-dependent code
|
|
||||||
| |- core/: Core mechanisms used to run the tests
|
|
||||||
| |- entry/: Entry-point related sources, and default main function
|
|
||||||
| |- io/: IO related functions, redirections
|
|
||||||
| |- log/: Output providers, all the output logic in general
|
|
||||||
| `- string/: String manipulation functions, i18n
|
|
||||||
|- po/: Translation files, i18n stuff
|
|
||||||
|- test/: Unit tests for libcriterion
|
|
||||||
`- samples/: Sample files
|
|
||||||
|- outputs/: Expected output files for the current samples
|
|
||||||
`- tests/: Internal regression tests
|
|
||||||
`- outputs/: Expected output files for the regression tests
|
|
206
ChangeLog
|
@ -1,206 +0,0 @@
|
||||||
2018-09-18 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.3.0
|
|
||||||
* Addition: added German translation files (Matthias "ailu" Günzel).
|
|
||||||
* Addition: added a pkg-config file.
|
|
||||||
* Addition: allow tests to be skipped with cr_skip_test() (Matthias "ailu" Günzel).
|
|
||||||
* Addition: assertions on wide-strings are now available (Kevin "kevinoid" Locke).
|
|
||||||
* Addition: crash-mode with --crash to raise a trap when an assertion fails for debugging purposes (Matthias "ailu" Günzel).
|
|
||||||
* Addition: debugging mode with --debug.
|
|
||||||
* Addition: global test timeout with --timeout.
|
|
||||||
* Addition: header files in the public API now have doxygen documentation (Matthias "ailu" Günzel).
|
|
||||||
* Addition: test filtering now works on windows.
|
|
||||||
* Addition: user logging API with cr_log, cr_log_info, cr_log_warning, and cr_log_error.
|
|
||||||
* Breaking: dropped support for MinGW, use MinGW-w64.
|
|
||||||
* Breaking: dropped support for Windows XP, use Windows 7 and later.
|
|
||||||
* Breaking: log_pre_init and log_pre_test in the internal logger API now takes an additional parameter.
|
|
||||||
* Breaking: the SOVERSION now follows the SONAME major independently of the project version.
|
|
||||||
* Change: --pattern has been renamed to --filter.
|
|
||||||
* Change: removed dependency on PCRE for filtering (Matthias "ailu" Günzel).
|
|
||||||
* Change: sections of all loaded shared modules are now inspected for tests and hooks.
|
|
||||||
* Change: setting .exit_code = 0 now enforces the exit code of the test to be 0.
|
|
||||||
* Change: string assertions now print the contents of string parameters ("kaidowei").
|
|
||||||
* Change: tests are no longer executed in parallel on windows by default to mitigate a nanomsg bug (see https://github.com/Snaipe/Criterion/issues/118).
|
|
||||||
* Change: xml reports now includes elapsed times ("kaidowei").
|
|
||||||
* Deprecation: --no-early-exit is now a no-op and should no longer be used.
|
|
||||||
* Deprecation: internal logging API is no longer public, fallbacks to the new logging API.
|
|
||||||
* Fix: fail-fast now works correctly.
|
|
||||||
* Fix: fixed FindCriterion.cmake with the correct package name (László "MrAnno" Várady).
|
|
||||||
* Fix: position-independent executables now work.
|
|
||||||
* Fix: string assertions no longer crash with a NULL parameter ("kaidowei").
|
|
||||||
* Fix: the data pipe no longer gets corrupted when running a large quantity of assertions in parallel.
|
|
||||||
* Fix: using dmalloc on tests now works.
|
|
||||||
* Fix: using the GOLD linker rather than BFD now works.
|
|
||||||
* Fix: using the musl C library now works.
|
|
||||||
|
|
||||||
2016-06-20 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.2.2
|
|
||||||
* Fix: fixed deadlocks when tests are terminated too fast
|
|
||||||
* Fix: fixed crash during test teardown if spawning new threads in the test
|
|
||||||
* Fix: fixed memory leak in disabled tests
|
|
||||||
|
|
||||||
2016-02-06 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.2.1
|
|
||||||
* Fix: fixed criterion not being embeddable with CMake's `add_directory`
|
|
||||||
* Fix: fixed resource leaks in the child pump thread
|
|
||||||
* Fix: fixed redirected standard streams being leaked by cr_(assert|expect)_std(out|err)
|
|
||||||
* Fix: fixed out of bounds during assert message sending
|
|
||||||
* Fix: fixed naming convention conflicts for internal variables used by the implementation of cr_assert
|
|
||||||
* Fix: fixed empty format string warning with GCC 4.8
|
|
||||||
* Fix: fixed file-to-file comparison assert message being corrupted
|
|
||||||
|
|
||||||
2015-12-08 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.2.0
|
|
||||||
* Breaking: Renamed all unprefixed internal macros and functions that were
|
|
||||||
exposed in the API, and moved them to criterion/internal.
|
|
||||||
This shouldn't break your code if you did not use these in the first
|
|
||||||
place.
|
|
||||||
* Change: Added language-specific wrapping logic to decouple the language
|
|
||||||
the tests are written in from the test runner.
|
|
||||||
* Change: Rewrote the reporting logic to allow multiple test reports to be
|
|
||||||
written using any format.
|
|
||||||
* Addition: Added parallel jobs for the test runner.
|
|
||||||
* Addition: Added C++ allocator for STL collections based on
|
|
||||||
cr_malloc/cr_free.
|
|
||||||
* Addition: Added criterion::parameters in C++ for simpler parameter list
|
|
||||||
generation.
|
|
||||||
* Addition: Added saner defaults when the tests detect they run under
|
|
||||||
valgrind.
|
|
||||||
* Addition: Added basic Objective-C language support.
|
|
||||||
* Addition: Added JUnit XML reporting.
|
|
||||||
* Addition: Added JSON reporting.
|
|
||||||
* Addition: Added dynamic reporter registration.
|
|
||||||
* Addition: Added back support for GCC 4.6 when compiling C tests.
|
|
||||||
* Addition: Added single test execution mode.
|
|
||||||
* Removal: Removed all deprecated 1.x unprefixed assertion macros.
|
|
||||||
* Fix: Fixed some memory corruption happening on rare occasions on assert
|
|
||||||
messages.
|
|
||||||
* Fix: Fixed deadlocks happening at random when a large quantity of assert
|
|
||||||
is present.
|
|
||||||
* Fix: Fixed the library not compiling with the intel compiler collection.
|
|
||||||
* Deprecation: All cr_assume_strings_* macros are deprecated in favor of
|
|
||||||
cr_assume_str_*.
|
|
||||||
* Deprecation: All cr_assume_arrays_* macros are deprecated in favor of
|
|
||||||
cr_assume_arr_*.
|
|
||||||
|
|
||||||
2015-11-25 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.1.1
|
|
||||||
* Fix: Fixed bug where the TAP output access the assert message after
|
|
||||||
it has been freed, causing it to print garbage.
|
|
||||||
|
|
||||||
2015-09-21 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.1.0
|
|
||||||
* Addition: Added file mocking utilities
|
|
||||||
* Addition: Added parameterized tests
|
|
||||||
|
|
||||||
2015-09-20 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.0.2
|
|
||||||
* Fix: Fixed rare bug where tests from only one compilation unit would run.
|
|
||||||
|
|
||||||
2015-09-19 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.0.1
|
|
||||||
* Fix: Fixed wrong setjmp() usage making tests compiled with optimisations
|
|
||||||
crash.
|
|
||||||
|
|
||||||
2015-09-14 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 2.0.0
|
|
||||||
* Breaking: ABI incompatibility with prior versions of criterion. You
|
|
||||||
**must** recompile your tests.
|
|
||||||
* Breaking: cr_abort_test(NULL) does not compile anymore.
|
|
||||||
* Change: Changed all assertion macros to accept a printf format string as a
|
|
||||||
message.
|
|
||||||
* Change: Made the API C++11-compatible.
|
|
||||||
* Change: Made the library ISO C compliant. You can now compile the library
|
|
||||||
with VC 14+.
|
|
||||||
* Addition: Added support for theories.
|
|
||||||
* Addition: Added ability to test the exit status of a test.
|
|
||||||
* Addition: Added C++11 throw assertions.
|
|
||||||
* Addition: Added assert message localization.
|
|
||||||
* Addition: Added test timeouts.
|
|
||||||
* Addition: Added test standard i/o redirection & file comparison assertions.
|
|
||||||
* Removal: Removed the deprecated prefixless assertion macros
|
|
||||||
* Deprecation: Deprecated cr_abort_test.
|
|
||||||
* Deprecation: cr_{assert,expect}_strings_* and cr_{assert,expect}_arrays_*
|
|
||||||
are deprecated in favor of cr_{assert,expect}_str_* and
|
|
||||||
cr_{assert,expect}_arr_* respectively.
|
|
||||||
|
|
||||||
2015-08-20 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 1.3.1
|
|
||||||
* Fixed OS X and Windows section iterations
|
|
||||||
* Fixed report hooks not working on OS X and Windows
|
|
||||||
* Fixed duplicated output when writing in PRE_ALL to a redirected stdout/err
|
|
||||||
* Added -S switch to display filenames in their short version
|
|
||||||
|
|
||||||
2015-08-05 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 1.3.0
|
|
||||||
* Turned the library into a shared library.
|
|
||||||
* Added extended globbing for --pattern (requires PCRE)
|
|
||||||
* Switched to a CMake build system
|
|
||||||
* Fixed windows builds & output
|
|
||||||
* Added basic windows SEH-to-signal translator
|
|
||||||
|
|
||||||
2015-04-26 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 1.2.1
|
|
||||||
* Added a cr_ prefix to all assertion macros. Old macros are deprecated
|
|
||||||
and will be removed in a future version.
|
|
||||||
|
|
||||||
2015-04-15 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 1.2.0
|
|
||||||
* Added native Windows support through MinGW
|
|
||||||
* Fixed inaccurate statistics on disabled and crashing tests
|
|
||||||
* Fixed asserts not aborting the test when used in functions
|
|
||||||
* Fixed programs not compiling when no tests are declared
|
|
||||||
* Added assert_null to test for pointer nullity
|
|
||||||
* Added assert_arrays_eq_cmp for padded struct arrays equality
|
|
||||||
|
|
||||||
* Added i18n support
|
|
||||||
* Added fr_FR localization
|
|
||||||
|
|
||||||
2015-03-24 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 1.1.0
|
|
||||||
* Refactored logging system
|
|
||||||
* Changed output format to a better-looking one
|
|
||||||
* Added Syntactic coloration
|
|
||||||
|
|
||||||
* Added test suite separation
|
|
||||||
* Added test suite statistics
|
|
||||||
|
|
||||||
* Added --list option
|
|
||||||
* Added --fail-fast option
|
|
||||||
* Added --pattern option
|
|
||||||
|
|
||||||
2015-03-18 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 1.0.0
|
|
||||||
* Added test timings
|
|
||||||
* Changed assert prototypes
|
|
||||||
* ANSI compliance over header files
|
|
||||||
* Windows + FreeBSD compatibility
|
|
||||||
|
|
||||||
2015-03-11 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 0.3.0
|
|
||||||
* A logging interface
|
|
||||||
* Various readme and documentation changes
|
|
||||||
* Default CLI options & environment variables
|
|
||||||
* Mac OS X compatibility
|
|
||||||
* Comparison assertions, floating-point equality assertions
|
|
||||||
|
|
||||||
2015-02-06 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
|
|
||||||
* criterion: version 0.2.0
|
|
||||||
* Added criterion internals.
|
|
||||||
* Added Test, ReportHook, assert and expect macros.
|
|
21
LICENSE
|
@ -1,21 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
106
README.md
|
@ -1,106 +0,0 @@
|
||||||
|
|
||||||
<img src="doc/criterion-title.png" height="96" alt="Criterion Logo" />
|
|
||||||
=========
|
|
||||||
|
|
||||||
[](https://travis-ci.org/Snaipe/Criterion)
|
|
||||||
[](https://ci.appveyor.com/project/Snaipe/Criterion/branch/bleeding)
|
|
||||||
[](https://codecov.io/github/Snaipe/Criterion?branch=bleeding)
|
|
||||||
[](https://github.com/Snaipe/Criterion/blob/master/LICENSE)
|
|
||||||
[](https://github.com/Snaipe/Criterion/releases)
|
|
||||||
|
|
||||||
A dead-simple, yet extensible, C and C++ unit testing framework.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Philosophy
|
|
||||||
|
|
||||||
Most test frameworks for C require a lot of boilerplate code to
|
|
||||||
set up tests and test suites -- you need to create a main,
|
|
||||||
then register new test suites, then register the tests within
|
|
||||||
these suits, and finally call the right functions.
|
|
||||||
|
|
||||||
This gives the user great control, at the unfortunate cost of simplicity.
|
|
||||||
|
|
||||||
Criterion follows the KISS principle, while keeping the control
|
|
||||||
the user would have with other frameworks:
|
|
||||||
|
|
||||||
* [x] C99 and C++11 compatible.
|
|
||||||
* [x] Tests are automatically registered when declared.
|
|
||||||
* [x] Implements a xUnit framework structure.
|
|
||||||
* [x] A default entry point is provided, no need to declare a main
|
|
||||||
unless you want to do special handling.
|
|
||||||
* [x] Test are isolated in their own process, crashes and signals can be
|
|
||||||
reported and tested.
|
|
||||||
* [x] Unified interface between C and C++: include the criterion header and it *just* works.
|
|
||||||
* [x] Supports parameterized tests and theories.
|
|
||||||
* [x] Progress and statistics can be followed in real time with report hooks.
|
|
||||||
* [x] TAP output format can be enabled with an option.
|
|
||||||
* [x] Runs on Linux, FreeBSD, Mac OS X, and Windows (Compiling with MinGW GCC and Visual Studio 2015+).
|
|
||||||
|
|
||||||
## Downloads
|
|
||||||
|
|
||||||
### Packages
|
|
||||||
|
|
||||||
* Mac OS X: `brew install snaipe/soft/criterion`
|
|
||||||
* [AUR](https://aur.archlinux.org/packages/criterion/): `yaourt -S criterion`
|
|
||||||
|
|
||||||
### Binary archives
|
|
||||||
|
|
||||||
Binary releases are available [on the release page](https://github.com/Snaipe/Criterion/releases)
|
|
||||||
|
|
||||||
If you have a different platform, you can still [build the library from source](http://criterion.readthedocs.org/en/latest/setup.html#installation)
|
|
||||||
|
|
||||||
## Developer Resources
|
|
||||||
|
|
||||||
### Documentation
|
|
||||||
|
|
||||||
An online documentation is available on [ReadTheDocs][online-docs]
|
|
||||||
([PDF][pdf-docs] | [Zip][zip-docs] | [Epub][epub-docs])
|
|
||||||
|
|
||||||
### Samples
|
|
||||||
|
|
||||||
Sample tests can be found in the [sample directory][samples].
|
|
||||||
|
|
||||||
* [A simple test][sample-simple]
|
|
||||||
* [Using multiple suites][sample-suites]
|
|
||||||
* [Writing assertions][sample-asserts]
|
|
||||||
* [Adding test fixtures][sample-fixtures]
|
|
||||||
* [Tests with signals][sample-signal]
|
|
||||||
* [Using report hooks][sample-report]
|
|
||||||
|
|
||||||
### Getting help
|
|
||||||
|
|
||||||
| Channel | Description |
|
|
||||||
| --- | --- |
|
|
||||||
[][mailing-list] | Criterion mailing list on freelists.org
|
|
||||||
[][gitter-chan] | `Snaipe/Criterion` on gitter.im
|
|
||||||
[][irc-chan] | `#criterion` on irc.freenode.net
|
|
||||||
|
|
||||||
### Misc
|
|
||||||
|
|
||||||
* [autotools skeleton for projects with criterion tests][autotools]
|
|
||||||
* [CMake find module for Criterion][find-module]
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
Logo made by [Paul Bouigue](http://www.cargocollective.com/pbouigue)
|
|
||||||
|
|
||||||
[online-docs]: http://criterion.readthedocs.org/
|
|
||||||
[pdf-docs]: http://readthedocs.org/projects/criterion/downloads/pdf/latest/
|
|
||||||
[zip-docs]: http://readthedocs.org/projects/criterion/downloads/htmlzip/latest/
|
|
||||||
[epub-docs]: http://readthedocs.org/projects/criterion/downloads/epub/latest/
|
|
||||||
|
|
||||||
[samples]: ./samples/
|
|
||||||
[sample-simple]: ./samples/simple.c
|
|
||||||
[sample-suites]: ./samples/suites.c
|
|
||||||
[sample-asserts]: ./samples/asserts.c
|
|
||||||
[sample-fixtures]: ./samples/fixtures.c
|
|
||||||
[sample-signal]: ./samples/signal.c
|
|
||||||
[sample-report]: ./samples/report.c
|
|
||||||
|
|
||||||
[autotools]: ./dev/autotools
|
|
||||||
[find-module]: ./dev/FindCriterion.cmake
|
|
||||||
|
|
||||||
[irc-chan]: http://webchat.freenode.net/?channels=%23criterion&uio=MTY9dHJ1ZSYyPXRydWUmOT10cnVlJjExPTE5NQ4e
|
|
||||||
[gitter-chan]: https://gitter.im/Snaipe/Criterion?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|
|
||||||
[mailing-list]: http://www.freelists.org/list/criterion
|
|
101
appveyor.yml
|
@ -1,101 +0,0 @@
|
||||||
version: 2.3.0-rc1_b{build}-{branch}
|
|
||||||
|
|
||||||
os: Visual Studio 2015
|
|
||||||
|
|
||||||
environment:
|
|
||||||
COVERALLS_REPO_TOKEN:
|
|
||||||
secure: 5nuCg+faxFPeppoNNcSwVobswAVFUf8ut83vw8CX/4W2y0kZkGmwEfCUxSQWiQDU
|
|
||||||
CI_NAME: appveyor
|
|
||||||
CI_JOB_ID: $(APPVEYOR_JOB_ID)
|
|
||||||
GCOV_PREFIX: $(APPVEYOR_BUILD_FOLDER)
|
|
||||||
PYTHON_BIN: python
|
|
||||||
PYTHONIOENCODING: "utf-8" # consider cmd encoding to be unicode
|
|
||||||
CRAM_SHELL: "C:\\msys64\\usr\\bin\\sh.exe"
|
|
||||||
matrix:
|
|
||||||
- COMPILER: mingw
|
|
||||||
GENERATOR: "MSYS Makefiles"
|
|
||||||
BUILD_FLAGS: -j2
|
|
||||||
- COMPILER: msvc
|
|
||||||
GENERATOR: "Visual Studio 14 2015 Win64"
|
|
||||||
CFLAGS: /MP
|
|
||||||
CXXFLAGS: /MP
|
|
||||||
BUILD_FLAGS: /verbosity:m
|
|
||||||
|
|
||||||
init:
|
|
||||||
- git config --global core.autocrlf input
|
|
||||||
- set MSYSTEM=MINGW64
|
|
||||||
|
|
||||||
# Disable windows process crash popup
|
|
||||||
# See: https://msdn.microsoft.com/en-us/library/bb513638%28VS.85%29.aspx
|
|
||||||
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\Windows" /f /v ErrorMode /t REG_DWORD /d 2
|
|
||||||
- reg add "HKLM\Software\Microsoft\Windows\Windows Error Reporting" /f /v DontShowUI /t REG_DWORD /d 1
|
|
||||||
- reg add "HKLM\Software\Microsoft\Windows\Windows Error Reporting" /f /v Disable /t REG_DWORD /d 1
|
|
||||||
|
|
||||||
- set PATH=C:\Python35;C:\Python35\Scripts;C:\msys64\mingw64\bin;C:\msys64\mingw32\bin;C:\msys64\usr\bin;%PATH%
|
|
||||||
- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\build;%APPVEYOR_BUILD_FOLDER%\build\Debug;%APPVEYOR_BUILD_FOLDER%\build\external\bin;%APPVEYOR_BUILD_FOLDER%\build\external\lib"
|
|
||||||
- set MSYSTEM=MINGW64
|
|
||||||
- pip install cram==0.7
|
|
||||||
|
|
||||||
# Remove Xamarin msbuild warnings
|
|
||||||
- del "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets"
|
|
||||||
|
|
||||||
clone_depth: 5
|
|
||||||
|
|
||||||
configuration:
|
|
||||||
- Debug
|
|
||||||
- RelWithDebInfo
|
|
||||||
|
|
||||||
install:
|
|
||||||
- ps: $env:RELEASE_NAME = $env:APPVEYOR_REPO_BRANCH -replace "/", "-"
|
|
||||||
# Hack to make git think it is on the tip of the repo branch
|
|
||||||
- 'git checkout -B %APPVEYOR_REPO_BRANCH%'
|
|
||||||
|
|
||||||
# Patch buggy cram
|
|
||||||
- sh -c "patch /c/Python35/lib/site-packages/cram/_test.py .cmake/cram-env.patch"
|
|
||||||
|
|
||||||
# Configure project
|
|
||||||
- 'mkdir build && cd build'
|
|
||||||
- >
|
|
||||||
cmake
|
|
||||||
-Wno-dev
|
|
||||||
-DCTESTS=ON
|
|
||||||
-DI18N=OFF
|
|
||||||
-DCMAKE_INSTALL_PREFIX="criterion-%RELEASE_NAME%"
|
|
||||||
-DCMAKE_BUILD_TYPE="%CONFIGURATION%"
|
|
||||||
%CMAKE_OPTS%
|
|
||||||
-G "%GENERATOR%"
|
|
||||||
..
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
# open dummy fd 0 to prevent errors at configure time for autoconf dependencies
|
|
||||||
- cmake --build . -- %BUILD_FLAGS% 0<nul
|
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
- ps: |
|
|
||||||
$archive = "criterion-$env:RELEASE_NAME-windows-$env:COMPILER-$env:PLATFORM"
|
|
||||||
cmake --build . --target install
|
|
||||||
7z a -ttar "$archive.tar" "criterion-$env:RELEASE_NAME"
|
|
||||||
7z a -tbzip2 "../$archive.tar.bz2" "$archive.tar"
|
|
||||||
Push-AppveyorArtifact "../$archive.tar.bz2"
|
|
||||||
|
|
||||||
test_script:
|
|
||||||
- cmake --build . --target criterion_tests
|
|
||||||
- ps: |
|
|
||||||
sh -c "ctest --output-on-failure --timeout 10"
|
|
||||||
if (-not $lastexitcode -eq 0) {
|
|
||||||
$host.setshouldexit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
#after_test:
|
|
||||||
# - 'make coveralls'
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: GitHub
|
|
||||||
auth_token:
|
|
||||||
secure: MnZZQeoxBVnpV9GSSvVok5Je0/N2d/fzG4+ITw95/tYSgZ8rleBV23a5sCwAea3r
|
|
||||||
artifact: 'criterion-$(RELEASE_NAME)-windows-$(COMPILER)-$(PLATFORM).tar.bz2'
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
on:
|
|
||||||
appveyor_repo_tag: true
|
|
||||||
configuration: RelWithDebInfo
|
|
|
@ -1,25 +0,0 @@
|
||||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
||||||
Upstream-Name: Criterion
|
|
||||||
Upstream-Contact: Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
Source: http://github.com/Snaipe/Criterion
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2015-2016, Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
|
|
||||||
License: MIT
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
.
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
.
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
1
dependencies/boxfort
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 9f7ba3716c800a53639c9fe68fd453296f982c99
|
|
1
dependencies/debugbreak
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 6b79ec8d8f8d4603111f580a0537f8f31c484c32
|
|
1
dependencies/dyncall
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 51e79a84fd91881d7424b28271c6dda4e0d97c11
|
|
1
dependencies/klib
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit cdb7e9236dc47abf8da7ebd702cc6f7f21f0c502
|
|
1
dependencies/libcsptr
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 0d52904da5d7bd0a3eac3c47e9f9bb10cd78a26e
|
|
1
dependencies/nanomsg
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 7e12a20e038234060d41d03c20721d08117f8607
|
|
1
dependencies/nanopb
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 56f7c488df99ae655b47b5838055e48b886665a1
|
|
6588
dependencies/valgrind/include/valgrind/valgrind.h
vendored
1
dependencies/wingetopt
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 76a5d1ab15f684d4c9479a32624d65b3bd1a726b
|
|
|
@ -1,23 +0,0 @@
|
||||||
Criterion is a dead-simple, yet extensible, C and C++ unit testing framework.
|
|
||||||
|
|
||||||
Most test frameworks for C require a lot of boilerplate code to
|
|
||||||
set up tests and test suites -- you need to create a main,
|
|
||||||
then register new test suites, then register the tests within
|
|
||||||
these suits, and finally call the right functions.
|
|
||||||
|
|
||||||
This gives the user great control, at the unfortunate cost of simplicity.
|
|
||||||
|
|
||||||
Criterion follows the KISS principle, while keeping the control
|
|
||||||
the user would have with other frameworks:
|
|
||||||
|
|
||||||
* C99 and C++11 compatible.
|
|
||||||
* Tests are automatically registered when declared.
|
|
||||||
* Implements a xUnit framework structure.
|
|
||||||
* A default entry point is provided, no need to declare a main
|
|
||||||
unless you want to do special handling.
|
|
||||||
* Test are isolated in their own process, crashes and signals can be
|
|
||||||
reported and tested.
|
|
||||||
* Unified interface between C and C++: include the criterion header and it *just* works.
|
|
||||||
* Supports parameterized tests and theories.
|
|
||||||
* Progress and statistics can be followed in real time with report hooks.
|
|
||||||
* TAP output format can be enabled with an option.
|
|
|
@ -1,27 +0,0 @@
|
||||||
# This file is licensed under the WTFPL version 2 -- you can see the full
|
|
||||||
# license over at http://www.wtfpl.net/txt/copying/
|
|
||||||
#
|
|
||||||
# - Try to find Criterion
|
|
||||||
#
|
|
||||||
# Once done this will define
|
|
||||||
# CRITERION_FOUND - System has Criterion
|
|
||||||
# CRITERION_INCLUDE_DIRS - The Criterion include directories
|
|
||||||
# CRITERION_LIBRARIES - The libraries needed to use Criterion
|
|
||||||
|
|
||||||
find_package(PkgConfig)
|
|
||||||
|
|
||||||
find_path(CRITERION_INCLUDE_DIR criterion/criterion.h
|
|
||||||
PATH_SUFFIXES criterion)
|
|
||||||
|
|
||||||
find_library(CRITERION_LIBRARY NAMES criterion libcriterion)
|
|
||||||
|
|
||||||
set(CRITERION_LIBRARIES ${CRITERION_LIBRARY})
|
|
||||||
set(CRITERION_INCLUDE_DIRS ${CRITERION_INCLUDE_DIR})
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIET and REQUIRED arguments and set CRITERION_FOUND to TRUE
|
|
||||||
# if all listed variables are TRUE
|
|
||||||
find_package_handle_standard_args(Criterion DEFAULT_MSG
|
|
||||||
CRITERION_LIBRARY CRITERION_INCLUDE_DIR)
|
|
||||||
|
|
||||||
mark_as_advanced(CRITERION_INCLUDE_DIR CRITERION_LIBRARY)
|
|
|
@ -1,14 +0,0 @@
|
||||||
# use the provided wrapper script to output things properly
|
|
||||||
LOG_COMPILER = $(top_srcdir)/build-aux/criterion-tap-test
|
|
||||||
|
|
||||||
# use the TAP log driver
|
|
||||||
LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
|
|
||||||
$(top_srcdir)/build-aux/tap-driver.sh
|
|
||||||
|
|
||||||
check_PROGRAMS = criterion_tests
|
|
||||||
|
|
||||||
criterion_tests_SOURCES = simple.c
|
|
||||||
criterion_tests_LDFLAGS = -lcriterion
|
|
||||||
|
|
||||||
TESTS = criterion_tests
|
|
||||||
EXTRA_DIST = $(TESTS)
|
|
|
@ -1,27 +0,0 @@
|
||||||
# Autotools skeleton
|
|
||||||
|
|
||||||
This is a project skeleton that uses criterion tests with the TAP test driver.
|
|
||||||
|
|
||||||
## Running the tests
|
|
||||||
|
|
||||||
The default setup assumes that criterion is installed on your system.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ ./autogen.sh
|
|
||||||
$ mkdir build && cd build
|
|
||||||
$ ../configure
|
|
||||||
$ make check
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
The project skeleton is licensed under the [wtfpl](http://www.wtfpl.net). Do
|
|
||||||
whatever you want with it.
|
|
||||||
|
|
||||||
### License clause
|
|
||||||
|
|
||||||
This program is free software. It comes without any warranty, to
|
|
||||||
the extent permitted by applicable law. You can redistribute it
|
|
||||||
and/or modify it under the terms of the Do What The Fuck You Want
|
|
||||||
To Public License, Version 2, as published by Sam Hocevar. See
|
|
||||||
http://www.wtfpl.net/ for more details.
|
|
|
@ -1,17 +0,0 @@
|
||||||
#!/bin/sh -e
|
|
||||||
|
|
||||||
# copy TAP driver into build-aux
|
|
||||||
automake_ver=$(automake --version | \grep -E -o '[0-9]\.[0-9]{2}')
|
|
||||||
|
|
||||||
mkdir -p build-aux
|
|
||||||
cp -f /usr/share/automake-$automake_ver/tap-driver.sh build-aux
|
|
||||||
|
|
||||||
# create criterion TAP log compiler
|
|
||||||
# this is necessary to print TAP (and only TAP) on the standard output,
|
|
||||||
# and always exit with 0 to let the TAP driver handle errors itself.
|
|
||||||
echo >build-aux/criterion-tap-test """#!/bin/sh
|
|
||||||
\$1 -Otap:- --always-succeed 2>&1 >/dev/null
|
|
||||||
"""
|
|
||||||
chmod +x build-aux/criterion-tap-test
|
|
||||||
|
|
||||||
autoreconf -vi
|
|
|
@ -1,15 +0,0 @@
|
||||||
AC_INIT([Criterion Autotools Tests], [1.0], [your@email.com])
|
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
|
||||||
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
|
|
||||||
|
|
||||||
AC_CHECK_LIB([criterion], [criterion_initialize], [], [
|
|
||||||
AC_MSG_ERROR([unable to find Criterion])
|
|
||||||
], [])
|
|
||||||
|
|
||||||
AC_PROG_AWK
|
|
||||||
AC_PROG_CC
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile])
|
|
||||||
|
|
||||||
AC_REQUIRE_AUX_FILE([tap-driver.sh])
|
|
||||||
AC_OUTPUT
|
|
|
@ -1,9 +0,0 @@
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
Test(misc, failing) {
|
|
||||||
cr_assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Test(misc, passing) {
|
|
||||||
cr_assert(1);
|
|
||||||
}
|
|
2406
doc/Doxyfile
25
doc/_static/style.css
vendored
|
@ -1,25 +0,0 @@
|
||||||
.breatheparameterlist li p {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.breatheenumvalues li p {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container > dl > dt {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container > dl > dt:before {
|
|
||||||
content: " ▼ ";
|
|
||||||
}
|
|
||||||
|
|
||||||
.container > dl > dt.open:before {
|
|
||||||
content: " ▶ ";
|
|
||||||
}
|
|
||||||
|
|
||||||
.container > dl {
|
|
||||||
margin-bottom: 0 !important; /* Dirty hack */
|
|
||||||
}
|
|
17
doc/_templates/page.html
vendored
|
@ -1,17 +0,0 @@
|
||||||
{% extends "!page.html" %}
|
|
||||||
|
|
||||||
{% set css_files = css_files + ["_static/style.css"] %}
|
|
||||||
|
|
||||||
|
|
||||||
{% block footer %}
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() {
|
|
||||||
$(".container > dl > *").hide();
|
|
||||||
$(".container > dl > dt").show();
|
|
||||||
$(".container > dl > dt").click(function() {
|
|
||||||
$(this).parent().children().not("dt").toggle(400);
|
|
||||||
$(this).parent().children("dt").toggleClass("open");
|
|
||||||
})
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
|
@ -1,51 +0,0 @@
|
||||||
.. _assertions-ref:
|
|
||||||
|
|
||||||
Assertion reference
|
|
||||||
===================
|
|
||||||
|
|
||||||
This is an exhaustive list of all assertion macros that Criterion provides.
|
|
||||||
|
|
||||||
As each ``assert`` macros have an ``expect`` counterpart with the exact same
|
|
||||||
number of parameters and name suffix, there is no benefit in adding ``expect``
|
|
||||||
macros to this list. Hence only ``assert`` macros are represented here.
|
|
||||||
|
|
||||||
All ``assert`` macros may take an optional ``printf`` format string and
|
|
||||||
parameters.
|
|
||||||
|
|
||||||
Base Assertions
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
.. doxygengroup:: BaseAsserts
|
|
||||||
|
|
||||||
Common Assertions
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
.. doxygengroup:: CommonBinAsserts
|
|
||||||
.. doxygengroup:: CommonUnaryAsserts
|
|
||||||
.. doxygengroup:: FloatAsserts
|
|
||||||
|
|
||||||
String Assertions
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
.. doxygengroup:: StringAsserts
|
|
||||||
|
|
||||||
Wide String Assertions
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
.. doxygengroup:: WideStringAsserts
|
|
||||||
|
|
||||||
Array Assertions
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
.. doxygengroup:: ArrayAsserts
|
|
||||||
.. doxygengroup:: SafeArrCmpAsserts
|
|
||||||
|
|
||||||
Exception Assertions
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
.. doxygengroup:: ExceptionAsserts
|
|
||||||
|
|
||||||
File Assertions
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. doxygengroup:: FileAsserts
|
|
307
doc/conf.py
|
@ -1,307 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
||||||
#sys.path.insert(0, os.path.abspath('.'))
|
|
||||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext")))
|
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
|
||||||
#needs_sphinx = '1.0'
|
|
||||||
|
|
||||||
# hack for readthedocs to cause it to run doxygen first
|
|
||||||
# https://github.com/rtfd/readthedocs.org/issues/388
|
|
||||||
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
|
|
||||||
if on_rtd:
|
|
||||||
from subprocess import call
|
|
||||||
call('doxygen')
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
|
||||||
# ones.
|
|
||||||
extensions = [
|
|
||||||
'sphinx.ext.autodoc',
|
|
||||||
'sphinx.ext.todo',
|
|
||||||
'sphinx.ext.viewcode',
|
|
||||||
'breathe',
|
|
||||||
]
|
|
||||||
|
|
||||||
breathe_projects = { "criterion-doxygen": "doxyxml/" }
|
|
||||||
breathe_default_project = "criterion-doxygen"
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
|
||||||
templates_path = ['_templates']
|
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
#source_encoding = 'utf-8-sig'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General information about the project.
|
|
||||||
project = u'Criterion'
|
|
||||||
copyright = u'2015-2016, Franklin "Snaipe" Mathieu'
|
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
|
||||||
# |version| and |release|, also used in various other places throughout the
|
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
# The short X.Y version.
|
|
||||||
version = '2.3.0-rc1'
|
|
||||||
# The full version, including alpha/beta/rc tags.
|
|
||||||
release = version
|
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
||||||
# for a list of supported languages.
|
|
||||||
#language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
|
||||||
# non-false value, then it is used:
|
|
||||||
#today = ''
|
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
#today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
|
||||||
# directories to ignore when looking for source files.
|
|
||||||
exclude_patterns = ['_build', 'html', 'doctrees']
|
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all
|
|
||||||
# documents.
|
|
||||||
#default_role = None
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
#add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
#add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
#show_authors = False
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = 'sphinx'
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
#modindex_common_prefix = []
|
|
||||||
|
|
||||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
|
||||||
#keep_warnings = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ----------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
|
||||||
# a list of builtin themes.
|
|
||||||
html_theme = 'default'
|
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
|
||||||
# further. For a list of options available for each theme, see the
|
|
||||||
# documentation.
|
|
||||||
#html_theme_options = {}
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
|
||||||
#html_theme_path = []
|
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
|
||||||
# "<project> v<release> documentation".
|
|
||||||
#html_title = None
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
#html_short_title = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
#html_logo = None
|
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon of the
|
|
||||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
#html_favicon = None
|
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
||||||
html_static_path = ['_static']
|
|
||||||
|
|
||||||
# Add any extra paths that contain custom files (such as robots.txt or
|
|
||||||
# .htaccess) here, relative to this directory. These files are copied
|
|
||||||
# directly to the root of the documentation.
|
|
||||||
#html_extra_path = []
|
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
|
||||||
# using the given strftime format.
|
|
||||||
#html_last_updated_fmt = '%b %d, %Y'
|
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
|
||||||
# typographically correct entities.
|
|
||||||
#html_use_smartypants = True
|
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
|
||||||
#html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
|
||||||
# template names.
|
|
||||||
#html_additional_pages = {}
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#html_domain_indices = True
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
#html_use_index = True
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
#html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
#html_show_sourcelink = True
|
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
|
||||||
#html_show_sphinx = True
|
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
|
||||||
#html_show_copyright = True
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
#html_use_opensearch = ''
|
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
#html_file_suffix = None
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'CriterionDoc'
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
|
||||||
|
|
||||||
latex_elements = {
|
|
||||||
# The paper size ('letterpaper' or 'a4paper').
|
|
||||||
#'papersize': 'letterpaper',
|
|
||||||
|
|
||||||
# The font size ('10pt', '11pt' or '12pt').
|
|
||||||
#'pointsize': '10pt',
|
|
||||||
|
|
||||||
# Additional stuff for the LaTeX preamble.
|
|
||||||
#'preamble': '',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (source start file, target name, title,
|
|
||||||
# author, documentclass [howto, manual, or own class]).
|
|
||||||
latex_documents = [
|
|
||||||
('index', 'criterion.tex', u'Criterion Documentation',
|
|
||||||
u'Franklin "Snaipe" Mathieu', 'manual'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
#latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
#latex_use_parts = False
|
|
||||||
|
|
||||||
# If true, show page references after internal links.
|
|
||||||
#latex_show_pagerefs = False
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#latex_show_urls = False
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#latex_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#latex_domain_indices = True
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output ---------------------------------------
|
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
|
||||||
# (source start file, name, description, authors, manual section).
|
|
||||||
man_pages = [
|
|
||||||
('index', 'criterion', u'Criterion Documentation',
|
|
||||||
[u'Franklin "Snaipe" Mathieu'], 3)
|
|
||||||
]
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#man_show_urls = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Texinfo output -------------------------------------------
|
|
||||||
|
|
||||||
# Grouping the document tree into Texinfo files. List of tuples
|
|
||||||
# (source start file, target name, title, author,
|
|
||||||
# dir menu entry, description, category)
|
|
||||||
texinfo_documents = [
|
|
||||||
('index', 'Criterion', u'Criterion Documentation',
|
|
||||||
u'Criterion', 'Criterion', '',
|
|
||||||
''),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
#texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Epub output ---------------------------------------------------
|
|
||||||
|
|
||||||
# Bibliographic Dublin Core info.
|
|
||||||
epub_title = u'Criterion'
|
|
||||||
epub_author = u'Franklin "Snaipe" Mathieu'
|
|
||||||
epub_publisher = u'Franklin "Snaipe" Mathieu'
|
|
||||||
epub_copyright = copyright
|
|
||||||
|
|
||||||
# The language of the text. It defaults to the language option
|
|
||||||
# or en if the language is not set.
|
|
||||||
#epub_language = ''
|
|
||||||
|
|
||||||
# The scheme of the identifier. Typical schemes are ISBN or URL.
|
|
||||||
#epub_scheme = ''
|
|
||||||
|
|
||||||
# The unique identifier of the text. This can be a ISBN number
|
|
||||||
# or the project homepage.
|
|
||||||
#epub_identifier = ''
|
|
||||||
|
|
||||||
# A unique identification for the text.
|
|
||||||
#epub_uid = ''
|
|
||||||
|
|
||||||
# A tuple containing the cover image and cover page html template filenames.
|
|
||||||
#epub_cover = ()
|
|
||||||
|
|
||||||
# HTML files that should be inserted before the pages created by sphinx.
|
|
||||||
# The format is a list of tuples containing the path and title.
|
|
||||||
#epub_pre_files = []
|
|
||||||
|
|
||||||
# HTML files shat should be inserted after the pages created by sphinx.
|
|
||||||
# The format is a list of tuples containing the path and title.
|
|
||||||
#epub_post_files = []
|
|
||||||
|
|
||||||
# A list of files that should not be packed into the epub file.
|
|
||||||
#epub_exclude_files = []
|
|
||||||
|
|
||||||
# The depth of the table of contents in toc.ncx.
|
|
||||||
#epub_tocdepth = 3
|
|
||||||
|
|
||||||
# Allow duplicate toc entries.
|
|
||||||
#epub_tocdup = True
|
|
||||||
|
|
||||||
# Highlight PHP without starting <?php tag
|
|
||||||
from sphinx.highlighting import lexers
|
|
||||||
from pygments.lexers.c_cpp import CLexer
|
|
||||||
|
|
||||||
lexers['c'] = CLexer(startinline=True)
|
|
Before Width: | Height: | Size: 76 KiB |
|
@ -1,61 +0,0 @@
|
||||||
Debugging and Coverage information
|
|
||||||
==================================
|
|
||||||
|
|
||||||
.. _gdb-ref:
|
|
||||||
|
|
||||||
|
|
||||||
Debugging with GDB
|
|
||||||
------------------
|
|
||||||
|
|
||||||
In one terminal do:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
$ ./simple.c.bin --debug
|
|
||||||
Process simple.c.bin created; pid = 20803
|
|
||||||
Listening on port 1234
|
|
||||||
|
|
||||||
In another terminal connect to this debug session:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
$ gdb -q ./test
|
|
||||||
Reading symbols from ./test...done.
|
|
||||||
(gdb) target remote localhost:1234
|
|
||||||
Remote debugging using localhost:1234
|
|
||||||
0x00007ffff7dd9d90 in _start() from target:/lib64/ld-linux-x86-64.so.2
|
|
||||||
(gdb) continue
|
|
||||||
...
|
|
||||||
[Inferior 1 (process 25269) exited normally]
|
|
||||||
(gdb) q
|
|
||||||
|
|
||||||
After ``continue`` the first test is run:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
Remote debugging from host 127.0.0.1
|
|
||||||
[RUN ] misc::failing
|
|
||||||
[----] /media/data/devel/Criterion/samples/simple.c:4: Assertion failed: The expression 0 is false.
|
|
||||||
[FAIL] misc::failing: (0,00s)
|
|
||||||
|
|
||||||
Child exited with status 0
|
|
||||||
|
|
||||||
And a new process is created for the next test:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
Process /media/data/devel/Criterion/build/samples/simple.c.bin created; pid = 26414
|
|
||||||
Listening on port 1234
|
|
||||||
|
|
||||||
Connect your remote debugger to this test with ``remote target localhost:1234``
|
|
||||||
and run the test with ``continue``
|
|
||||||
|
|
||||||
To use a different port use ``--debug --debug-transport=<protocol>:<port>``
|
|
||||||
|
|
||||||
.. _coverage-ref:
|
|
||||||
|
|
||||||
Coverage of Criterion tests
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
To use gcov, you have to compile your tests with the two GCC Options
|
|
||||||
``-fprofile-arcs`` and ``–ftest-coverage``.
|
|
102
doc/env.rst
|
@ -1,102 +0,0 @@
|
||||||
Environment and CLI
|
|
||||||
===================
|
|
||||||
|
|
||||||
Tests built with Criterion expose by default various command line switchs
|
|
||||||
and environment variables to alter their runtime behaviour.
|
|
||||||
|
|
||||||
Command line arguments
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
* ``-h or --help``: Show a help message with the available switches.
|
|
||||||
* ``-q or --quiet``: Disables all logging.
|
|
||||||
* ``-v or --version``: Prints the version of criterion that has been
|
|
||||||
linked against.
|
|
||||||
* ``-l or --list``: Print all the tests in a list.
|
|
||||||
* ``-f or --fail-fast``: Exit after the first test failure.
|
|
||||||
* ``--ascii``: Don't use fancy unicode symbols or colors in the output.
|
|
||||||
* ``-jN or --jobs N``: Use ``N`` parallel jobs to run the tests. ``0`` picks
|
|
||||||
a number of jobs ideal for your hardware configuration.
|
|
||||||
* ``--filter [PATTERN]``: Run tests whose string identifier matches
|
|
||||||
the given shell wildcard pattern (see dedicated section below). (\*nix only)
|
|
||||||
* ``--debug[=debugger]``: Run tests with a debugging server attached.
|
|
||||||
``debugger`` can be 'gdb', 'lldb', or 'windbg' (windows only).
|
|
||||||
* ``--debug-transport [TRANSPORT]``: Make the debugging server use the
|
|
||||||
specified remote transport. Only transports of the form ``tcp:port`` are
|
|
||||||
currently supported. ``tcp:1234`` is the default.
|
|
||||||
* ``--no-early-exit``: This flag is deprecated and no longer does anything.
|
|
||||||
* ``-S or --short-filename``: The filenames are displayed in their short form.
|
|
||||||
* ``--always-succeed``: The process shall exit with a status of ``0``.
|
|
||||||
* ``--tap[=FILE]``: Writes a TAP (Test Anything Protocol) report to FILE.
|
|
||||||
No file or ``"-"`` means ``stderr`` and implies ``--quiet``. This option is
|
|
||||||
equivalent to ``--output=tap:FILE``.
|
|
||||||
* ``--xml[=FILE]``: Writes JUnit4 XML report to FILE.
|
|
||||||
No file or ``"-"`` means ``stderr`` and implies ``--quiet``. This option is
|
|
||||||
equivalent to ``--output=tap:FILE``.
|
|
||||||
* ``--json[=FILE]``: Writes a JSON report to FILE.
|
|
||||||
No file or ``"-"`` means ``stderr`` and implies ``--quiet``. This option is
|
|
||||||
equivalent to ``--output=tap:FILE``.
|
|
||||||
* ``--verbose[=level]``: Makes the output verbose. When provided with an integer,
|
|
||||||
sets the verbosity level to that integer.
|
|
||||||
* ``-OPROVIDER:FILE or --output=PROVIDER:FILE``: Write a test report to FILE
|
|
||||||
using the output provider named by PROVIDER.
|
|
||||||
If FILE is ``"-"``, it implies ``--quiet``, and the report shall be written
|
|
||||||
to ``stderr``.
|
|
||||||
|
|
||||||
Shell Wildcard Pattern
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Extglob patterns in criterion are matched against a test's string identifier.
|
|
||||||
|
|
||||||
In the table below, a ``pattern-list`` is a list of patterns separated by ``|``.
|
|
||||||
Any extglob pattern can be constructed by combining any of the following
|
|
||||||
sub-patterns:
|
|
||||||
|
|
||||||
==================== ======================================================
|
|
||||||
Pattern Meaning
|
|
||||||
==================== ======================================================
|
|
||||||
``*`` matches everything
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``?`` matches any character
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``[seq]`` matches any character in *seq*
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``[!seq]`` matches any character not in *seq*
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``?(pattern-list)`` Matches zero or one occurrence of the given patterns
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``*(pattern-list)`` Matches zero or more occurrences of the given patterns
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``+(pattern-list)`` Matches one or more occurrences of the given patterns
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``@(pattern-list)`` Matches one of the given patterns
|
|
||||||
-------------------- ------------------------------------------------------
|
|
||||||
``!(pattern-list)`` Matches anything except one of the given patterns
|
|
||||||
==================== ======================================================
|
|
||||||
|
|
||||||
A test string identifier is of the form ``suite-name/test-name``, so a pattern
|
|
||||||
of ``simple/*`` matches every tests in the ``simple`` suite, ``*/passing``
|
|
||||||
matches all tests named ``passing`` regardless of the suite, and ``*`` matches
|
|
||||||
every possible test.
|
|
||||||
|
|
||||||
Environment Variables
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Environment variables are alternatives to command line switches when set to 1.
|
|
||||||
|
|
||||||
* ``CRITERION_ALWAYS_SUCCEED``: Same as ``--always-succeed``.
|
|
||||||
* ``CRITERION_FAIL_FAST``: Same as ``--fail-fast``.
|
|
||||||
* ``CRITERION_USE_ASCII``: Same as ``--ascii``.
|
|
||||||
* ``CRITERION_JOBS``: Same as ``--jobs``. Sets the number of jobs to
|
|
||||||
its value.
|
|
||||||
* ``CRITERION_SHORT_FILENAME``: Same as ``--short-filename``.
|
|
||||||
* ``CRITERION_VERBOSITY_LEVEL``: Same as ``--verbose``. Sets the verbosity level
|
|
||||||
to its value.
|
|
||||||
* ``CRITERION_TEST_PATTERN``: Same as ``--pattern``. Sets the test pattern
|
|
||||||
to its value. (\*nix only)
|
|
||||||
* ``CRITERION_DISABLE_TIME_MEASUREMENTS``: Disables any time measurements on
|
|
||||||
the tests.
|
|
||||||
* ``CRITERION_OUTPUTS``: Can be set to a comma-separated list of
|
|
||||||
``PROVIDER:FILE`` entries. For instance, setting the variable to
|
|
||||||
``tap:foo.tap,xml:bar.xml`` has the same effect as specifying ``--tap=foo.tap``
|
|
||||||
and ``--xml=bar.xml`` at once.
|
|
||||||
* ``CRITERION_ENABLE_TAP``: (Deprecated, use CRITERION_OUTPUTS) Same as ``--tap``.
|
|
18
doc/faq.rst
|
@ -1,18 +0,0 @@
|
||||||
F.A.Q
|
|
||||||
=====
|
|
||||||
|
|
||||||
**Q. When running the test suite in Windows' cmd.exe, the test executable
|
|
||||||
prints weird characters, how do I fix that?**
|
|
||||||
|
|
||||||
A. Windows' ``cmd.exe`` is not an unicode ANSI-compatible terminal emulator.
|
|
||||||
There are plenty of ways to fix that behaviour:
|
|
||||||
|
|
||||||
* Pass ``--ascii`` to the test suite when executing.
|
|
||||||
* Define the ``CRITERION_USE_ASCII`` environment variable to ``1``.
|
|
||||||
* Get a better terminal emulator, such as the one shipped with Git or Cygwin.
|
|
||||||
|
|
||||||
**Q. I'm having an issue with the library, what can I do ?**
|
|
||||||
|
|
||||||
A. Open a new issue on the `github issue tracker <https://github.com/Snaipe/Criterion/issues>`_,
|
|
||||||
and describe the problem you are experiencing, along with the platform you are
|
|
||||||
running criterion on.
|
|
|
@ -1,73 +0,0 @@
|
||||||
Report Hooks
|
|
||||||
============
|
|
||||||
|
|
||||||
Report hooks are functions that are called at key moments during the testing
|
|
||||||
process. These are useful to report statistics gathered during the execution.
|
|
||||||
|
|
||||||
A report hook can be declared using the ``ReportHook`` macro:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
#include <criterion/hooks.h>
|
|
||||||
|
|
||||||
ReportHook(Phase)() {
|
|
||||||
}
|
|
||||||
|
|
||||||
The macro takes a Phase parameter that indicates the phase at which the function
|
|
||||||
shall be run. Valid phases are described below.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
There are no guarantees regarding the order of execution of report hooks
|
|
||||||
on the same phase. In other words, all report hooks of a specific phase could
|
|
||||||
be executed in any order.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
Aborting the runner with any means (abort(), exit(), cr_assert(), ...) is
|
|
||||||
unsupported. If you need to abort the runner, you need to iterate all
|
|
||||||
subsequent tests and set their `disabled` field to 1.
|
|
||||||
|
|
||||||
Testing Phases
|
|
||||||
--------------
|
|
||||||
|
|
||||||
The flow of the test process goes as follows:
|
|
||||||
|
|
||||||
1. ``PRE_ALL``: occurs before running the tests.
|
|
||||||
#. ``PRE_SUITE``: occurs before a suite is initialized.
|
|
||||||
#. ``PRE_INIT``: occurs before a test is initialized.
|
|
||||||
#. ``PRE_TEST``: occurs after the test initialization, but before the test is run.
|
|
||||||
#. ``ASSERT``: occurs when an assertion is hit
|
|
||||||
#. ``THEORY_FAIL``: occurs when a theory iteration fails.
|
|
||||||
#. ``TEST_CRASH``: occurs when a test crashes unexpectedly.
|
|
||||||
#. ``POST_TEST``: occurs after a test ends, but before the test finalization.
|
|
||||||
#. ``POST_FINI``: occurs after a test finalization.
|
|
||||||
#. ``POST_SUITE``: occurs before a suite is finalized.
|
|
||||||
#. ``POST_ALL``: occurs after all the tests are done.
|
|
||||||
|
|
||||||
Hook Parameters
|
|
||||||
---------------
|
|
||||||
|
|
||||||
A report hook takes exactly one parameter.
|
|
||||||
Valid types for each phases are:
|
|
||||||
|
|
||||||
* ``struct criterion_test_set *`` for ``PRE_ALL``.
|
|
||||||
* ``struct criterion_suite_set *`` for ``PRE_SUITE``.
|
|
||||||
* ``struct criterion_test *`` for ``PRE_INIT`` and ``PRE_TEST``.
|
|
||||||
* ``struct criterion_assert_stats *`` for ``ASSERT``.
|
|
||||||
* ``struct criterion_theory_stats *`` for ``THEORY_FAIL``.
|
|
||||||
* ``struct criterion_test_stats *`` for ``POST_TEST``, ``POST_FINI``, and ``TEST_CRASH``.
|
|
||||||
* ``struct criterion_suite_stats *`` for ``POST_SUITE``.
|
|
||||||
* ``struct criterion_global_stats *`` for ``POST_ALL``.
|
|
||||||
|
|
||||||
For instance, this is a valid report hook declaration for the ``PRE_TEST`` phase:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
#include <criterion/hooks.h>
|
|
||||||
|
|
||||||
ReportHook(PRE_TEST)(struct criterion_test *test) {
|
|
||||||
// using the parameter
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
Criterion
|
|
||||||
=========
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
intro
|
|
||||||
setup
|
|
||||||
starter
|
|
||||||
assert
|
|
||||||
hooks
|
|
||||||
logging
|
|
||||||
env
|
|
||||||
output
|
|
||||||
parameterized
|
|
||||||
theories
|
|
||||||
internal
|
|
||||||
debug
|
|
||||||
faq
|
|
|
@ -1,86 +0,0 @@
|
||||||
Changing the internals
|
|
||||||
======================
|
|
||||||
|
|
||||||
Providing your own main
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
If you are not satisfied with the default CLI or environment variables, you
|
|
||||||
can define your own main function.
|
|
||||||
|
|
||||||
Configuring the test runner
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
First and foremost, you need to generate the test set; this is done by calling
|
|
||||||
``criterion_initialize()``. The function returns a ``struct criterion_test_set *``,
|
|
||||||
that you need to pass to ``criterion_run_all_tests`` later on.
|
|
||||||
|
|
||||||
At the very end of your main, you also need to call ``criterion_finalize`` with
|
|
||||||
the test set as parameter to free any ressources initialized by criterion earlier.
|
|
||||||
|
|
||||||
You'd usually want to configure the test runner before calling it.
|
|
||||||
Configuration is done by setting fields in a global variable named
|
|
||||||
``criterion_options`` (include criterion/options.h).
|
|
||||||
|
|
||||||
Here is an exhaustive list of these fields:
|
|
||||||
|
|
||||||
=================== ================================== ==============================================================
|
|
||||||
Field Type Description
|
|
||||||
=================== ================================== ==============================================================
|
|
||||||
logging_threshold enum criterion_logging_level The logging level
|
|
||||||
------------------- ---------------------------------- --------------------------------------------------------------
|
|
||||||
logger struct criterion_logger * The logger (see below)
|
|
||||||
------------------- ---------------------------------- --------------------------------------------------------------
|
|
||||||
always_succeed bool True iff criterion_run_all_tests should always returns 1
|
|
||||||
------------------- ---------------------------------- --------------------------------------------------------------
|
|
||||||
use_ascii bool True iff the outputs should use the ASCII charset
|
|
||||||
------------------- ---------------------------------- --------------------------------------------------------------
|
|
||||||
fail_fast bool True iff the test runner should abort after the first failure
|
|
||||||
------------------- ---------------------------------- --------------------------------------------------------------
|
|
||||||
pattern const char * The pattern of the tests that should be executed
|
|
||||||
=================== ================================== ==============================================================
|
|
||||||
|
|
||||||
if you want criterion to provide its own default CLI parameters and environment
|
|
||||||
variables handling, you can also call ``criterion_handle_args(int argc, char *argv[], bool handle_unknown_arg)``
|
|
||||||
with the proper ``argc/argv``. ``handle_unknown_arg``, if set to true, is here
|
|
||||||
to tell criterion to print its usage when an unknown CLI parameter is encountered.
|
|
||||||
If you want to add your own parameters, you should set it to false.
|
|
||||||
|
|
||||||
The function returns 0 if the main should exit immediately, and 1 if it should
|
|
||||||
continue.
|
|
||||||
|
|
||||||
Starting the test runner
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The test runner can be called with ``criterion_run_all_tests``. The function
|
|
||||||
returns 0 if one test or more failed, 1 otherwise.
|
|
||||||
|
|
||||||
Example main
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
struct criterion_test_set *tests = criterion_initialize();
|
|
||||||
|
|
||||||
int result = 0;
|
|
||||||
if (criterion_handle_args(argc, argv, true))
|
|
||||||
result = !criterion_run_all_tests(tests);
|
|
||||||
|
|
||||||
criterion_finalize(tests);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Implementing your own logger
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
In case you are not satisfied by the default logger, you can implement
|
|
||||||
yours. To do so, simply set the ``logger`` option to your custom
|
|
||||||
logger.
|
|
||||||
|
|
||||||
Each function contained in the structure is called during one of the standard
|
|
||||||
phase of the criterion runner.
|
|
||||||
|
|
||||||
For more insight on how to implement this, see other existing loggers
|
|
||||||
in ``src/log/``.
|
|
|
@ -1,33 +0,0 @@
|
||||||
Introduction
|
|
||||||
============
|
|
||||||
|
|
||||||
Criterion is a dead-simple, non-intrusive unit testing framework for C and C++.
|
|
||||||
|
|
||||||
Philosophy
|
|
||||||
----------
|
|
||||||
|
|
||||||
Most test frameworks for C require a lot of boilerplate code to
|
|
||||||
set up tests and test suites -- you need to create a main,
|
|
||||||
then register new test suites, then register the tests within
|
|
||||||
these suits, and finally call the right functions.
|
|
||||||
|
|
||||||
This gives the user great control, at the unfortunate cost of simplicity.
|
|
||||||
|
|
||||||
Criterion follows the KISS principle, while keeping the control
|
|
||||||
the user would have with other frameworks.
|
|
||||||
|
|
||||||
Features
|
|
||||||
--------
|
|
||||||
|
|
||||||
* C99 and C++11 compatible.
|
|
||||||
* Tests are automatically registered when declared.
|
|
||||||
* Implements a xUnit framework structure.
|
|
||||||
* A default entry point is provided, no need to declare a main
|
|
||||||
unless you want to do special handling.
|
|
||||||
* Test are isolated in their own process, crashes and signals can be
|
|
||||||
reported and tested.
|
|
||||||
* Unified interface between C and C++: include the criterion header and it *just* works.
|
|
||||||
* Supports parameterized tests and theories.
|
|
||||||
* Progress and statistics can be followed in real time with report hooks.
|
|
||||||
* TAP output format can be enabled with an option.
|
|
||||||
* Runs on Linux, FreeBSD, Mac OS X, and Windows (Compiling with MinGW GCC and Visual Studio 2015+).
|
|
|
@ -1,61 +0,0 @@
|
||||||
Logging messages
|
|
||||||
================
|
|
||||||
|
|
||||||
Sometimes, it might be useful to print some output from within a test
|
|
||||||
or fixture -- and while this can be done trivially with a ``printf``,
|
|
||||||
it doesn't integrate well with the current output, nor does it work
|
|
||||||
*at all* when the process is testing a redirected stdout.
|
|
||||||
|
|
||||||
For these cases, Criterion exposes a logging facility:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
#include <criterion/logging.h>
|
|
||||||
|
|
||||||
Test(suite_name, test_name) {
|
|
||||||
cr_log_info("This is an informational message. They are not displayed "
|
|
||||||
"by default.");
|
|
||||||
cr_log_warn("This is a warning. They indicate some possible malfunction "
|
|
||||||
"or misconfiguration in the test.");
|
|
||||||
cr_log_error("This is an error. They indicate serious problems and "
|
|
||||||
"are usually shown before the test is aborted.");
|
|
||||||
}
|
|
||||||
|
|
||||||
``cr_log_info``, ``cr_log_warn`` and ``cr_log_error`` are all macros expanding
|
|
||||||
to a call to the ``cr_log`` function. All of them take a mandatory format string,
|
|
||||||
followed by optional parameters; for instance:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
cr_log_info("%d + %d = %d", 1, 2, 3);
|
|
||||||
|
|
||||||
If using C++, the output stream objects ``info``, ``warn`` and ``error`` are
|
|
||||||
defined within the ``criterion::logging`` namespace, and can be used in
|
|
||||||
conjunction with ``operator<<``:
|
|
||||||
|
|
||||||
.. code-block:: c++
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
#include <criterion/logging.h>
|
|
||||||
|
|
||||||
using criterion::logging::info;
|
|
||||||
using criterion::logging::warn;
|
|
||||||
using criterion::logging::error;
|
|
||||||
|
|
||||||
Test(suite_name, test_name) {
|
|
||||||
info << "This is an informational message. "
|
|
||||||
<< "They are not displayed by default."
|
|
||||||
<< std::flush;
|
|
||||||
warn << "This is a warning. "
|
|
||||||
<< "They indicate some possible malfunction "
|
|
||||||
<< "or misconfiguration in the test."
|
|
||||||
<< std::flush;
|
|
||||||
error << "This is an error. "
|
|
||||||
<< "They indicate serious problems and "
|
|
||||||
<< "are usually shown before the test is aborted."
|
|
||||||
<< std::flush;
|
|
||||||
}
|
|
||||||
|
|
||||||
Note that empty messages are ignored, and newlines in the log message splits
|
|
||||||
the passed string into as many messages are there are lines.
|
|
|
@ -1,44 +0,0 @@
|
||||||
Writing tests reports in a custom format
|
|
||||||
========================================
|
|
||||||
|
|
||||||
Outputs providers are used to write tests reports in the format of your choice:
|
|
||||||
for instance, TAP and XML reporting are implemented with output providers.
|
|
||||||
|
|
||||||
Adding a custom output provider
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
An output provider is a function with the following signature:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
void func(FILE *out, struct criterion_global_stats *stats);
|
|
||||||
|
|
||||||
Once implemented, you then need to register it as an output provider:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
criterion_register_output_provider("provider name", func);
|
|
||||||
|
|
||||||
This needs to be done before the test runner stops, so you may want to register
|
|
||||||
it either in a self-provided main, or in a PRE_ALL or POST_ALL report hook.
|
|
||||||
|
|
||||||
Writing to a file with an output provider
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
To tell criterion to write a report to a specific file using the output provider
|
|
||||||
of your choice, you can either pass ``--output`` as a command-line
|
|
||||||
parameter:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
./my_tests --output="provider name":/path/to/file
|
|
||||||
|
|
||||||
Or, you can do so directly by calling ``criterion_add_output`` before the
|
|
||||||
runner stops:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
criterion_add_output("provider name", "/path/to/file");
|
|
||||||
|
|
||||||
The path may be relative. If ``"-"`` is passed as a filename, the report will
|
|
||||||
be written to ``stderr``.
|
|
|
@ -1,177 +0,0 @@
|
||||||
Using parameterized tests
|
|
||||||
=========================
|
|
||||||
|
|
||||||
Parameterized tests are useful to repeat a specific test logic over a finite
|
|
||||||
set of parameters.
|
|
||||||
|
|
||||||
Due to limitations on how generated parameters are passed, parameterized tests
|
|
||||||
can only accept one pointer parameter; however, this is not that much of a
|
|
||||||
problem since you can just pass a structure containing the context you need.
|
|
||||||
|
|
||||||
Adding parameterized tests
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
Adding parameterized tests is done by defining the parameterized test function,
|
|
||||||
and the parameter generator function:
|
|
||||||
|
|
||||||
.. doxygengroup:: ParameterizedBase
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/parameterized.h>
|
|
||||||
|
|
||||||
ParameterizedTestParameters(suite_name, test_name) {
|
|
||||||
void *params;
|
|
||||||
size_t nb_params;
|
|
||||||
|
|
||||||
// generate parameter set
|
|
||||||
return cr_make_param_array(Type, params, nb_params);
|
|
||||||
}
|
|
||||||
|
|
||||||
ParameterizedTest(Type *param, suite_name, test_name) {
|
|
||||||
// contents of the test
|
|
||||||
}
|
|
||||||
|
|
||||||
``suite_name`` and ``test_name`` are the identifiers of the test suite and
|
|
||||||
the test, respectively. These identifiers must follow the language
|
|
||||||
identifier format.
|
|
||||||
|
|
||||||
``Type`` is the compound type of the generated array. ``params`` and ``nb_params``
|
|
||||||
are the pointer and the length of the generated array, respectively.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
The parameter array must be reachable after the function returns -- as
|
|
||||||
such, local arrays must be declared with `static` or dynamically allocated.
|
|
||||||
|
|
||||||
Passing multiple parameters
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
As said earlier, parameterized tests only take one parameter, so passing
|
|
||||||
multiple parameters is, in the strict sense, not possible. However, one can
|
|
||||||
easily use a struct to hold the context as a workaround:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/parameterized.h>
|
|
||||||
|
|
||||||
struct my_params {
|
|
||||||
int param0;
|
|
||||||
double param1;
|
|
||||||
...
|
|
||||||
};
|
|
||||||
|
|
||||||
ParameterizedTestParameters(suite_name, test_name) {
|
|
||||||
static struct my_params params[] = {
|
|
||||||
// parameter set
|
|
||||||
};
|
|
||||||
|
|
||||||
size_t nb_params = sizeof (params) / sizeof (struct my_params);
|
|
||||||
return cr_make_param_array(struct my_params, params, nb_params);
|
|
||||||
}
|
|
||||||
|
|
||||||
ParameterizedTest(struct my_params *param, suite_name, test_name) {
|
|
||||||
// access param.param0, param.param1, ...
|
|
||||||
}
|
|
||||||
|
|
||||||
C++ users can also use a simpler syntax before returning an array of parameters:
|
|
||||||
|
|
||||||
.. code-block:: c++
|
|
||||||
|
|
||||||
ParameterizedTestParameters(suite_name, test_name) {
|
|
||||||
static struct my_params params[] = {
|
|
||||||
// parameter set
|
|
||||||
};
|
|
||||||
|
|
||||||
return criterion_test_params(params);
|
|
||||||
}
|
|
||||||
|
|
||||||
Dynamically allocating parameters
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Any dynamic memory allocation done from a ParameterizedTestParameter function
|
|
||||||
**must** be done with ``cr_malloc``, ``cr_calloc``, or ``cr_realloc``.
|
|
||||||
|
|
||||||
Any pointer returned by those 3 functions must be passed to ``cr_free`` after
|
|
||||||
you have no more use of it.
|
|
||||||
|
|
||||||
It is undefined behaviour to use any other allocation function (such as ``malloc``)
|
|
||||||
from the scope of a ParameterizedTestParameter function.
|
|
||||||
|
|
||||||
In C++, these methods should not be called explicitely -- instead, you should
|
|
||||||
use:
|
|
||||||
|
|
||||||
* ``criterion::new_obj<Type>(params...)`` to allocate an object of type ``Type``
|
|
||||||
and call its constructor taking ``params...``.
|
|
||||||
The function possess the exact same semantics as ``new Type(params...)``.
|
|
||||||
* ``criterion::delete_obj(obj)`` to destroy an object previously allocated by
|
|
||||||
``criterion::new_obj``.
|
|
||||||
The function possess the exact same semantics as ``delete obj``.
|
|
||||||
* ``criterion::new_arr<Type>(size)`` to allocate an array of objects of type ``Type``
|
|
||||||
and length ``size``. ``Type`` is initialized by calling its default constructor.
|
|
||||||
The function possess the exact same semantics as ``new Type[size]``.
|
|
||||||
* ``criterion::delete_arr(array)`` to destroy an array previously allocated by
|
|
||||||
``criterion::new_arr``.
|
|
||||||
The function possess the exact same semantics as ``delete[] array``.
|
|
||||||
|
|
||||||
Furthermore, the ``criterion::allocator<T>`` allocator can be used with STL
|
|
||||||
containers to allocate memory with the functions above.
|
|
||||||
|
|
||||||
Freeing dynamically allocated parameter fields
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
One can pass an extra parameter to ``cr_make_param_array`` to specify
|
|
||||||
the cleanup function that should be called on the generated parameter context:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/parameterized.h>
|
|
||||||
|
|
||||||
struct my_params {
|
|
||||||
int *some_int_ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
void cleanup_params(struct criterion_test_params *ctp) {
|
|
||||||
cr_free(((struct my_params *) ctp->params)->some_int_ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
ParameterizedTestParameters(suite_name, test_name) {
|
|
||||||
static my_params params[] = {{
|
|
||||||
.some_int_ptr = cr_malloc(sizeof (int));
|
|
||||||
}};
|
|
||||||
param[0].some_int_ptr = 42;
|
|
||||||
|
|
||||||
return cr_make_param_array(struct my_params, params, 1, cleanup_params);
|
|
||||||
}
|
|
||||||
|
|
||||||
C++ users can use a more convenient approach:
|
|
||||||
|
|
||||||
.. code-block:: c++
|
|
||||||
|
|
||||||
#include <criterion/parameterized.h>
|
|
||||||
|
|
||||||
struct my_params {
|
|
||||||
std::unique_ptr<int, decltype(criterion::free)> some_int_ptr;
|
|
||||||
|
|
||||||
my_params(int *ptr) : some_int_ptr(ptr, criterion::free) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
ParameterizedTestParameters(suite_name, test_name) {
|
|
||||||
static criterion::parameters<my_params> params;
|
|
||||||
params.push_back(my_params(criterion::new_obj<int>(42)));
|
|
||||||
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
|
|
||||||
``criterion::parameters<T>`` is typedef'd as ``std::vector<T, criterion::allocator<T>>``.
|
|
||||||
|
|
||||||
Configuring parameterized tests
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
Parameterized tests can optionally recieve configuration parameters to alter
|
|
||||||
their own behaviour, and are applied to each iteration of the parameterized
|
|
||||||
test individually (this means that the initialization and finalization runs once
|
|
||||||
per iteration).
|
|
||||||
Those parameters are the same ones as the ones of the ``Test`` macro function
|
|
||||||
(c.f. :ref:`test-config-ref`).
|
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
breathe
|
|
Before Width: | Height: | Size: 1.3 MiB |
|
@ -1,43 +0,0 @@
|
||||||
Setup
|
|
||||||
=====
|
|
||||||
|
|
||||||
Prerequisites
|
|
||||||
-------------
|
|
||||||
|
|
||||||
The library is supported on Linux, OS X, FreeBSD, and Windows.
|
|
||||||
|
|
||||||
The following compilers are supported to compile both the library and the tests:
|
|
||||||
|
|
||||||
* GCC 4.9+ (Can be relaxed to GCC 4.6+ when not using C++)
|
|
||||||
* Clang 3.4+
|
|
||||||
* MSVC 14+ (Included in Visual Studio 2015 or later)
|
|
||||||
|
|
||||||
Building from source
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
$ mkdir build
|
|
||||||
$ cd build
|
|
||||||
$ cmake ..
|
|
||||||
$ cmake --build .
|
|
||||||
|
|
||||||
Installing the library and language files (Linux, OS X, FreeBSD)
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
From the build directory created above, run with an elevated shell:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
$ make install
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
To compile your tests with Criterion, you need to make sure to:
|
|
||||||
|
|
||||||
1. Add the include directory to the header search path
|
|
||||||
2. Install the library to your library search path
|
|
||||||
3. Link Criterion to your executable.
|
|
||||||
|
|
||||||
This should be all you need.
|
|
181
doc/starter.rst
|
@ -1,181 +0,0 @@
|
||||||
Getting started
|
|
||||||
===============
|
|
||||||
|
|
||||||
Adding tests
|
|
||||||
------------
|
|
||||||
|
|
||||||
Adding tests is done using the ``Test`` macro:
|
|
||||||
|
|
||||||
.. doxygendefine:: Test
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
Test(suite_name, test_name) {
|
|
||||||
// test contents
|
|
||||||
}
|
|
||||||
|
|
||||||
``suite_name`` and ``test_name`` are the identifiers of the test suite and
|
|
||||||
the test, respectively. These identifiers must follow the language
|
|
||||||
identifier format.
|
|
||||||
|
|
||||||
Tests are automatically sorted by suite, then by name using the alphabetical
|
|
||||||
order.
|
|
||||||
|
|
||||||
Asserting things
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Assertions come in two kinds:
|
|
||||||
|
|
||||||
* ``cr_assert*`` are assertions that are fatal to the current test if failed;
|
|
||||||
in other words, if the condition evaluates to ``false``, the test is
|
|
||||||
marked as a failure and the execution of the function is aborted.
|
|
||||||
* ``cr_expect*`` are, in the other hand, assertions that are not fatal to the
|
|
||||||
test. Execution will continue even if the condition evaluates to
|
|
||||||
``false``, but the test will be marked as a failure.
|
|
||||||
|
|
||||||
``cr_assert()`` and ``cr_expect()`` are the most simple kinds of assertions
|
|
||||||
criterion has to offer. They both take a mandatory condition as a first
|
|
||||||
parameter, and an optional failure message:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
Test(sample, test) {
|
|
||||||
cr_expect(strlen("Test") == 4, "Expected \"Test\" to have a length of 4.");
|
|
||||||
cr_expect(strlen("Hello") == 4, "This will always fail, why did I add this?");
|
|
||||||
cr_assert(strlen("") == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
On top of those, more assertions are available for common operations. See
|
|
||||||
:ref:`assertions-ref` for a complete list.
|
|
||||||
|
|
||||||
Configuring tests
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Tests may receive optional configuration parameters to alter their behaviour
|
|
||||||
or provide additional metadata.
|
|
||||||
|
|
||||||
Fixtures
|
|
||||||
~~~~~~~~
|
|
||||||
|
|
||||||
Tests that need some setup and teardown can register functions that will
|
|
||||||
run before and after the test function:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
void setup(void) {
|
|
||||||
puts("Runs before the test");
|
|
||||||
}
|
|
||||||
|
|
||||||
void teardown(void) {
|
|
||||||
puts("Runs after the test");
|
|
||||||
}
|
|
||||||
|
|
||||||
Test(suite_name, test_name, .init = setup, .fini = teardown) {
|
|
||||||
// test contents
|
|
||||||
}
|
|
||||||
|
|
||||||
If a setup crashes, you will get a warning message, and the test will be aborted
|
|
||||||
and marked as a failure.
|
|
||||||
Is a teardown crashes, you will get a warning message, and the test will keep
|
|
||||||
its result.
|
|
||||||
|
|
||||||
Testing signals
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
If a test receives a signal, it will by default be marked as a failure.
|
|
||||||
You can, however, expect a test to only pass if a special kind of signal
|
|
||||||
is received:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
// This test will fail
|
|
||||||
Test(sample, failing) {
|
|
||||||
int *ptr = NULL;
|
|
||||||
*ptr = 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This test will pass
|
|
||||||
Test(sample, passing, .signal = SIGSEGV) {
|
|
||||||
int *ptr = NULL;
|
|
||||||
*ptr = 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
This feature will also work (to some extent) on Windows for the
|
|
||||||
following signals on some exceptions:
|
|
||||||
|
|
||||||
======== =====================================================================
|
|
||||||
Signal Triggered by
|
|
||||||
======== =====================================================================
|
|
||||||
SIGSEGV STATUS_ACCESS_VIOLATION, STATUS_DATATYPE_MISALIGNMENT,
|
|
||||||
STATUS_ARRAY_BOUNDS_EXCEEDED, STATUS_GUARD_PAGE_VIOLATION,
|
|
||||||
STATUS_IN_PAGE_ERROR, STATUS_NO_MEMORY, STATUS_INVALID_DISPOSITION,
|
|
||||||
STATUS_STACK_OVERFLOW
|
|
||||||
-------- ---------------------------------------------------------------------
|
|
||||||
SIGILL STATUS_ILLEGAL_INSTRUCTION, STATUS_PRIVILEGED_INSTRUCTION,
|
|
||||||
STATUS_NONCONTINUABLE_EXCEPTION
|
|
||||||
-------- ---------------------------------------------------------------------
|
|
||||||
SIGINT STATUS_CONTROL_C_EXIT
|
|
||||||
-------- ---------------------------------------------------------------------
|
|
||||||
SIGFPE STATUS_FLOAT_DENORMAL_OPERAND, STATUS_FLOAT_DIVIDE_BY_ZERO,
|
|
||||||
STATUS_FLOAT_INEXACT_RESULT, STATUS_FLOAT_INVALID_OPERATION,
|
|
||||||
STATUS_FLOAT_OVERFLOW, STATUS_FLOAT_STACK_CHECK,
|
|
||||||
STATUS_FLOAT_UNDERFLOW, STATUS_INTEGER_DIVIDE_BY_ZERO,
|
|
||||||
STATUS_INTEGER_OVERFLOW
|
|
||||||
-------- ---------------------------------------------------------------------
|
|
||||||
SIGALRM STATUS_TIMEOUT
|
|
||||||
======== =====================================================================
|
|
||||||
|
|
||||||
See the `windows exception reference`_ for more details on each exception.
|
|
||||||
|
|
||||||
.. _windows exception reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679356(v=vs.85).aspx
|
|
||||||
|
|
||||||
.. _test-config-ref:
|
|
||||||
|
|
||||||
Configuration reference
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Here is an exhaustive list of all possible configuration parameters you can
|
|
||||||
pass:
|
|
||||||
|
|
||||||
.. doxygenstruct:: criterion_test_extra_data
|
|
||||||
:members:
|
|
||||||
|
|
||||||
Setting up suite-wise configuration
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
Tests under the same suite can have a suite-wise configuration -- this is done
|
|
||||||
using the ``TestSuite`` macro:
|
|
||||||
|
|
||||||
.. doxygendefine:: TestSuite
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
TestSuite(suite_name, [params...]);
|
|
||||||
|
|
||||||
Test(suite_name, test_1) {
|
|
||||||
}
|
|
||||||
|
|
||||||
Test(suite_name, test_2) {
|
|
||||||
}
|
|
||||||
|
|
||||||
Configuration parameters are the same as above, but applied to the suite itself.
|
|
||||||
|
|
||||||
Suite fixtures are run *along with* test fixtures.
|
|
221
doc/theories.rst
|
@ -1,221 +0,0 @@
|
||||||
Using theories
|
|
||||||
==============
|
|
||||||
|
|
||||||
`Theories`_ are a powerful tool for test-driven development, allowing you
|
|
||||||
to test a specific behaviour against all permutations of a set of user-defined
|
|
||||||
parameters known as "data points".
|
|
||||||
|
|
||||||
.. _Theories: http://web.archive.org/web/20110608210825/http://shareandenjoy.saff.net/tdd-specifications.pdf
|
|
||||||
|
|
||||||
Adding theories
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. doxygengroup:: TheoryBase
|
|
||||||
|
|
||||||
Adding theories is done by defining data points and a theory function:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/theories.h>
|
|
||||||
|
|
||||||
TheoryDataPoints(suite_name, test_name) = {
|
|
||||||
DataPoints(Type0, val0, val1, val2, ..., valN),
|
|
||||||
DataPoints(Type1, val0, val1, val2, ..., valN),
|
|
||||||
...
|
|
||||||
DataPoints(TypeN, val0, val1, val2, ..., valN),
|
|
||||||
}
|
|
||||||
|
|
||||||
Theory((Type0 arg0, Type1 arg1, ..., TypeN argN), suite_name, test_name) {
|
|
||||||
}
|
|
||||||
|
|
||||||
``suite_name`` and ``test_name`` are the identifiers of the test suite and
|
|
||||||
the test, respectively. These identifiers must follow the language
|
|
||||||
identifier format.
|
|
||||||
|
|
||||||
``Type0/arg0`` through ``TypeN/argN`` are the parameter types and names of theory
|
|
||||||
theory function and are available in the body of the function.
|
|
||||||
|
|
||||||
Datapoints are declared in the same number, type, and order than the parameters
|
|
||||||
inside the ``TheoryDataPoints`` macro, with the ``DataPoints`` macro.
|
|
||||||
Beware! It is undefined behaviour to not have a matching number and type of
|
|
||||||
theory parameters and datatypes.
|
|
||||||
|
|
||||||
Each ``DataPoints`` must then specify the values that will be used for the
|
|
||||||
theory parameter it is linked to (``val0`` through ``valN``).
|
|
||||||
|
|
||||||
Assertions and invariants
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
You can use any ``cr_assert`` or ``cr_expect`` macro functions inside the body of a
|
|
||||||
theory function.
|
|
||||||
|
|
||||||
Theory invariants are enforced through the ``cr_assume(Condition)`` macro function:
|
|
||||||
if ``Condition`` is false, then the current theory iteration aborts without
|
|
||||||
making the test fail.
|
|
||||||
|
|
||||||
On top of those, more ``assume`` macro functions are available for common operations:
|
|
||||||
|
|
||||||
.. doxygengroup:: TheoryInvariants
|
|
||||||
|
|
||||||
Configuring theories
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Theories can optionally recieve configuration parameters to alter the behaviour
|
|
||||||
of the underlying test; as such, those parameters are the same ones as the ones
|
|
||||||
of the ``Test`` macro function (c.f. :ref:`test-config-ref`).
|
|
||||||
|
|
||||||
Full sample & purpose of theories
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
We will illustrate how useful theories are with a simple example using Criterion:
|
|
||||||
|
|
||||||
The basics of theories
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Let us imagine that we want to test if the algebraic properties of integers,
|
|
||||||
and specifically concerning multiplication, are respected by the C language:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
int my_mul(int lhs, int rhs) {
|
|
||||||
return lhs * rhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
Now, we know that multiplication over integers is commutative, so we first test
|
|
||||||
that:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/criterion.h>
|
|
||||||
|
|
||||||
Test(algebra, multiplication_is_commutative) {
|
|
||||||
cr_assert_eq(my_mul(2, 3), my_mul(3, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
However, this test is imperfect, because there is not enough triangulation to
|
|
||||||
insure that my_mul is indeed commutative. One might be tempted to add more
|
|
||||||
assertions on other values, but this will never be good enough: commutativity
|
|
||||||
should work for *any* pair of integers, not just an arbitrary set, but, to be
|
|
||||||
fair, you cannot just test this behaviour for every integer pair that exists.
|
|
||||||
|
|
||||||
Theories purposely bridge these two issues by introducing the concept of
|
|
||||||
"data point" and by refactoring the repeating logic into a dedicated function:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/theories.h>
|
|
||||||
|
|
||||||
TheoryDataPoints(algebra, multiplication_is_commutative) = {
|
|
||||||
DataPoints(int, [...]),
|
|
||||||
DataPoints(int, [...]),
|
|
||||||
};
|
|
||||||
|
|
||||||
Theory((int lhs, int rhs), algebra, multiplication_is_commutative) {
|
|
||||||
cr_assert_eq(my_mul(lhs, rhs), my_mul(rhs, lhs));
|
|
||||||
}
|
|
||||||
|
|
||||||
As you can see, we refactored the assertion into a theory taking two unspecified
|
|
||||||
integers.
|
|
||||||
|
|
||||||
We first define some data points in the same order and type the parameters have,
|
|
||||||
from left to right: the first ``DataPoints(int, ...)`` will define the set of values passed
|
|
||||||
to the ``int lhs`` parameter, and the second will define the one passed to ``int rhs``.
|
|
||||||
|
|
||||||
Choosing the values of the data point is left to you, but we might as well use
|
|
||||||
"interesting" values: ``0``, ``-1``, ``1``, ``-2``, ``2``, ``INT_MAX``, and ``INT_MIN``:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
TheoryDataPoints(algebra, multiplication_is_commutative) = {
|
|
||||||
DataPoints(int, 0, -1, 1, -2, 2, INT_MAX, INT_MIN),
|
|
||||||
DataPoints(int, 0, -1, 1, -2, 2, INT_MAX, INT_MIN),
|
|
||||||
};
|
|
||||||
|
|
||||||
Using theory invariants
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The second thing we can test on multiplication is that it is the inverse function
|
|
||||||
of division. Then, given the division operation:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
int my_div(int lhs, int rhs) {
|
|
||||||
return lhs / rhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
The associated theory is straight-forward:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#include <criterion/theories.h>
|
|
||||||
|
|
||||||
TheoryDataPoints(algebra, multiplication_is_inverse_of_division) = {
|
|
||||||
DataPoints(int, 0, -1, 1, -2, 2, INT_MAX, INT_MIN),
|
|
||||||
DataPoints(int, 0, -1, 1, -2, 2, INT_MAX, INT_MIN),
|
|
||||||
};
|
|
||||||
|
|
||||||
Theory((int lhs, int rhs), algebra, multiplication_is_inverse_of_division) {
|
|
||||||
cr_assert_eq(lhs, my_div(my_mul(lhs, rhs), rhs));
|
|
||||||
}
|
|
||||||
|
|
||||||
However, we do have a problem because you cannot have the theory function divide
|
|
||||||
by 0. For this purpose, we can ``assume`` than ``rhs`` will never be 0:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
Theory((int lhs, int rhs), algebra, multiplication_is_inverse_of_division) {
|
|
||||||
cr_assume(rhs != 0);
|
|
||||||
cr_assert_eq(lhs, my_div(my_mul(lhs, rhs), rhs));
|
|
||||||
}
|
|
||||||
|
|
||||||
``cr_assume`` will abort the current theory iteration if the condition is not
|
|
||||||
fulfiled.
|
|
||||||
|
|
||||||
Running the test at that point will raise a big problem with the current
|
|
||||||
implementation of ``my_mul`` and ``my_div``:
|
|
||||||
|
|
||||||
.. code-block:: none
|
|
||||||
|
|
||||||
[----] theories.c:24: Assertion failed: (a) == (bad_div(bad_mul(a, b), b))
|
|
||||||
[----] Theory algebra::multiplication_is_inverse_of_division failed with the following parameters: (2147483647, 2)
|
|
||||||
[----] theories.c:24: Assertion failed: (a) == (bad_div(bad_mul(a, b), b))
|
|
||||||
[----] Theory algebra::multiplication_is_inverse_of_division failed with the following parameters: (-2147483648, 2)
|
|
||||||
[----] theories.c:24: Unexpected signal caught below this line!
|
|
||||||
[FAIL] algebra::multiplication_is_inverse_of_division: CRASH!
|
|
||||||
|
|
||||||
The theory shows that ``my_div(my_mul(INT_MAX, 2), 2)`` and ``my_div(my_mul(INT_MIN, 2), 2)``
|
|
||||||
does not respect the properties for multiplication: it happens that the
|
|
||||||
behaviour of these two functions is undefined because the operation overflows.
|
|
||||||
|
|
||||||
Similarly, the test crashes at the end; debugging shows that the source of the
|
|
||||||
crash is the divison of INT_MAX by -1, which is undefined.
|
|
||||||
|
|
||||||
Fixing this is as easy as changing the prototypes of ``my_mul`` and ``my_div``
|
|
||||||
to operate on ``long long`` rather than ``int``.
|
|
||||||
|
|
||||||
What's the difference between theories and parameterized tests ?
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
While it may at first seem that theories and parameterized tests are the same,
|
|
||||||
just because they happen to take multiple parameters does not mean that they
|
|
||||||
logically behave in the same manner.
|
|
||||||
|
|
||||||
Parameterized tests are useful to test a specific logic against a fixed, *finite*
|
|
||||||
set of examples that you need to work.
|
|
||||||
|
|
||||||
Theories are, well, just that: theories. They represent a test against an
|
|
||||||
universal truth, regardless of the input data matching its predicates.
|
|
||||||
|
|
||||||
Implementation-wise, Criterion also marks the separation by the way that both
|
|
||||||
are executed:
|
|
||||||
|
|
||||||
Each parameterized test iteration is run in its own test; this means that
|
|
||||||
one parameterized test acts as a collection of many tests, and gets reported
|
|
||||||
as such.
|
|
||||||
|
|
||||||
On the other hand, a theory act as one single test, since the size and contents
|
|
||||||
of the generated data set is not relevant. It does not make sense to say that
|
|
||||||
an universal truth is "partially true", so if one of the iteration fails, then
|
|
||||||
the whole test fails.
|
|
BIN
images/body-bg.jpg
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
images/code.png
Normal file
After Width: | Height: | Size: 285 B |
BIN
images/download-button.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
images/github-button.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
images/header-bg.jpg
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
images/highlight-bg.jpg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
images/pattern.png
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
images/sidebar-bg.jpg
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
images/tar.png
Normal file
After Width: | Height: | Size: 339 B |
BIN
images/top.png
Normal file
After Width: | Height: | Size: 218 B |
BIN
images/zip.png
Normal file
After Width: | Height: | Size: 337 B |
|
@ -1,66 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* @brief Functions to abort and continue tests
|
|
||||||
*****************************************************************************/
|
|
||||||
#ifndef CRITERION_ABORT_H_
|
|
||||||
#define CRITERION_ABORT_H_
|
|
||||||
|
|
||||||
#include "internal/common.h"
|
|
||||||
|
|
||||||
CR_BEGIN_C_API
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Aborts the current test, marking it as failed.
|
|
||||||
*
|
|
||||||
* This function does not return.
|
|
||||||
*/
|
|
||||||
CR_API CR_NORETURN void criterion_abort_test(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Aborts the current test, marking it as skipped.
|
|
||||||
*
|
|
||||||
* This function does not return.
|
|
||||||
*/
|
|
||||||
CR_API CR_NORETURN void criterion_skip_test(const char *format, ...);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Continues the current test.
|
|
||||||
*
|
|
||||||
* Used as a counterpart to criterion_abort_test.
|
|
||||||
*/
|
|
||||||
CR_API void criterion_continue_test(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Kills the current test, marking it as failed.
|
|
||||||
*
|
|
||||||
* @param[in] msg printf like format string
|
|
||||||
* @param[in] ... Additional arguments depending on msg
|
|
||||||
*/
|
|
||||||
CR_API void criterion_test_die(const char *msg, ...);
|
|
||||||
|
|
||||||
CR_END_C_API
|
|
||||||
|
|
||||||
#endif /* !CRITERION_ABORT_H_ */
|
|
|
@ -1,278 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* @brief Test intern memory managment
|
|
||||||
*****************************************************************************/
|
|
||||||
#ifndef CRITERION_ALLOC_H_
|
|
||||||
#define CRITERION_ALLOC_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# include <memory>
|
|
||||||
# include <cstddef>
|
|
||||||
using std::size_t;
|
|
||||||
#else
|
|
||||||
# include <stddef.h>
|
|
||||||
#endif
|
|
||||||
#include "internal/common.h"
|
|
||||||
|
|
||||||
CR_BEGIN_C_API
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates a block of memory usable by the test.
|
|
||||||
*
|
|
||||||
* It is undefined behaviour to access a pointer returned by malloc(3)
|
|
||||||
* inside a test or its setup and teardown functions; cr_malloc must
|
|
||||||
* be use in its place for this purpose.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to malloc(3).
|
|
||||||
*
|
|
||||||
* @param[in] size The minimal size in bytes of the newly allocated memory.
|
|
||||||
* @returns The pointer to the start of the allocated memory.
|
|
||||||
*/
|
|
||||||
CR_API void *cr_malloc(size_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates and zero-initialize a block of memory usable by the test.
|
|
||||||
*
|
|
||||||
* It is undefined behaviour to access a pointer returned by calloc(3)
|
|
||||||
* inside a test or its setup and teardown functions; cr_calloc must
|
|
||||||
* be use in its place for this purpose.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to calloc(3).
|
|
||||||
*
|
|
||||||
* @param[in] nmemb The number of elements to allocate
|
|
||||||
* @param[in] size The minimal size of each element.
|
|
||||||
* @returns The pointer to the start of the allocated memory.
|
|
||||||
*/
|
|
||||||
CR_API void *cr_calloc(size_t nmemb, size_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reallocates a block of memory usable by the test.
|
|
||||||
*
|
|
||||||
* It is undefined behaviour to access a pointer returned by realloc(3)
|
|
||||||
* inside a test or its setup and teardown functions; cr_realloc must
|
|
||||||
* be used in its place for this purpose.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to realloc(3).
|
|
||||||
*
|
|
||||||
* @param[in] ptr A pointer to the memory that needs to be resized.
|
|
||||||
* @param[in] size The minimal size of the reallocated memory.
|
|
||||||
* @returns The pointer to the start of the reallocated memory.
|
|
||||||
*/
|
|
||||||
CR_API void *cr_realloc(void *ptr, size_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free a block of memory allocated by cr_malloc, cr_free or cr_realloc.
|
|
||||||
*
|
|
||||||
* @param[in] ptr A pointer to the memory that needs to be freed.
|
|
||||||
*/
|
|
||||||
CR_API void cr_free(void *ptr);
|
|
||||||
|
|
||||||
CR_END_C_API
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# include <type_traits>
|
|
||||||
|
|
||||||
namespace criterion
|
|
||||||
{
|
|
||||||
void *(*const malloc)(size_t) = cr_malloc;
|
|
||||||
void(*const free)(void *) = cr_free;
|
|
||||||
void *(*const calloc)(size_t, size_t) = cr_calloc;
|
|
||||||
void *(*const realloc)(void *, size_t) = cr_realloc;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates and construct a new object.
|
|
||||||
*
|
|
||||||
* It is undefined behaviour to access a pointer returned by the new
|
|
||||||
* operator inside a test or its setup and teardown functions;
|
|
||||||
* new_obj must be used in its place for this purpose.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to the new operator.
|
|
||||||
*
|
|
||||||
* @tparam T The type of the object to construct
|
|
||||||
* @param[in] params The constructor parameters of T.
|
|
||||||
* @returns The pointer to the newly constructed object.
|
|
||||||
*/
|
|
||||||
template <typename T, typename... Params>
|
|
||||||
T *new_obj(Params... params)
|
|
||||||
{
|
|
||||||
T *obj = static_cast<T *>(cr_malloc(sizeof (T)));
|
|
||||||
|
|
||||||
new (obj) T(params...);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates and construct a new array of primitive types
|
|
||||||
*
|
|
||||||
* It is undefined behaviour to access a pointer returned by the new[]
|
|
||||||
* operator inside a test or its setup and teardown functions;
|
|
||||||
* new_arr must be used in its place for this purpose.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to the new[] operator.
|
|
||||||
*
|
|
||||||
* @tparam T The compound type of the array to construct
|
|
||||||
* @param[in] len The length of the array.
|
|
||||||
* @returns The pointer to the newly constructed array.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
typename std::enable_if<std::is_fundamental<T>::value>::type
|
|
||||||
* new_arr(size_t len) {
|
|
||||||
void *ptr = cr_malloc(sizeof (size_t) + sizeof (T) * len);
|
|
||||||
|
|
||||||
*(reinterpret_cast<size_t *>(ptr)) = len;
|
|
||||||
T *arr = reinterpret_cast<T *>(reinterpret_cast<size_t *>(ptr) + 1);
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates and construct a new array of object types
|
|
||||||
*
|
|
||||||
* It is undefined behaviour to access a pointer returned by the new[]
|
|
||||||
* operator inside a test or its setup and teardown functions;
|
|
||||||
* new_arr must be used in its place for this purpose.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to the new[] operator.
|
|
||||||
*
|
|
||||||
* @tparam T The compound type of the array to construct
|
|
||||||
* @param[in] len The length of the array.
|
|
||||||
* @returns The pointer to the newly constructed array.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
T *new_arr(size_t len)
|
|
||||||
{
|
|
||||||
void *ptr = cr_malloc(sizeof (size_t) + sizeof (T) * len);
|
|
||||||
|
|
||||||
*(reinterpret_cast<size_t *>(ptr)) = len;
|
|
||||||
|
|
||||||
T *arr = reinterpret_cast<T *>(reinterpret_cast<size_t *>(ptr) + 1);
|
|
||||||
for (size_t i = 0; i < len; ++i)
|
|
||||||
new (arr + i)T();
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys and frees an object allocated by new_obj.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to the delete operator.
|
|
||||||
*
|
|
||||||
* @tparam T The type of the object to construct
|
|
||||||
* @param[in] ptr The object to destroy.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
void delete_obj(T *ptr)
|
|
||||||
{
|
|
||||||
ptr->~T();
|
|
||||||
cr_free(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys and frees an array allocated by delete_arr.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to the delete[] operator.
|
|
||||||
*
|
|
||||||
* @tparam T The type of the object to construct
|
|
||||||
* @param[in] ptr The object to destroy.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
void delete_arr(typename std::enable_if<std::is_fundamental<T>::value>::type *ptr)
|
|
||||||
{
|
|
||||||
cr_free(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys and frees an array allocated by delete_arr.
|
|
||||||
*
|
|
||||||
* This function is semantically identical to the delete[] operator.
|
|
||||||
*
|
|
||||||
* @tparam T The type of the object to construct
|
|
||||||
* @param[in] ptr The object to destroy.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
void delete_arr(T *ptr)
|
|
||||||
{
|
|
||||||
size_t *ptr_ = reinterpret_cast<size_t *>(ptr);
|
|
||||||
size_t len = *(ptr_ - 1);
|
|
||||||
T *arr = reinterpret_cast<T *>(ptr_);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < len; ++i)
|
|
||||||
arr[i].~T();
|
|
||||||
cr_free(ptr_ - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocator for use in the STL.
|
|
||||||
*
|
|
||||||
* This internally uses calls to the cr_malloc function family, which
|
|
||||||
* means that STL collections can be safely used inside tests or
|
|
||||||
* setup/teardown functions if this allocator is used.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
struct allocator {
|
|
||||||
typedef T value_type;
|
|
||||||
typedef value_type *pointer;
|
|
||||||
typedef const value_type *const_pointer;
|
|
||||||
typedef value_type &reference;
|
|
||||||
typedef const value_type &const_reference;
|
|
||||||
typedef std::size_t size_type;
|
|
||||||
typedef std::ptrdiff_t difference_type;
|
|
||||||
|
|
||||||
template <typename U>
|
|
||||||
struct rebind {
|
|
||||||
typedef allocator<U> other;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline explicit allocator() {}
|
|
||||||
inline ~allocator() {}
|
|
||||||
inline explicit allocator(allocator const &) {}
|
|
||||||
template <typename U>
|
|
||||||
inline explicit allocator(allocator<U> const &) {}
|
|
||||||
|
|
||||||
inline pointer address(reference r) { return &r; }
|
|
||||||
inline const_pointer address(const_reference r) { return &r; }
|
|
||||||
|
|
||||||
inline pointer allocate(size_type cnt, typename std::allocator<void>::const_pointer = 0)
|
|
||||||
{
|
|
||||||
return reinterpret_cast<pointer>(cr_malloc(cnt * sizeof (T)));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void deallocate(pointer p, size_type) { cr_free(p); }
|
|
||||||
|
|
||||||
inline size_type max_size() const
|
|
||||||
{
|
|
||||||
return size_type(-1) / sizeof (T);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void construct(pointer p, const T &t) { new(p) T(t); }
|
|
||||||
inline void construct(pointer p, T &&t) { new (p) T(std::move(t)); }
|
|
||||||
inline void destroy(pointer p) { p->~T(); }
|
|
||||||
|
|
||||||
inline bool operator==(allocator const &) { return true; }
|
|
||||||
inline bool operator!=(allocator const &a) { return !operator==(a); }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !CRITERION_ALLOC_H_ */
|
|
|
@ -1,121 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* @brief Include this to use criterion
|
|
||||||
*****************************************************************************/
|
|
||||||
#ifndef CRITERION_H_
|
|
||||||
#define CRITERION_H_
|
|
||||||
|
|
||||||
#include "types.h"
|
|
||||||
#include "assert.h"
|
|
||||||
#include "alloc.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines a new test.
|
|
||||||
*
|
|
||||||
* @param Suite The name of the test suite containing this test.
|
|
||||||
* @param Name The name of the test.
|
|
||||||
* @param ... An optional sequence of designated initializer key/value
|
|
||||||
* pairs as described in the `criterion_test_extra_data` structure
|
|
||||||
* (see criterion/types.h).\n
|
|
||||||
* Example: .exit_code = 1
|
|
||||||
*/
|
|
||||||
#define Test(Suite, Name, ...) internal
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Explicitely defines a test suite and its options.
|
|
||||||
*
|
|
||||||
* @param Name The name of the test suite.
|
|
||||||
* @param ... An optional sequence of designated initializer key/value
|
|
||||||
* pairs as described in the `criterion_test_extra_data` structure
|
|
||||||
* (see criterion/types.h).
|
|
||||||
* These options will provide the defaults for each test.
|
|
||||||
*/
|
|
||||||
#define TestSuite(Name, ...) internal
|
|
||||||
|
|
||||||
CR_BEGIN_C_API
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes criterion and builds a set of all discovered tests.
|
|
||||||
*
|
|
||||||
* Using any of the functions and macros provided by criterion before calling
|
|
||||||
* this results in undefined behaviour.
|
|
||||||
*
|
|
||||||
* @returns the set of tests
|
|
||||||
*/
|
|
||||||
CR_API struct criterion_test_set *criterion_initialize(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Release all resources allocated by criterion.
|
|
||||||
*
|
|
||||||
* Using any of the functions and macros provided by criterion except
|
|
||||||
* criterion_initialize after this function is called results in undefined
|
|
||||||
* behaviour.
|
|
||||||
*/
|
|
||||||
CR_API void criterion_finalize(struct criterion_test_set *tests);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run all the tests in the test set.
|
|
||||||
*
|
|
||||||
* @param[in] tests The set of tests that are to be executed.
|
|
||||||
*
|
|
||||||
* @returns 1 if all tests succeeded or criterion_options.always_succeed
|
|
||||||
* is true, 0 otherwise.
|
|
||||||
*/
|
|
||||||
CR_API int criterion_run_all_tests(struct criterion_test_set *tests);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles all default command-line parameters, as documented in:
|
|
||||||
* <http://criterion.readthedocs.org/en/latest/env.html>, and appropriately
|
|
||||||
* sets criterion_options.
|
|
||||||
*
|
|
||||||
* @param[in] argc The number of arguments in argv.
|
|
||||||
* @param[in] argv A null-terminated array of strings representing the arguments.
|
|
||||||
* @param[in] handle_unknown_arg Whether the function should print a message
|
|
||||||
* and exit when an unknown parameter is encountered. Use false if you want
|
|
||||||
* to handle additional parameters yourself.
|
|
||||||
*
|
|
||||||
* @returns 0 if the process should exit immediately after, for instance after
|
|
||||||
* printing the help message.
|
|
||||||
*/
|
|
||||||
CR_API int criterion_handle_args(int argc, char *argv[], bool handle_unknown_arg);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Manually registers a new test within the specified test set.
|
|
||||||
*
|
|
||||||
* @param[in] tests The set of tests you want to insert the test in.
|
|
||||||
* @param[in] test The newly created test.
|
|
||||||
*/
|
|
||||||
CR_API void criterion_register_test(struct criterion_test_set *tests,
|
|
||||||
struct criterion_test *test);
|
|
||||||
|
|
||||||
CR_API extern const struct criterion_test *const criterion_current_test;
|
|
||||||
CR_API extern const struct criterion_suite *const criterion_current_suite;
|
|
||||||
|
|
||||||
CR_END_C_API
|
|
||||||
|
|
||||||
#include "internal/test.h"
|
|
||||||
|
|
||||||
#endif /* !CRITERION_H_ */
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef CRITERION_EMBEDDED_H_
|
|
||||||
#define CRITERION_EMBEDDED_H_
|
|
||||||
|
|
||||||
typedef signed long long int cr_ssize;
|
|
||||||
typedef unsigned long long int cr_size;
|
|
||||||
typedef unsigned char cr_byte;
|
|
||||||
typedef int cr_err;
|
|
||||||
typedef struct cr_io_ctx cr_io_ctx;
|
|
||||||
|
|
||||||
struct cr_embed_vtable {
|
|
||||||
cr_err (*init)(struct cr_io_ctx *ctx);
|
|
||||||
cr_ssize (*send)(const cr_byte *buf, cr_size size);
|
|
||||||
cr_ssize (*recv)(cr_byte *buf, cr_size size);
|
|
||||||
cr_err (*term)(struct cr_io_ctx *ctx);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct cr_embed_properties {
|
|
||||||
struct cr_embed_vtable vtable;
|
|
||||||
struct cr_io_ctx *ctx;
|
|
||||||
};
|
|
||||||
|
|
||||||
int cr_embed_init(struct cr_embed_properties *props);
|
|
||||||
int cr_embed_term(struct cr_embed_properties *props);
|
|
||||||
|
|
||||||
#endif /* !CRITERION_EMBEDDED_H_ */
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef CRITERION_EVENT_H_
|
|
||||||
#define CRITERION_EVENT_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# include <cstddef>
|
|
||||||
#else
|
|
||||||
# include <stddef.h>
|
|
||||||
#endif
|
|
||||||
#include "internal/common.h"
|
|
||||||
#include "stats.h"
|
|
||||||
|
|
||||||
CR_BEGIN_C_API
|
|
||||||
|
|
||||||
CR_API void criterion_send_assert(struct criterion_assert_stats *stats);
|
|
||||||
|
|
||||||
CR_END_C_API
|
|
||||||
|
|
||||||
#endif /* !CRITERION_EVENT_H_ */
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* @brief Report hooks
|
|
||||||
*****************************************************************************/
|
|
||||||
#ifndef CRITERION_HOOKS_H_
|
|
||||||
#define CRITERION_HOOKS_H_
|
|
||||||
|
|
||||||
#include "internal/hooks.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This enum lists all the phases of the runner lifecycle.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
PRE_ALL,
|
|
||||||
PRE_SUITE,
|
|
||||||
PRE_INIT,
|
|
||||||
PRE_TEST,
|
|
||||||
ASSERT,
|
|
||||||
THEORY_FAIL,
|
|
||||||
TEST_CRASH,
|
|
||||||
POST_TEST,
|
|
||||||
POST_FINI,
|
|
||||||
POST_SUITE,
|
|
||||||
POST_ALL,
|
|
||||||
} e_report_status;
|
|
||||||
|
|
||||||
typedef void (*f_report_hook)();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ReportHook(Kind)(Type *param) { Function Body }
|
|
||||||
*
|
|
||||||
* Defines a report hook for the phase defined by Kind.
|
|
||||||
*
|
|
||||||
* The type of the parameter depends on the phase:
|
|
||||||
*
|
|
||||||
* - struct criterion_test_set for PRE_ALL.
|
|
||||||
* - struct criterion_suite_set for PRE_SUITE.
|
|
||||||
* - struct criterion_test for PRE_INIT and PRE_TEST.
|
|
||||||
* - struct criterion_assert_stats for ASSERT.
|
|
||||||
* - struct criterion_theory_stats for THEORY_FAIL.
|
|
||||||
* - struct criterion_test_stats for POST_TEST, POST_FINI, and TEST_CRASH.
|
|
||||||
* - struct criterion_suite_stats for POST_SUITE.
|
|
||||||
* - struct criterion_global_stats for POST_ALL.
|
|
||||||
*
|
|
||||||
* @param Kind The report phase to hook the function onto.
|
|
||||||
*/
|
|
||||||
#define ReportHook(Kind) CR_REPORT_HOOK_IMPL(Kind)
|
|
||||||
|
|
||||||
#endif /* !CRITERION_HOOKS_H_ */
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef CRITERION_ASPRINTF_COMPAT_H_
|
|
||||||
#define CRITERION_ASPRINTF_COMPAT_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# include <cstdarg>
|
|
||||||
#else
|
|
||||||
# include <stdarg.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
CR_BEGIN_C_API
|
|
||||||
|
|
||||||
CR_FORMAT(printf, 2, 3)
|
|
||||||
CR_API int cr_asprintf(char **strp, const char *fmt, ...);
|
|
||||||
CR_API int cr_vasprintf(char **strp, const char *fmt, va_list ap);
|
|
||||||
CR_API void cr_asprintf_free(char *buf);
|
|
||||||
|
|
||||||
CR_END_C_API
|
|
||||||
|
|
||||||
#endif /* !CRITERION_ASPRINTF_COMPAT_H_ */
|
|
|
@ -1,717 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef CRITERION_INTERNAL_ASSERT_H_
|
|
||||||
#define CRITERION_INTERNAL_ASSERT_H_
|
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
#include "preprocess.h"
|
|
||||||
#include "asprintf-compat.h"
|
|
||||||
#include "designated-initializer-compat.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# include <cstring>
|
|
||||||
# include <cstdlib>
|
|
||||||
# include <cwchar>
|
|
||||||
#else
|
|
||||||
# include <string.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <stdbool.h>
|
|
||||||
# include <wchar.h>
|
|
||||||
#endif
|
|
||||||
#include "../types.h"
|
|
||||||
#include "../stats.h"
|
|
||||||
#include "../hooks.h"
|
|
||||||
#include "../event.h"
|
|
||||||
#include "../abort.h"
|
|
||||||
|
|
||||||
struct criterion_assert_args {
|
|
||||||
const char *msg;
|
|
||||||
int sentinel_;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
constexpr criterion_assert_args(const char *msg) : msg(msg), sentinel_(0) {}
|
|
||||||
constexpr criterion_assert_args(const char *msg, int sentinel_) : msg(msg), sentinel_(sentinel_) {}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Do NOT reorder unless you want to break the ABI */
|
|
||||||
enum criterion_assert_messages {
|
|
||||||
CRITERION_ASSERT_MSG_FAIL,
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE,
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_AS_STRINGS_FALSE,
|
|
||||||
CRITERION_ASSERT_MSG_IS_NULL,
|
|
||||||
CRITERION_ASSERT_MSG_IS_NOT_NULL,
|
|
||||||
CRITERION_ASSERT_MSG_IS_EMPTY,
|
|
||||||
CRITERION_ASSERT_MSG_IS_NOT_EMPTY,
|
|
||||||
CRITERION_ASSERT_MSG_FILE_STR_MATCH,
|
|
||||||
CRITERION_ASSERT_MSG_FILE_MATCH,
|
|
||||||
CRITERION_ASSERT_MSG_THROW,
|
|
||||||
CRITERION_ASSERT_MSG_NO_THROW,
|
|
||||||
CRITERION_ASSERT_MSG_ANY_THROW,
|
|
||||||
CRITERION_ASSERT_MSG_NONE_THROW,
|
|
||||||
};
|
|
||||||
|
|
||||||
CR_BEGIN_C_API
|
|
||||||
|
|
||||||
CR_API char *cr_translate_assert_msg(int msg_index, ...);
|
|
||||||
|
|
||||||
CR_END_C_API
|
|
||||||
|
|
||||||
#define CR_GET_CONDITION(Condition, ...) Condition
|
|
||||||
#define CR_GET_CONDITION_STR(Condition, ...) #Condition
|
|
||||||
#define CR_VA_SKIP(_, ...) __VA_ARGS__
|
|
||||||
|
|
||||||
#define CR_TRANSLATE_DEF_MSG__(Arg) \
|
|
||||||
CR_IDENTITY Arg
|
|
||||||
|
|
||||||
#define CR_TRANSLATE_DEF_MSG_(...) \
|
|
||||||
CR_EXPAND(cr_translate_assert_msg( \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
"" CR_TRANSLATE_DEF_MSG__(CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__))) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define CR_INIT_STATS_(MsgVar, Shifted, ...) \
|
|
||||||
CR_EXPAND( \
|
|
||||||
do { \
|
|
||||||
char *cr_def_msg__ = CR_EXPAND(CR_TRANSLATE_DEF_MSG_(__VA_ARGS__)); \
|
|
||||||
char *cr_fmt_msg__ = NULL; \
|
|
||||||
cr_asprintf(&cr_fmt_msg__, "x" CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))); \
|
|
||||||
if (cr_fmt_msg__ && cr_fmt_msg__[1]) { \
|
|
||||||
MsgVar = cr_fmt_msg__ + 1; \
|
|
||||||
Shifted = 1; \
|
|
||||||
cr_asprintf_free(cr_def_msg__); \
|
|
||||||
} else { \
|
|
||||||
MsgVar = cr_def_msg__; \
|
|
||||||
cr_asprintf_free(cr_fmt_msg__); \
|
|
||||||
} \
|
|
||||||
} while (0))
|
|
||||||
|
|
||||||
#define CR_FAIL_ABORT_ criterion_abort_test
|
|
||||||
#define CR_FAIL_CONTINUES_ criterion_continue_test
|
|
||||||
|
|
||||||
#define cr_assert_impl(Fail, Condition, ...) \
|
|
||||||
do { \
|
|
||||||
bool cr_passed__ = !!(Condition); \
|
|
||||||
char *cr_msg__ = NULL; \
|
|
||||||
int cr_shifted__ = 0; \
|
|
||||||
\
|
|
||||||
CR_EXPAND(CR_INIT_STATS_(cr_msg__, cr_shifted__, \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__))); \
|
|
||||||
struct criterion_assert_stats cr_stat__; \
|
|
||||||
cr_stat__.passed = cr_passed__; \
|
|
||||||
cr_stat__.file = __FILE__; \
|
|
||||||
cr_stat__.line = __LINE__; \
|
|
||||||
cr_stat__.message = cr_msg__; \
|
|
||||||
criterion_send_assert(&cr_stat__); \
|
|
||||||
\
|
|
||||||
cr_asprintf_free(cr_msg__ - cr_shifted__); \
|
|
||||||
\
|
|
||||||
if (!cr_passed__) \
|
|
||||||
Fail(); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define cr_fail(Fail, ...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
0, \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_FAIL, \
|
|
||||||
(), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_skip(...) \
|
|
||||||
criterion_skip_test("" __VA_ARGS__)
|
|
||||||
|
|
||||||
#define cr_assert_(...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
CR_FAIL_ABORT_, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR(CR_VA_HEAD(__VA_ARGS__))), \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_expect_(...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
CR_FAIL_CONTINUES_, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR(CR_VA_HEAD(__VA_ARGS__))), \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_not_(...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
CR_FAIL_ABORT_, \
|
|
||||||
!(CR_VA_HEAD(__VA_ARGS__)), \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR(!(CR_VA_HEAD(__VA_ARGS__)))), \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_expect_not_(...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
CR_FAIL_CONTINUES_, \
|
|
||||||
!(CR_VA_HEAD(__VA_ARGS__)), \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR(!(CR_VA_HEAD(__VA_ARGS__)))), \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Binary */
|
|
||||||
|
|
||||||
#define cr_assert_op_(Fail, Op, Actual, Expected, ...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
(Actual) Op (Expected), \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR((Actual) Op (Expected))), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_op_va_(Fail, Op, ...) \
|
|
||||||
CR_EXPAND(cr_assert_op_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Unary */
|
|
||||||
|
|
||||||
#define cr_assert_null_op_(Fail, Op, Msg, Value, ...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
(Value) Op NULL, \
|
|
||||||
dummy, \
|
|
||||||
Msg, \
|
|
||||||
(CR_STR(Value)), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_null_op_va_(Fail, Op, Msg, ...) \
|
|
||||||
CR_EXPAND(cr_assert_null_op_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
Msg, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Floating point */
|
|
||||||
|
|
||||||
#define cr_assert_float_eq_op_(Actual, Expected, Epsilon) \
|
|
||||||
(Expected) - (Actual) <= (Epsilon) && (Actual) - (Expected) <= (Epsilon)
|
|
||||||
|
|
||||||
#define cr_assert_float_neq_op_(Actual, Expected, Epsilon) \
|
|
||||||
(Expected) - (Actual) > (Epsilon) || (Actual) - (Expected) > (Epsilon)
|
|
||||||
|
|
||||||
#define cr_assert_float_op_(Fail, Op, Actual, Expected, Epsilon, ...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
Op (Actual, Expected, Epsilon), \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR(Op (Actual, Expected, Epsilon))), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_float_op_va_(Fail, Op, ...) \
|
|
||||||
CR_EXPAND(cr_assert_float_op_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* String */
|
|
||||||
|
|
||||||
#define cr_assert_str_op_empty_(Fail, Op, Msg, Value, ...) \
|
|
||||||
do { \
|
|
||||||
const char *cr_str_value__ = (Value); \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
((cr_str_value__) != NULL) && (cr_str_value__)[0] Op '\0', \
|
|
||||||
dummy, \
|
|
||||||
((cr_str_value__) != NULL) ? Msg : CRITERION_ASSERT_MSG_IS_NULL, \
|
|
||||||
(CR_STR(Value), cr_str_value__), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
)); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define cr_assert_str_op_empty_va_(Fail, Op, Msg, ...) \
|
|
||||||
CR_EXPAND(cr_assert_str_op_empty_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
Msg, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_str_op_(Fail, Op, Actual, Expected, ...) \
|
|
||||||
do { \
|
|
||||||
const char *cr_str_actual__ = (Actual); \
|
|
||||||
const char *cr_str_expected__ = (Expected); \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
((cr_str_actual__) != NULL) && ((cr_str_expected__) != NULL) \
|
|
||||||
&& CR_STDN strcmp((cr_str_actual__), (cr_str_expected__)) Op 0, \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_AS_STRINGS_FALSE, \
|
|
||||||
(CR_STR((Actual) Op (Expected)), cr_str_actual__, cr_str_expected__), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
)); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define cr_assert_str_op_va_(Fail, Op, ...) \
|
|
||||||
CR_EXPAND(cr_assert_str_op_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Wide String */
|
|
||||||
|
|
||||||
#define cr_assert_wcs_op_empty_(Fail, Op, Msg, Value, ...) \
|
|
||||||
do { \
|
|
||||||
const wchar_t *cr_wcs_value__ = (Value); \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
((cr_wcs_value__) != NULL) && (cr_wcs_value__)[0] Op L'\0', \
|
|
||||||
dummy, \
|
|
||||||
((cr_wcs_value__) != NULL) ? Msg : CRITERION_ASSERT_MSG_IS_NULL, \
|
|
||||||
(CR_STR(Value), cr_wcs_value__), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
)); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define cr_assert_wcs_op_empty_va_(Fail, Op, Msg, ...) \
|
|
||||||
CR_EXPAND(cr_assert_wcs_op_empty_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
Msg, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_wcs_op_(Fail, Op, Actual, Expected, ...) \
|
|
||||||
do { \
|
|
||||||
const wchar_t *cr_wcs_actual__ = (Actual); \
|
|
||||||
const wchar_t *cr_wcs_expected__ = (Expected); \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
((cr_wcs_actual__) != NULL) && ((cr_wcs_expected__) != NULL) \
|
|
||||||
&& CR_STDN wcscmp((cr_wcs_actual__), (cr_wcs_expected__)) Op 0, \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR((Actual) Op (Expected))), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
)); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define cr_assert_wcs_op_va_(Fail, Op, ...) \
|
|
||||||
CR_EXPAND(cr_assert_wcs_op_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Array */
|
|
||||||
|
|
||||||
#define cr_assert_mem_op_(Fail, Op, Actual, Expected, Size, ...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
CR_STDN memcmp((Actual), (Expected), (Size)) Op 0, \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR((Actual)[0..Size] Op (Expected)[0..Size])), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_mem_op_va_(Fail, Op, ...) \
|
|
||||||
CR_EXPAND(cr_assert_mem_op_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Array comparisons */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# define CR_ARR_COMPARE_(A, B, Size, Cmp, Result) \
|
|
||||||
int Result = std::lexicographical_compare((A), (A) + Size, (B), (B) + Size, Cmp)
|
|
||||||
#else
|
|
||||||
# define CR_ARR_COMPARE_(A, B, Size, Cmp, Result) \
|
|
||||||
__typeof__ (&(A)[0])first = (A); \
|
|
||||||
__typeof__ (&(B)[0])second = (B); \
|
|
||||||
int Result = 0; \
|
|
||||||
size_t i, size; \
|
|
||||||
for (i = 0, size = (Size); !Result && i < size; ++i) \
|
|
||||||
Result = Cmp(first + i, second + i)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define cr_assert_arr_op_cmp_(Fail, Op, Actual, Expected, Size, Cmp, ...) \
|
|
||||||
do { \
|
|
||||||
CR_ARR_COMPARE_(Actual, Expected, Size, Cmp, order); \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
order Op 0, \
|
|
||||||
dummy, \
|
|
||||||
CRITERION_ASSERT_MSG_EXPR_FALSE, \
|
|
||||||
(CR_STR((Actual)[0..Size] Op (Expected)[0..Size])), \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
)); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define cr_assert_arr_op_cmp_va_(Fail, Op, ...) \
|
|
||||||
CR_EXPAND(cr_assert_arr_op_cmp_( \
|
|
||||||
Fail, \
|
|
||||||
Op, \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)))), \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)))) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Exceptions */
|
|
||||||
|
|
||||||
#define cr_assert_throw_abort_(Fail, Msg, MsgArgs, ...) \
|
|
||||||
CR_EXPAND(cr_assert_impl( \
|
|
||||||
Fail, \
|
|
||||||
0, \
|
|
||||||
dummy, \
|
|
||||||
Msg, \
|
|
||||||
MsgArgs, \
|
|
||||||
CR_VA_TAIL(__VA_ARGS__) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_throw_(Fail, Statement, Exception, ...) \
|
|
||||||
try { \
|
|
||||||
Statement; \
|
|
||||||
} catch (Exception const &) { \
|
|
||||||
} catch (...) { \
|
|
||||||
CR_EXPAND(cr_assert_throw_abort_( \
|
|
||||||
Fail, \
|
|
||||||
CRITERION_ASSERT_MSG_NO_THROW, \
|
|
||||||
(CR_STR(Statement), CR_STR(Exception)), \
|
|
||||||
__VA_ARGS__)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define cr_assert_throw_va_(...) \
|
|
||||||
CR_EXPAND(cr_assert_throw_( \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \
|
|
||||||
dummy, \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_no_throw_(Fail, Statement, Exception, ...) \
|
|
||||||
try { \
|
|
||||||
Statement; \
|
|
||||||
} catch (Exception const &) { \
|
|
||||||
CR_EXPAND(cr_assert_throw_abort_( \
|
|
||||||
Fail, \
|
|
||||||
CRITERION_ASSERT_MSG_THROW, \
|
|
||||||
(CR_STR(Statement), CR_STR(Exception)), \
|
|
||||||
__VA_ARGS__)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define cr_assert_no_throw_va_(...) \
|
|
||||||
CR_EXPAND(cr_assert_no_throw_( \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \
|
|
||||||
dummy, \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_any_throw_(Fail, Statement, ...) \
|
|
||||||
try { \
|
|
||||||
Statement; \
|
|
||||||
CR_EXPAND(cr_assert_throw_abort_( \
|
|
||||||
Fail, \
|
|
||||||
CRITERION_ASSERT_MSG_ANY_THROW, \
|
|
||||||
(CR_STR(Statement)), \
|
|
||||||
__VA_ARGS__)); \
|
|
||||||
} catch (...) {}
|
|
||||||
|
|
||||||
#define cr_assert_any_throw_va_(...) \
|
|
||||||
CR_EXPAND(cr_assert_any_throw_( \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
dummy, \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \
|
|
||||||
))
|
|
||||||
|
|
||||||
#define cr_assert_none_throw_(Fail, Statement, ...) \
|
|
||||||
try { \
|
|
||||||
Statement; \
|
|
||||||
} catch (...) { \
|
|
||||||
CR_EXPAND(cr_assert_throw_abort_( \
|
|
||||||
Fail, \
|
|
||||||
CRITERION_ASSERT_MSG_NONE_THROW, \
|
|
||||||
(CR_STR(Statement)), \
|
|
||||||
__VA_ARGS__)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define cr_assert_none_throw_va_(...) \
|
|
||||||
CR_EXPAND(cr_assert_none_throw_( \
|
|
||||||
CR_VA_HEAD(__VA_ARGS__), \
|
|
||||||
CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \
|
|
||||||
dummy, \
|
|
||||||
CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \
|
|
||||||
))
|
|
||||||
|
|
||||||
/* Messages */
|
|
||||||
|
|
||||||
#define CRITERION_GNUC_WARN__(Msg) \
|
|
||||||
_Pragma(#Msg)
|
|
||||||
|
|
||||||
#define CRITERION_GNUC_WARN_(Name) \
|
|
||||||
CRITERION_GNUC_WARN__( \
|
|
||||||
message \
|
|
||||||
"The `" #Name "` macro is only available on GNU C compilers." \
|
|
||||||
)
|
|
||||||
|
|
||||||
/* Actual implementation */
|
|
||||||
|
|
||||||
#undef cr_skip_test
|
|
||||||
#define cr_skip_test(...) CR_EXPAND(cr_skip(__VA_ARGS__))
|
|
||||||
#undef cr_assert_fail
|
|
||||||
#define cr_assert_fail(...) CR_EXPAND(cr_fail(CR_FAIL_ABORT_, __VA_ARGS__))
|
|
||||||
#undef cr_expect_fail
|
|
||||||
#define cr_expect_fail(...) CR_EXPAND(cr_fail(CR_FAIL_CONTINUES_, __VA_ARGS__))
|
|
||||||
#undef cr_assert
|
|
||||||
#define cr_assert(...) CR_EXPAND(cr_assert_(__VA_ARGS__))
|
|
||||||
#undef cr_expect
|
|
||||||
#define cr_expect(...) CR_EXPAND(cr_expect_(__VA_ARGS__))
|
|
||||||
#undef cr_assert_not
|
|
||||||
#define cr_assert_not(...) CR_EXPAND(cr_assert_not_(__VA_ARGS__))
|
|
||||||
#undef cr_expect_not
|
|
||||||
#define cr_expect_not(...) CR_EXPAND(cr_expect_not_(__VA_ARGS__))
|
|
||||||
#undef cr_assert_eq
|
|
||||||
#define cr_assert_eq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_expect_eq
|
|
||||||
#define cr_expect_eq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_assert_neq
|
|
||||||
#define cr_assert_neq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, !=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_neq
|
|
||||||
#define cr_expect_neq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, !=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_lt
|
|
||||||
#define cr_assert_lt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, <, __VA_ARGS__))
|
|
||||||
#undef cr_expect_lt
|
|
||||||
#define cr_expect_lt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, <, __VA_ARGS__))
|
|
||||||
#undef cr_assert_leq
|
|
||||||
#define cr_assert_leq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, <=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_leq
|
|
||||||
#define cr_expect_leq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, <=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_gt
|
|
||||||
#define cr_assert_gt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, >, __VA_ARGS__))
|
|
||||||
#undef cr_expect_gt
|
|
||||||
#define cr_expect_gt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, >, __VA_ARGS__))
|
|
||||||
#undef cr_assert_geq
|
|
||||||
#define cr_assert_geq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, >=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_geq
|
|
||||||
#define cr_expect_geq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, >=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_null
|
|
||||||
#define cr_assert_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_ABORT_, ==, CRITERION_ASSERT_MSG_IS_NOT_NULL, __VA_ARGS__))
|
|
||||||
#undef cr_expect_null
|
|
||||||
#define cr_expect_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_CONTINUES_, ==, CRITERION_ASSERT_MSG_IS_NOT_NULL, __VA_ARGS__))
|
|
||||||
#undef cr_assert_not_null
|
|
||||||
#define cr_assert_not_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_ABORT_, !=, CRITERION_ASSERT_MSG_IS_NULL, __VA_ARGS__))
|
|
||||||
#undef cr_expect_not_null
|
|
||||||
#define cr_expect_not_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_CONTINUES_, !=, CRITERION_ASSERT_MSG_IS_NULL, __VA_ARGS__))
|
|
||||||
#undef cr_assert_float_eq
|
|
||||||
#define cr_assert_float_eq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_ABORT_, cr_assert_float_eq_op_, __VA_ARGS__))
|
|
||||||
#undef cr_expect_float_eq
|
|
||||||
#define cr_expect_float_eq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_CONTINUES_, cr_assert_float_eq_op_, __VA_ARGS__))
|
|
||||||
#undef cr_assert_float_neq
|
|
||||||
#define cr_assert_float_neq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_ABORT_, cr_assert_float_neq_op_, __VA_ARGS__))
|
|
||||||
#undef cr_expect_float_neq
|
|
||||||
#define cr_expect_float_neq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_CONTINUES_, cr_assert_float_neq_op_, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_empty
|
|
||||||
#define cr_assert_str_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_ABORT_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_empty
|
|
||||||
#define cr_expect_str_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_CONTINUES_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_not_empty
|
|
||||||
#define cr_assert_str_not_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_ABORT_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_not_empty
|
|
||||||
#define cr_expect_str_not_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_CONTINUES_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_eq
|
|
||||||
#define cr_assert_str_eq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_eq
|
|
||||||
#define cr_expect_str_eq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_neq
|
|
||||||
#define cr_assert_str_neq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, !=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_neq
|
|
||||||
#define cr_expect_str_neq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, !=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_lt
|
|
||||||
#define cr_assert_str_lt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, <, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_lt
|
|
||||||
#define cr_expect_str_lt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, <, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_leq
|
|
||||||
#define cr_assert_str_leq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, <=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_leq
|
|
||||||
#define cr_expect_str_leq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, <=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_gt
|
|
||||||
#define cr_assert_str_gt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, >, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_gt
|
|
||||||
#define cr_expect_str_gt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, >, __VA_ARGS__))
|
|
||||||
#undef cr_assert_str_geq
|
|
||||||
#define cr_assert_str_geq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, >=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_str_geq
|
|
||||||
#define cr_expect_str_geq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, >=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_empty
|
|
||||||
#define cr_assert_wcs_empty(...) CR_EXPAND(cr_assert_wcs_op_empty_va_(CR_FAIL_ABORT_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_empty
|
|
||||||
#define cr_expect_wcs_empty(...) CR_EXPAND(cr_assert_wcs_op_empty_va_(CR_FAIL_CONTINUES_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_not_empty
|
|
||||||
#define cr_assert_wcs_not_empty(...) CR_EXPAND(cr_assert_wcs_op_empty_va_(CR_FAIL_ABORT_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_not_empty
|
|
||||||
#define cr_expect_wcs_not_empty(...) CR_EXPAND(cr_assert_wcs_op_empty_va_(CR_FAIL_CONTINUES_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_eq
|
|
||||||
#define cr_assert_wcs_eq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_eq
|
|
||||||
#define cr_expect_wcs_eq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_neq
|
|
||||||
#define cr_assert_wcs_neq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_ABORT_, !=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_neq
|
|
||||||
#define cr_expect_wcs_neq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_CONTINUES_, !=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_lt
|
|
||||||
#define cr_assert_wcs_lt(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_ABORT_, <, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_lt
|
|
||||||
#define cr_expect_wcs_lt(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_CONTINUES_, <, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_leq
|
|
||||||
#define cr_assert_wcs_leq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_ABORT_, <=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_leq
|
|
||||||
#define cr_expect_wcs_leq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_CONTINUES_, <=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_gt
|
|
||||||
#define cr_assert_wcs_gt(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_ABORT_, >, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_gt
|
|
||||||
#define cr_expect_wcs_gt(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_CONTINUES_, >, __VA_ARGS__))
|
|
||||||
#undef cr_assert_wcs_geq
|
|
||||||
#define cr_assert_wcs_geq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_ABORT_, >=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_wcs_geq
|
|
||||||
#define cr_expect_wcs_geq(...) CR_EXPAND(cr_assert_wcs_op_va_(CR_FAIL_CONTINUES_, >=, __VA_ARGS__))
|
|
||||||
#undef cr_assert_arr_eq
|
|
||||||
#define cr_assert_arr_eq(...) CR_EXPAND(cr_assert_mem_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_expect_arr_eq
|
|
||||||
#define cr_expect_arr_eq(...) CR_EXPAND(cr_assert_mem_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__))
|
|
||||||
#undef cr_assert_arr_neq
|
|
||||||
#define cr_assert_arr_neq(...) CR_EXPAND(cr_assert_mem_op_va_(CR_FAIL_ABORT_, !=, __VA_ARGS__))
|
|
||||||
#undef cr_expect_arr_neq
|
|
||||||
#define cr_expect_arr_neq(...) CR_EXPAND(cr_assert_mem_op_va_(CR_FAIL_CONTINUES_, !=, __VA_ARGS__))
|
|
||||||
|
|
||||||
#if defined (__GNUC__) || defined (__clang__) || defined (__cplusplus)
|
|
||||||
|
|
||||||
# undef cr_assert_arr_eq_cmp
|
|
||||||
# define cr_assert_arr_eq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__))
|
|
||||||
# undef cr_expect_arr_eq_cmp
|
|
||||||
# define cr_expect_arr_eq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__))
|
|
||||||
# undef cr_assert_arr_neq_cmp
|
|
||||||
# define cr_assert_arr_neq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_ABORT_, !=, __VA_ARGS__))
|
|
||||||
# undef cr_expect_arr_neq_cmp
|
|
||||||
# define cr_expect_arr_neq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_CONTINUES_, !=, __VA_ARGS__))
|
|
||||||
# undef cr_assert_arr_lt_cmp
|
|
||||||
# define cr_assert_arr_lt_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_ABORT_, <, __VA_ARGS__))
|
|
||||||
# undef cr_expect_arr_lt_cmp
|
|
||||||
# define cr_expect_arr_lt_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_CONTINUES_, <, __VA_ARGS__))
|
|
||||||
# undef cr_assert_arr_leq_cmp
|
|
||||||
# define cr_assert_arr_leq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_ABORT_, <=, __VA_ARGS__))
|
|
||||||
# undef cr_expect_arr_leq_cmp
|
|
||||||
# define cr_expect_arr_leq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_CONTINUES_, <=, __VA_ARGS__))
|
|
||||||
# undef cr_assert_arr_gt_cmp
|
|
||||||
# define cr_assert_arr_gt_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_ABORT_, >, __VA_ARGS__))
|
|
||||||
# undef cr_expect_arr_gt_cmp
|
|
||||||
# define cr_expect_arr_gt_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_CONTINUES_, >, __VA_ARGS__))
|
|
||||||
# undef cr_assert_arr_geq_cmp
|
|
||||||
# define cr_assert_arr_geq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_ABORT_, >=, __VA_ARGS__))
|
|
||||||
# undef cr_expect_arr_geq_cmp
|
|
||||||
# define cr_expect_arr_geq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_CONTINUES_, >=, __VA_ARGS__))
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
# undef cr_assert_arr_eq_cmp
|
|
||||||
# define cr_assert_arr_eq_cmp(...) CRITERION_GNUC_WARN_(cr_assert_arr_eq_cmp) CR_NOOP
|
|
||||||
# undef cr_expect_arr_eq_cmp
|
|
||||||
# define cr_expect_arr_eq_cmp(...) CRITERION_GNUC_WARN_(cr_expect_arr_eq_cmp) CR_NOOP
|
|
||||||
# undef cr_assert_arr_neq_cmp
|
|
||||||
# define cr_assert_arr_neq_cmp(...) CRITERION_GNUC_WARN_(cr_assert_arr_neq_cmp) CR_NOOP
|
|
||||||
# undef cr_expect_arr_neq_cmp
|
|
||||||
# define cr_expect_arr_neq_cmp(...) CRITERION_GNUC_WARN_(cr_expect_arr_neq_cmp) CR_NOOP
|
|
||||||
# undef cr_assert_arr_lt_cmp
|
|
||||||
# define cr_assert_arr_lt_cmp(...) CRITERION_GNUC_WARN_(cr_assert_arr_lt_cmp) CR_NOOP
|
|
||||||
# undef cr_expect_arr_lt_cmp
|
|
||||||
# define cr_expect_arr_lt_cmp(...) CRITERION_GNUC_WARN_(cr_expect_arr_lt_cmp) CR_NOOP
|
|
||||||
# undef cr_assert_arr_leq_cmp
|
|
||||||
# define cr_assert_arr_leq_cmp(...) CRITERION_GNUC_WARN_(cr_assert_arr_leq_cmp) CR_NOOP
|
|
||||||
# undef cr_expect_arr_leq_cmp
|
|
||||||
# define cr_expect_arr_leq_cmp(...) CRITERION_GNUC_WARN_(cr_expect_arr_leq_cmp) CR_NOOP
|
|
||||||
# undef cr_assert_arr_gt_cmp
|
|
||||||
# define cr_assert_arr_gt_cmp(...) CRITERION_GNUC_WARN_(cr_assert_arr_gt_cmp) CR_NOOP
|
|
||||||
# undef cr_expect_arr_gt_cmp
|
|
||||||
# define cr_expect_arr_gt_cmp(...) CRITERION_GNUC_WARN_(cr_expect_arr_gt_cmp) CR_NOOP
|
|
||||||
# undef cr_assert_arr_geq_cmp
|
|
||||||
# define cr_assert_arr_geq_cmp(...) CRITERION_GNUC_WARN_(cr_assert_arr_geq_cmp) CR_NOOP
|
|
||||||
# undef cr_expect_arr_geq_cmp
|
|
||||||
# define cr_expect_arr_geq_cmp(...) CRITERION_GNUC_WARN_(cr_expect_arr_geq_cmp) CR_NOOP
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef cr_assert_throw
|
|
||||||
#define cr_assert_throw(...) CR_EXPAND(cr_assert_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__))
|
|
||||||
#undef cr_expect_throw
|
|
||||||
#define cr_expect_throw(...) CR_EXPAND(cr_assert_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__))
|
|
||||||
#undef cr_assert_no_throw
|
|
||||||
#define cr_assert_no_throw(...) CR_EXPAND(cr_assert_no_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__))
|
|
||||||
#undef cr_expect_no_throw
|
|
||||||
#define cr_expect_no_throw(...) CR_EXPAND(cr_assert_no_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__))
|
|
||||||
#undef cr_assert_any_throw
|
|
||||||
#define cr_assert_any_throw(...) CR_EXPAND(cr_assert_any_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__))
|
|
||||||
#undef cr_expect_any_throw
|
|
||||||
#define cr_expect_any_throw(...) CR_EXPAND(cr_assert_any_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__))
|
|
||||||
#undef cr_assert_none_throw
|
|
||||||
#define cr_assert_none_throw(...) CR_EXPAND(cr_assert_none_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__))
|
|
||||||
#undef cr_expect_none_throw
|
|
||||||
#define cr_expect_none_throw(...) CR_EXPAND(cr_assert_none_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__))
|
|
||||||
|
|
||||||
#endif /* !CRITERION_INTERNAL_ASSERT_H_ */
|
|
|
@ -1,139 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef CRITERION_COMMON_H_
|
|
||||||
#define CRITERION_COMMON_H_
|
|
||||||
|
|
||||||
#if defined (_MSC_VER)
|
|
||||||
# if _MSC_VER < 1900
|
|
||||||
# error \
|
|
||||||
Your version of MSVC++ is too old, please compile your tests using \
|
|
||||||
a c99 compiler, like MinGW or MSVC 14.0+ (Included in visual studio \
|
|
||||||
2015)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CR_IS_MSVC
|
|
||||||
# ifdef _MSC_VER
|
|
||||||
# define CR_IS_MSVC _MSC_VER
|
|
||||||
# else
|
|
||||||
# define CR_IS_MSVC 0
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# ifdef __GNUC__
|
|
||||||
# define CR_ATTRIBUTE(Arg) __attribute__((Arg))
|
|
||||||
# else
|
|
||||||
# define CR_ATTRIBUTE(Arg) [[gnu::Arg]]
|
|
||||||
# endif
|
|
||||||
# define CR_BEGIN_C_API extern "C" {
|
|
||||||
# define CR_END_C_API }
|
|
||||||
#else
|
|
||||||
# define CR_ATTRIBUTE(Arg) __attribute__((Arg))
|
|
||||||
# define CR_BEGIN_C_API
|
|
||||||
# define CR_END_C_API
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
# define CR_SECTION_START_SUFFIX(Name) __asm("section$start$__DATA$" Name)
|
|
||||||
# define CR_SECTION_END_SUFFIX(Name) __asm("section$end$__DATA$" Name)
|
|
||||||
# define CR_SECTION_(Name) CR_ATTRIBUTE(section("__DATA," Name))
|
|
||||||
# define CR_SECTION_SUFFIX_
|
|
||||||
#elif CR_IS_MSVC
|
|
||||||
# define CR_SECTION_START_SUFFIX(Name)
|
|
||||||
# define CR_SECTION_END_SUFFIX(Name)
|
|
||||||
# define CR_SECTION_(Name) \
|
|
||||||
__pragma(data_seg(push)) \
|
|
||||||
__pragma(section(Name, read)) \
|
|
||||||
__declspec(allocate(Name))
|
|
||||||
# define CR_SECTION_SUFFIX_ \
|
|
||||||
__pragma(data_seg(pop))
|
|
||||||
#else
|
|
||||||
# define CR_SECTION_START_SUFFIX(Name)
|
|
||||||
# define CR_SECTION_END_SUFFIX(Name)
|
|
||||||
# define CR_SECTION_(Name) CR_ATTRIBUTE(section(Name))
|
|
||||||
# define CR_SECTION_SUFFIX_
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CR_MAKE_IDENTIFIER_(Prefix, Id) CR_MAKE_IDENTIFIER__(Prefix, Id)
|
|
||||||
#define CR_MAKE_IDENTIFIER__(Prefix, Id) Prefix ## _ ## Id
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define CR_UNUSED CR_ATTRIBUTE(unused)
|
|
||||||
# define CR_NORETURN CR_ATTRIBUTE(noreturn)
|
|
||||||
# define CR_INLINE CR_ATTRIBUTE(always_inline) inline
|
|
||||||
#elif CR_IS_MSVC
|
|
||||||
# define CR_UNUSED __pragma(warning(suppress: 4100))
|
|
||||||
# define CR_NORETURN __declspec(noreturn)
|
|
||||||
# define CR_INLINE __forceinline
|
|
||||||
#else
|
|
||||||
# define CR_UNUSED
|
|
||||||
# define CR_NORETURN
|
|
||||||
# define CR_INLINE inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# define CR_SIZE_T_FORMAT "%Iu"
|
|
||||||
#else
|
|
||||||
# define CR_SIZE_T_FORMAT "%zu"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define CR_FORMAT(Archetype, Index, Ftc) CR_ATTRIBUTE(format(Archetype, Index, Ftc))
|
|
||||||
#else
|
|
||||||
# define CR_FORMAT(Archetype, Index, Ftc)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined _WIN32 || defined __CYGWIN__
|
|
||||||
# ifdef CRITERION_BUILDING_DLL
|
|
||||||
# ifdef __GNUC__
|
|
||||||
# define CR_API CR_ATTRIBUTE(dllexport)
|
|
||||||
# else
|
|
||||||
# define CR_API __declspec(dllexport)
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
# ifdef __GNUC__
|
|
||||||
# define CR_API CR_ATTRIBUTE(dllimport)
|
|
||||||
# else
|
|
||||||
# define CR_API __declspec(dllimport)
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# define CR_LOCAL
|
|
||||||
#else
|
|
||||||
# if __GNUC__ >= 4
|
|
||||||
# define CR_API CR_ATTRIBUTE(visibility("default"))
|
|
||||||
# define CR_LOCAL CR_ATTRIBUTE(visibility("hidden"))
|
|
||||||
# else
|
|
||||||
# define CR_API
|
|
||||||
# define CR_LOCAL
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# define CR_STDN std::
|
|
||||||
#else
|
|
||||||
# define CR_STDN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !CRITERION_COMMON_H_ */
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef CRITERION_INTERNAL_DEPRECATION_H_
|
|
||||||
#define CRITERION_INTERNAL_DEPRECATION_H_
|
|
||||||
|
|
||||||
#define CR_DEPRECATED(Msg) CR_DEPRECATED_(message(Msg))
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# define CR_DEPRECATED_(Msg) __pragma(Msg)
|
|
||||||
#else
|
|
||||||
# define CR_DEPRECATED_(Msg) _Pragma(#Msg)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define CR_DEPRECATED_MEMBER(Member) Member __attribute__((deprecated))
|
|
||||||
#else
|
|
||||||
# define CR_DEPRECATED_MEMBER(Member) Member
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !CRITERION_INTERNAL_DEPRECATION_H_ */
|
|