Skip to content

Commit

Permalink
(#14933) [BitSerializer] Add new version 0.50
Browse files Browse the repository at this point in the history
* [BitSerializer] Add new version 0.50

* Update recipes/bitserializer/all/conanfile.py

Co-authored-by: Uilian Ries <uilianries@gmail.com>

* Update recipes/bitserializer/all/conanfile.py

Co-authored-by: Uilian Ries <uilianries@gmail.com>

* Update recipes/bitserializer/all/conanfile.py

Co-authored-by: Uilian Ries <uilianries@gmail.com>

* [BitSerializer] Patch include path in the RapidYaml archive

* [BitSerializer] Fix by comment - remove self.info.clear()

* Update recipes/bitserializer/all/conanfile.py

Co-authored-by: Uilian Ries <uilianries@gmail.com>

* Update recipes/bitserializer/all/conanfile.py

Co-authored-by: Uilian Ries <uilianries@gmail.com>

* Update recipes/bitserializer/all/conanfile.py

Co-authored-by: Uilian Ries <uilianries@gmail.com>

* [BitSerializer] Fix package_id

* [BitSerializer] Fix build debug

* [BitSerializer] Fix applying patch when selected only 'with_rapidyaml' option

Co-authored-by: Uilian Ries <uilianries@gmail.com>
  • Loading branch information
PavelKisliak and uilianries authored Jan 17, 2023
1 parent 49fc684 commit c772a96
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 16 deletions.
3 changes: 3 additions & 0 deletions recipes/bitserializer/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
sources:
"0.50":
url: "https://bitbucket.com/Pavel_Kisliak/BitSerializer/get/0.50.tar.gz"
sha256: "dc000b6516db60337d5dd56fb1b60e29ce700bd2e6f4e609ca548b84d1f1dcee"
"0.44":
url: "https://bitbucket.com/Pavel_Kisliak/BitSerializer/get/0.44.tar.gz"
sha256: "39ee0b038c9f38a012f96913c9738a68514d2e923431fbd83ddf3f454e02bc6c"
Expand Down
87 changes: 78 additions & 9 deletions recipes/bitserializer/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.build import check_min_cppstd
from conan.tools.files import copy, get
from conan.tools.files import copy, get, rmdir, replace_in_file
from conan.tools.layout import basic_layout
from conan.tools.scm import Version
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain
import os

required_conan_version = ">=1.50.0"


class BitserializerConan(ConanFile):
name = "bitserializer"
description = "C++ 17 library for serialization to multiple output formats (JSON, XML, YAML)"
topics = ("serialization", "json", "xml")
description = "C++ 17 library for serialization to multiple output formats (JSON, XML, YAML, CSV)"
topics = ("serialization", "json", "xml", "yaml", "csv")
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://bitbucket.org/Pavel_Kisliak/bitserializer"
license = "MIT"
Expand All @@ -22,11 +23,15 @@ class BitserializerConan(ConanFile):
"with_cpprestsdk": [True, False],
"with_rapidjson": [True, False],
"with_pugixml": [True, False],
"with_rapidyaml": [True, False],
"with_csv": [True, False],
}
default_options = {
"with_cpprestsdk": False,
"with_rapidjson": False,
"with_pugixml": False,
"with_rapidyaml": False,
"with_csv": False,
}

no_copy_source = True
Expand All @@ -45,21 +50,38 @@ def _compilers_minimum_version(self):
"apple-clang": "12",
}

@property
def _is_header_only(self):
# All components of library are header-only except csv-archive
return not self.options.with_csv

def _patch_sources(self):
# Remove 'ryml' subdirectory from #include
replace_in_file(self, os.path.join(self.source_folder, "include/bitserializer/rapidyaml_archive.h"), "#include <ryml/", "#include <", strict=False)

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

def requirements(self):
if self.options.with_cpprestsdk:
self.requires("cpprestsdk/2.10.18", transitive_headers=True, transitive_libs=True)
if self.options.with_rapidjson:
self.requires("rapidjson/cci.20220514", transitive_headers=True, transitive_libs=True)
self.requires("rapidjson/cci.20220822", transitive_headers=True, transitive_libs=True)
if self.options.with_pugixml:
self.requires("pugixml/1.13", transitive_headers=True, transitive_libs=True)

def package_id(self):
self.info.clear()
if self.options.with_rapidyaml:
self.requires("rapidyaml/0.4.1")

def validate(self):
# Check minimal version that supported CSV option
if self.options.with_csv and Version(self.version) < "0.50":
raise ConanInvalidConfiguration("CSV is supported in the BitSerializer starting from version 0.50 (option 'with_csv')")

# Check minimal version that supported YAML option
if self.options.with_rapidyaml and Version(self.version) < "0.50":
raise ConanInvalidConfiguration("YAML is supported in the BitSerializer starting from version 0.50 (option 'with_rapidyaml')")

# Check compiler for C++17 support
if self.settings.compiler.get_safe("cppstd"):
check_min_cppstd(self, self._min_cppstd)

Expand All @@ -81,14 +103,41 @@ def source(self):
get(self, **self.conan_data["sources"][self.version],
destination=self.source_folder, strip_root=True)

def generate(self):
if not self._is_header_only:
tc = CMakeToolchain(self)
tc.variables["BUILD_CPPRESTJSON_ARCHIVE"] = self.options.with_cpprestsdk
tc.variables["BUILD_RAPIDJSON_ARCHIVE"] = self.options.with_rapidjson
tc.variables["BUILD_PUGIXML_ARCHIVE"] = self.options.with_pugixml
tc.variables["BUILD_RAPIDYAML_ARCHIVE"] = self.options.with_rapidyaml
tc.variables["BUILD_CSV_ARCHIVE"] = self.options.with_csv
tc.generate()
deps = CMakeDeps(self)
deps.generate()

def build(self):
pass
self._patch_sources()
if not self._is_header_only:
cmake = CMake(self)
cmake.configure()
cmake.build()

def package(self):
if not self._is_header_only:
cmake = CMake(self)
cmake.install()
rmdir(self, os.path.join(self.package_folder, "share"))
else:
copy(self, "*.h", src=os.path.join(self.source_folder, "include"), dst=os.path.join(self.package_folder, "include"))
# Copy license
copy(self, "license.txt", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
copy(self, "*.h", src=os.path.join(self.source_folder, "include"), dst=os.path.join(self.package_folder, "include"))

def package_id(self):
if self._is_header_only:
self.info.header_only()

def package_info(self):
lib_suffix = "d" if self.info.settings.build_type == "Debug" else ""
self.cpp_info.set_property("cmake_file_name", "bitserializer")

# cpprestjson-core
Expand Down Expand Up @@ -120,6 +169,20 @@ def package_info(self):
self.cpp_info.components["bitserializer-pugixml"].libdirs = []
self.cpp_info.components["bitserializer-pugixml"].requires = ["bitserializer-core", "pugixml::pugixml"]

# rapidyaml-archive
if self.options.with_rapidyaml:
self.cpp_info.components["bitserializer-rapidyaml"].set_property("cmake_target_name", "BitSerializer::rapidyaml-archive")
self.cpp_info.components["bitserializer-rapidyaml"].bindirs = []
self.cpp_info.components["bitserializer-rapidyaml"].libdirs = []
self.cpp_info.components["bitserializer-rapidyaml"].requires = ["bitserializer-core", "rapidyaml::rapidyaml"]

# csv-archive
if self.options.with_csv:
self.cpp_info.components["bitserializer-csv"].set_property("cmake_target_name", "BitSerializer::csv-archive")
self.cpp_info.components["bitserializer-csv"].requires = ["bitserializer-core"]
self.cpp_info.components["bitserializer-csv"].bindirs = []
self.cpp_info.components["bitserializer-csv"].libs = [ f"csv-archive{lib_suffix}" ]

# TODO: to remove in conan v2 once cmake_find_package* generators removed
self.cpp_info.filenames["cmake_find_package"] = "bitserializer"
self.cpp_info.filenames["cmake_find_package_multi"] = "bitserializer"
Expand All @@ -136,3 +199,9 @@ def package_info(self):
if self.options.with_pugixml:
self.cpp_info.components["bitserializer-pugixml"].names["cmake_find_package"] = "pugixml-archive"
self.cpp_info.components["bitserializer-pugixml"].names["cmake_find_package_multi"] = "pugixml-archive"
if self.options.with_rapidyaml:
self.cpp_info.components["bitserializer-rapidyaml"].names["cmake_find_package"] = "rapidyaml-archive"
self.cpp_info.components["bitserializer-rapidyaml"].names["cmake_find_package_multi"] = "rapidyaml-archive"
if self.options.with_csv:
self.cpp_info.components["bitserializer-csv"].names["cmake_find_package"] = "csv-archive"
self.cpp_info.components["bitserializer-csv"].names["cmake_find_package_multi"] = "csv-archive"
31 changes: 28 additions & 3 deletions recipes/bitserializer/all/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,16 +1,41 @@
cmake_minimum_required(VERSION 3.8)
project(test_package LANGUAGES CXX)

find_package(bitserializer REQUIRED CONFIG)
set(BITSERIALIZER_COMPONENTS core)
if(WITH_CPPRESTSDK)
list(APPEND BITSERIALIZER_COMPONENTS cpprestjson-archive)
endif()
if(WITH_RAPIDJSON)
list(APPEND BITSERIALIZER_COMPONENTS rapidjson-archive)
endif()
if(WITH_PUGIXML)
list(APPEND BITSERIALIZER_COMPONENTS pugixml-archive)
endif()
if(WITH_RAPIDYAML)
list(APPEND BITSERIALIZER_COMPONENTS rapidyaml-archive)
endif()
if(WITH_CSV)
list(APPEND BITSERIALIZER_COMPONENTS csv-archive)
endif()

find_package(bitserializer CONFIG REQUIRED
COMPONENTS ${BITSERIALIZER_COMPONENTS}
)

add_executable(${PROJECT_NAME} test_package.cpp)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
target_link_libraries(${PROJECT_NAME} PRIVATE
BitSerializer::core
$<$<BOOL:${WITH_CPPRESTSDK}>:BitSerializer::cpprestjson-archive>
$<$<BOOL:${WITH_RAPIDJSON}>:BitSerializer::rapidjson-archive>
$<$<BOOL:${WITH_PUGIXML}>:BitSerializer::pugixml-archive>)
$<$<BOOL:${WITH_PUGIXML}>:BitSerializer::pugixml-archive>
$<$<BOOL:${WITH_RAPIDYAML}>:BitSerializer::rapidyaml-archive>
$<$<BOOL:${WITH_CSV}>:BitSerializer::csv-archive>
)
target_compile_definitions(${PROJECT_NAME} PRIVATE
$<$<BOOL:${WITH_CPPRESTSDK}>:"WITH_CPPRESTSDK">
$<$<BOOL:${WITH_RAPIDJSON}>:"WITH_RAPIDJSON">
$<$<BOOL:${WITH_PUGIXML}>:"WITH_PUGIXML">)
$<$<BOOL:${WITH_PUGIXML}>:"WITH_PUGIXML">
$<$<BOOL:${WITH_RAPIDYAML}>:"WITH_RAPIDYAML">
$<$<BOOL:${WITH_CSV}>:"WITH_CSV">
)
9 changes: 6 additions & 3 deletions recipes/bitserializer/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ def requirements(self):

def generate(self):
tc = CMakeToolchain(self)
tc.variables["WITH_CPPRESTSDK"] = self.dependencies["bitserializer"].options.with_cpprestsdk
tc.variables["WITH_RAPIDJSON"] = self.dependencies["bitserializer"].options.with_rapidjson
tc.variables["WITH_PUGIXML"] = self.dependencies["bitserializer"].options.with_pugixml
bitserializerOptions = self.dependencies[self.tested_reference_str].options
tc.variables["WITH_CPPRESTSDK"] = bitserializerOptions.with_cpprestsdk
tc.variables["WITH_RAPIDJSON"] = bitserializerOptions.with_rapidjson
tc.variables["WITH_PUGIXML"] = bitserializerOptions.with_pugixml
tc.variables["WITH_RAPIDYAML"] = bitserializerOptions.with_rapidyaml
tc.variables["WITH_CSV"] = bitserializerOptions.with_csv
tc.generate()

def build(self):
Expand Down
14 changes: 13 additions & 1 deletion recipes/bitserializer/all/test_package/test_package.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
#ifdef WITH_PUGIXML
#include <bitserializer/pugixml_archive.h>
#endif
#ifdef WITH_RAPIDYAML
#include <bitserializer/rapidyaml_archive.h>
#endif
#ifdef WITH_CSV
#include <bitserializer/csv_archive.h>
#endif

#include <iostream>
#include <sstream>
Expand Down Expand Up @@ -41,7 +47,7 @@ void TestArchive(const std::string& message)
BitSerializer::SerializationOptions serializationOptions;
serializationOptions.streamOptions.writeBom = false;

CTest testObj(message);
CTest testObj[1] = { message };
std::stringstream outputStream;
BitSerializer::SaveObject<TArchive>(testObj, outputStream, serializationOptions);
std::cout << outputStream.str() << std::endl;
Expand All @@ -66,4 +72,10 @@ int main() {
#ifdef WITH_PUGIXML
TestArchive<BitSerializer::Xml::PugiXml::XmlArchive>("Implementation based on pugixml");
#endif
#ifdef WITH_RAPIDYAML
TestArchive<BitSerializer::Yaml::RapidYaml::YamlArchive>("Implementation based on RapidYaml");
#endif
#ifdef WITH_CSV
TestArchive<BitSerializer::Csv::CsvArchive>("CSV archive (built-in implementation)");
#endif
}
2 changes: 2 additions & 0 deletions recipes/bitserializer/all/test_v1_package/conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ def build(self):
cmake.definitions["WITH_CPPRESTSDK"] = self.options["bitserializer"].with_cpprestsdk
cmake.definitions["WITH_RAPIDJSON"] = self.options["bitserializer"].with_rapidjson
cmake.definitions["WITH_PUGIXML"] = self.options["bitserializer"].with_pugixml
cmake.definitions["WITH_RAPIDYAML"] = self.options["bitserializer"].with_rapidyaml
cmake.definitions["WITH_CSV"] = self.options["bitserializer"].with_csv
cmake.configure()
cmake.build()

Expand Down
2 changes: 2 additions & 0 deletions recipes/bitserializer/config.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
versions:
"0.50":
folder: "all"
"0.44":
folder: "all"
"0.10":
Expand Down

0 comments on commit c772a96

Please sign in to comment.