Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add snitch 1.2.3 #19551

Merged
merged 26 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions recipes/snitch/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
sources:
"1.2.3":
url: "https://github.com/snitch-org/snitch/archive/refs/tags/v1.2.3.zip"
sha256: "f2649e716b612f3dbb5f109b7250be80e2d7e43c7827034a270bd1ca91eafb12"
"1.2.2":
url: "https://github.com/snitch-org/snitch/archive/refs/tags/v1.2.2.zip"
sha256: "01eefb4a5368974cbfc14fbae93a5ccdd1f9d7f63d102784f914083b79d264a0"
199 changes: 199 additions & 0 deletions recipes/snitch/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.build import check_min_cppstd
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
from conan.tools.files import copy, get, rmdir
from conan.tools.scm import Version
import os

required_conan_version = ">=1.53.0"


class SnitchConan(ConanFile):
name = "snitch"
description = "Lightweight C++20 testing framework"
topics = ("snitch", "unit-test")
license = "BSL-1.0"
homepage = "https://github.com/snitch-org/snitch"
url = "https://github.com/conan-io/conan-center-index"
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
"fPIC": [True, False],
"header_only": [True, False],
"with_main": [True, False],
"with_exceptions": [True, False],
"with_timings": [True, False],
"with_shorthand_macros": [True, False],
"with_default_color": [True, False],
"with_success_decompose": [True, False],
"with_reporters": [None, "ANY"],
"max_test_cases": ["ANY"], # integer
"max_nested_sections": ["ANY"], # integer
"max_expr_length": ["ANY"], # integer
"max_message_length": ["ANY"], # integer
"max_test_name_length": ["ANY"], # integer
"max_tag_length": ["ANY"], # integer
"max_captures": ["ANY"], # integer
"max_capture_length": ["ANY"], # integer
"max_unique_tags": ["ANY"], # integer
"max_command_line_args": ["ANY"], # integer
"max_registered_reporters": ["ANY"], # integer
"max_path_length": ["ANY"] # integer
}
default_options = {
"shared": False,
"fPIC": True,
"header_only": False,
"with_main": True,
"with_exceptions": True,
"with_timings": True,
"with_shorthand_macros": True,
"with_default_color": True,
"with_success_decompose": False,
"with_reporters": "all",
"max_test_cases": 5000,
"max_nested_sections": 8,
"max_expr_length": 1024,
"max_message_length": 1024,
"max_test_name_length": 1024,
"max_tag_length": 256,
"max_captures": 8,
"max_capture_length": 256,
"max_unique_tags": 1024,
"max_command_line_args": 1024,
"max_registered_reporters": 8,
"max_path_length": 1024
}

@property
def _min_cppstd(self):
return "20"

@property
def _compilers_minimum_version(self):
return {
"gcc": "10",
"Visual Studio": "17",
"msvc": "193",
"clang": "10",
"apple-clang": "10",
}

@property
def _available_reporters(self):
return ["xml", "teamcity"]

def config_options(self):
if self.settings.os == "Windows":
# Position-independent code is irrelevant on Windows; this is UNIX only.
del self.options.fPIC

def configure(self):
if self.options.shared or self.options.header_only:
# Position-independent code is only relevant for static builds.
self.options.rm_safe("fPIC")

if self.options.header_only:
# Shared vs static is irrelevant in header-only mode, so should be removed.
del self.options.shared

def package_id(self):
if self.info.options.header_only:
# In header-only mode, the OS, architecture, and compiler don't matter.
# However do not clear options; they influence the content of the header file.
self.info.settings.clear()

def layout(self):
cmake_layout(self, src_folder="src")

def validate(self):
if self.settings.compiler.get_safe("cppstd"):
check_min_cppstd(self, self._min_cppstd)
minimum_version = self._compilers_minimum_version.get(str(self.settings.compiler), False)
if minimum_version and Version(self.settings.compiler.version) < minimum_version:
raise ConanInvalidConfiguration(
f"{self.ref} requires C++{self._min_cppstd}, which your compiler doesn't support")

def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)

def generate(self):
tc = CMakeToolchain(self)

# Basic configuration
tc.cache_variables["SNITCH_DO_TEST"] = False
tc.cache_variables["SNITCH_UNITY_BUILD"] = True

# Library format
tc.cache_variables["SNITCH_HEADER_ONLY"] = self.options.header_only

# Feature toggles
tc.cache_variables["SNITCH_DEFINE_MAIN"] = self.options.with_main
tc.cache_variables["SNITCH_WITH_EXCEPTIONS"] = self.options.with_exceptions
tc.cache_variables["SNITCH_WITH_TIMINGS"] = self.options.with_timings
tc.cache_variables["SNITCH_WITH_SHORTHAND_MACROS"] = self.options.with_shorthand_macros
tc.cache_variables["SNITCH_DEFAULT_WITH_COLOR"] = self.options.with_default_color
tc.cache_variables["SNITCH_DECOMPOSE_SUCCESSFUL_ASSERTIONS"] = self.options.with_success_decompose

for reporter in str(self.options.with_reporters).split(','):
reporter = reporter.strip()
if reporter == "all":
tc.cache_variables["SNITCH_WITH_ALL_REPORTERS"] = True
break
elif reporter in self._available_reporters:
tc.cache_variables["SNITCH_WITH_ALL_REPORTERS"] = False
tc.cache_variables[f"SNITCH_WITH_{reporter.upper()}_REPORTER"] = True
else:
raise ConanInvalidConfiguration(f"unknown reporter '{reporter}'")

# Configurable limits
tc.cache_variables["SNITCH_MAX_TEST_CASES"] = str(self.options.max_test_cases)
tc.cache_variables["SNITCH_MAX_NESTED_SECTIONS"] = str(self.options.max_nested_sections)
tc.cache_variables["SNITCH_MAX_EXPR_LENGTH"] = str(self.options.max_expr_length)
tc.cache_variables["SNITCH_MAX_MESSAGE_LENGTH"] = str(self.options.max_message_length)
tc.cache_variables["SNITCH_MAX_TEST_NAME_LENGTH"] = str(self.options.max_test_name_length)
tc.cache_variables["SNITCH_MAX_TAG_LENGTH"] = str(self.options.max_tag_length)
tc.cache_variables["SNITCH_MAX_CAPTURES"] = str(self.options.max_captures)
tc.cache_variables["SNITCH_MAX_CAPTURE_LENGTH"] = str(self.options.max_capture_length)
tc.cache_variables["SNITCH_MAX_UNIQUE_TAGS"] = str(self.options.max_unique_tags)
tc.cache_variables["SNITCH_MAX_COMMAND_LINE_ARGS"] = str(self.options.max_command_line_args)
tc.cache_variables["SNITCH_MAX_REGISTERED_REPORTERS"] = str(self.options.max_registered_reporters)
tc.cache_variables["SNITCH_MAX_PATH_LENGTH"] = str(self.options.max_path_length)

tc.generate()

def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()

def package(self):
copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
cmake = CMake(self)
cmake.install()
rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))

def package_info(self):
target = "snitch-header-only" if self.options.header_only else "snitch"

self.cpp_info.set_property("cmake_file_name", "snitch")
self.cpp_info.set_property("cmake_target_name", f"snitch::{target}")
self.cpp_info.set_property("pkg_config_name", "snitch")

if self.options.header_only:
self.cpp_info.components["_snitch"].bindirs = []
self.cpp_info.components["_snitch"].libdirs = []
else:
self.cpp_info.components["_snitch"].libs = ['snitch']
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.system_libs.append("m")

# TODO: to remove in conan v2 once legacy generators removed
self.cpp_info.names["cmake_find_package"] = "snitch"
self.cpp_info.names["cmake_find_package_multi"] = "snitch"
self.cpp_info.names["pkg_config"] = "snitch"
self.cpp_info.components["_snitch"].names["cmake_find_package"] = target
self.cpp_info.components["_snitch"].names["cmake_find_package_multi"] = target
self.cpp_info.components["_snitch"].set_property("cmake_target_name", f"snitch::{target}")
11 changes: 11 additions & 0 deletions recipes/snitch/all/test_package/100-standalone.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#if defined(HEADER_ONLY)
# define SNITCH_IMPLEMENTATION
# include <snitch/snitch_all.hpp>
#else
# include <snitch/snitch_macros_test_case.hpp>
# include <snitch/snitch_macros_check.hpp>
#endif

SNITCH_TEST_CASE("compiles and runs") {
SNITCH_REQUIRE(true == !false);
}
11 changes: 11 additions & 0 deletions recipes/snitch/all/test_package/200-standalone-with-shorthand.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#if defined(HEADER_ONLY)
# define SNITCH_IMPLEMENTATION
# include <snitch/snitch_all.hpp>
#else
# include <snitch/snitch_macros_test_case.hpp>
# include <snitch/snitch_macros_check.hpp>
#endif

TEST_CASE("compiles and runs") {
REQUIRE(true == !false);
}
19 changes: 19 additions & 0 deletions recipes/snitch/all/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.8)
project(test_package LANGUAGES CXX)

find_package(snitch REQUIRED CONFIG)

if (WITH_SHORTHAND)
add_executable(standalone 200-standalone-with-shorthand.cpp)
else()
add_executable(standalone 100-standalone.cpp)
endif()

if (HEADER_ONLY)
target_compile_definitions(standalone PRIVATE HEADER_ONLY)
target_link_libraries(standalone PRIVATE snitch::snitch-header-only)
else()
target_link_libraries(standalone PRIVATE snitch::snitch)
endif()

target_compile_features(standalone PRIVATE cxx_std_20)
31 changes: 31 additions & 0 deletions recipes/snitch/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
import os


class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeDeps", "VirtualRunEnv"
test_type = "explicit"

def layout(self):
cmake_layout(self)

def requirements(self):
self.requires(self.tested_reference_str)

def generate(self):
tc = CMakeToolchain(self)
tc.variables["WITH_SHORTHAND"] = self.dependencies[self.tested_reference_str].options.with_shorthand_macros
tc.variables["HEADER_ONLY"] = self.dependencies[self.tested_reference_str].options.header_only
tc.generate()

def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()

def test(self):
if can_run(self):
self.run(os.path.join(self.cpp.build.bindirs[0], "standalone"), env="conanrun")
8 changes: 8 additions & 0 deletions recipes/snitch/all/test_v1_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
cmake_minimum_required(VERSION 3.1)
project(test_package)

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../test_package
${CMAKE_CURRENT_BINARY_DIR}/test_package)
18 changes: 18 additions & 0 deletions recipes/snitch/all/test_v1_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from conans import ConanFile, CMake, tools
import os


class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "cmake", "cmake_find_package_multi"

def build(self):
cmake = CMake(self)
cmake.definitions["WITH_SHORTHAND"] = self.options["snitch"].with_shorthand_macros
cmake.definitions["HEADER_ONLY"] = self.options["snitch"].header_only
cmake.configure()
cmake.build()

def test(self):
if not tools.cross_building(self):
self.run(os.path.join("bin", "standalone"), run_environment=True)
5 changes: 5 additions & 0 deletions recipes/snitch/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
versions:
"1.2.3":
folder: all
"1.2.2":
folder: all