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

New recipe xlnt/1.5.0 #14150

Merged
merged 4 commits into from
Dec 2, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
12 changes: 12 additions & 0 deletions recipes/xlnt/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
sources:
"1.5.0":
url: "https://github.com/tfussell/xlnt/archive/refs/tags/v1.5.0.tar.gz"
sha256: "8dec266d59ab6e4829da5dacea764a02887eeff5a5501c9a51ce796e735b90de"
patches:
"1.5.0":
- patch_file: "patches/0001-fix-cmake-and-unvendor-deps.patch"
patch_description: "Fix CMakeLists and unvendor dependencies"
patch_type: "conan"
- patch_file: "patches/0002-include-limits.patch"
patch_description: "Add missing includes"
patch_type: "conan"
SpaceIm marked this conversation as resolved.
Show resolved Hide resolved
105 changes: 105 additions & 0 deletions recipes/xlnt/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.build import check_min_cppstd
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rmdir
from conan.tools.scm import Version
import os

required_conan_version = ">=1.53.0"


class XlntConan(ConanFile):
name = "xlnt"
description = "Cross-platform user-friendly xlsx library for C++11+"
license = "MIT"
topics = ("excel", "xlsx", "spreadsheet", "reader", "writer")
homepage = "https://github.com/tfussell/xlnt"
url = "https://github.com/conan-io/conan-center-index"

settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
"fPIC": [True, False],
}
default_options = {
"shared": False,
"fPIC": True,
}

def export_sources(self):
export_conandata_patches(self)

def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC

def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")

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

def requirements(self):
self.requires("libstudxml/1.1.0-b.10+1")
self.requires("miniz/3.0.1")
self.requires("utfcpp/3.2.2")

def validate(self):
if self.info.settings.compiler.get_safe("cppstd"):
check_min_cppstd(self, 11)
libstudxml_version = Version(self.dependencies["libstudxml"].ref.version)
libstudxml_major_minor = f"{libstudxml_version.major}.{libstudxml_version.minor}"
if Version(libstudxml_major_minor) < "1.1":
SpaceIm marked this conversation as resolved.
Show resolved Hide resolved
raise ConanInvalidConfiguration(f"{self.ref} not compatible with libstudxml < 1.1")

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

def generate(self):
tc = CMakeToolchain(self)
tc.variables["STATIC"] = not self.options.shared
tc.variables["TESTS"] = False
tc.variables["SAMPLES"] = False
tc.variables["BENCHMARKS"] = False
tc.variables["PYTHON"] = False
tc.generate()
deps = CMakeDeps(self)
deps.generate()

def _patch_sources(self):
apply_conandata_patches(self)
# Remove unvendored third party libs
for third_party in ("libstudxml", "miniz", "utfcpp"):
rmdir(self, os.path.join(self.source_folder, "third-party", third_party))

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

def package(self):
copy(self, "LICENSE.md", 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"))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
rmdir(self, os.path.join(self.package_folder, "share"))

def package_info(self):
self.cpp_info.set_property("cmake_file_name", "Xlnt")
self.cpp_info.set_property("cmake_target_name", "xlnt::xlnt")
self.cpp_info.set_property("pkg_config_name", "xlnt")
suffix = "d" if self.settings.build_type == "Debug" else ""
self.cpp_info.libs = [f"xlnt{suffix}"]
if not self.options.shared:
self.cpp_info.defines.append("XLNT_STATIC")

# TODO: to remove in conan v2
self.cpp_info.filenames["cmake_find_package"] = "Xlnt"
self.cpp_info.filenames["cmake_find_package_multi"] = "Xlnt"
self.cpp_info.names["cmake_find_package"] = "xlnt"
self.cpp_info.names["cmake_find_package_multi"] = "xlnt"
113 changes: 113 additions & 0 deletions recipes/xlnt/all/patches/0001-fix-cmake-and-unvendor-deps.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -1,9 +1,6 @@
cmake_minimum_required(VERSION 3.1)
project(xlnt VERSION 1.5.0)

-set(CMAKE_CXX_STANDARD ${XLNT_CXX_LANG})
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
-set(CXX_EXTENSIONS OFF)

# Project metadata
set(PROJECT_VENDOR "Thomas Fussell")
@@ -18,8 +15,6 @@ set(XLNT_SOURCE_DIR ${XLNT_ROOT_DIR}/source)
set(THIRD_PARTY_DIR ${XLNT_ROOT_DIR}/third-party)

# Include libstudxml library
-add_subdirectory(${THIRD_PARTY_DIR}/libstudxml
- ${CMAKE_CURRENT_BINARY_DIR}/third-party/libstudxml)

if(COVERAGE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
@@ -30,12 +25,9 @@ if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") # level 4 warnings
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") # multi-processor compilation
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # all warnings
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra") # extra warnings
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas") # ignore MSVC and Clang pragmas
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-maybe-uninitialized") # GCC diagnostic with lots of false positives
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything") # all warnings
# blacklist warnings that are not relevant
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-c++98-compat") # ignore warnings about C++98 compatibility
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-c++98-compat-pedantic") # ignore pedantic warnings about C++98 compatibility
@@ -54,7 +46,7 @@ if(STATIC_CRT)
ucm_set_runtime(STATIC)
endif()

-if(APPLE)
+if(0)
# Prevent a warning about deployment target not being set by setting it to current OSX version
execute_process(COMMAND "sw_vers -productVersion | awk -F'.' '{print $1\".\"$2}'"
OUTPUT_VARIABLE OSX_VERSION)
@@ -84,8 +76,6 @@ file(GLOB WORKBOOK_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/workbook/*.hpp)
file(GLOB WORKBOOK_SOURCES ${XLNT_SOURCE_DIR}/workbook/*.cpp)
file(GLOB WORKSHEET_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/worksheet/*.hpp)
file(GLOB WORKSHEET_SOURCES ${XLNT_SOURCE_DIR}/worksheet/*.cpp)
-file(GLOB MINIZ_HEADERS ${THIRD_PARTY_DIR}/miniz/*.h)
-file(GLOB MINIZ_SOURCES ${THIRD_PARTY_DIR}/miniz/*.c)

file(GLOB DETAIL_ROOT_HEADERS ${XLNT_SOURCE_DIR}/detail/*.hpp)
file(GLOB DETAIL_ROOT_SOURCES ${XLNT_SOURCE_DIR}/detail/*.cpp)
@@ -115,12 +105,12 @@ set(XLNT_HEADERS ${ROOT_HEADERS} ${CELL_HEADERS} ${CHARTS_HEADERS}
${CHARTSHEET_HEADERS} ${DRAWING_HEADERS} ${FORMULA_HEADERS}
${PACKAGING_HEADERS} ${STYLES_HEADERS} ${UTILS_HEADERS}
${WORKBOOK_HEADERS} ${WORKSHEET_HEADERS} ${DETAIL_HEADERS} ${DETAIL_CRYPTO_HEADERS}
- ${DRAWING_HEADERS} ${MINIZ_HEADERS})
+ ${DRAWING_HEADERS})
set(XLNT_SOURCES ${CELL_SOURCES} ${CHARTS_SOURCES} ${CHARTSHEET_SOURCES}
${DRAWING_SOURCES} ${FORMULA_SOURCES} ${PACKAGING_SOURCES}
${STYLES_SOURCES} ${UTILS_SOURCES} ${WORKBOOK_SOURCES}
${WORKSHEET_SOURCES} ${DETAIL_SOURCES} ${DETAIL_CRYPTO_SOURCES}
- ${DRAWING_SOURCES} ${MINIZ_SOURCES})
+ ${DRAWING_SOURCES})

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
# Set a default CMAKE_INSTALL_PREFIX if one wasn't specified
@@ -159,7 +149,7 @@ if(NOT STATIC)
add_library(xlnt SHARED
${XLNT_HEADERS}
${XLNT_SOURCES}
- $<TARGET_OBJECTS:libstudxml>)
+ )

target_compile_definitions(xlnt PRIVATE XLNT_SHARED=1)

@@ -168,10 +158,10 @@ if(NOT STATIC)
PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}
- INSTALL_NAME_DIR "${XLNT_LIB_DEST_DIR}")
+ )
else()
# Compile static library
- add_library(xlnt STATIC ${XLNT_HEADERS} ${XLNT_SOURCES} $<TARGET_OBJECTS:libstudxml>)
+ add_library(xlnt STATIC ${XLNT_HEADERS} ${XLNT_SOURCES})
target_compile_definitions(xlnt PUBLIC XLNT_STATIC=1)
endif()

@@ -185,9 +175,12 @@ target_include_directories(xlnt
$<INSTALL_INTERFACE:${XLNT_INC_DEST_DIR}>
PRIVATE
${XLNT_SOURCE_DIR}
- ${XLNT_SOURCE_DIR}/../third-party/libstudxml
- ${XLNT_SOURCE_DIR}/../third-party/miniz
- ${XLNT_SOURCE_DIR}/../third-party/utfcpp)
+)
+find_package(libstudxml REQUIRED CONFIG)
+find_package(miniz REQUIRED CONFIG)
+find_package(utf8cpp REQUIRED CONFIG)
+target_link_libraries(xlnt PRIVATE miniz::miniz utf8cpp libstudxml::libstudxml)
+target_compile_features(xlnt PUBLIC cxx_std_11)

# Platform- and file-specific settings, MSVC
if(MSVC)
@@ -240,7 +233,6 @@ source_group(styles FILES ${STYLES_HEADERS} ${STYLES_SOURCES})
source_group(utils FILES ${UTILS_HEADERS} ${UTILS_SOURCES})
source_group(workbook FILES ${WORKBOOK_HEADERS} ${WORKBOOK_SOURCES})
source_group(worksheet FILES ${WORKSHEET_HEADERS} ${WORKSHEET_SOURCES})
-source_group(third-party\\miniz FILES ${MINIZ_HEADERS} ${MINIZ_SOURCES})

# Install library
install(TARGETS xlnt EXPORT XlntTargets
20 changes: 20 additions & 0 deletions recipes/xlnt/all/patches/0002-include-limits.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--- a/source/cell/cell.cpp
+++ b/source/cell/cell.cpp
@@ -24,6 +24,7 @@

#include <algorithm>
#include <cmath>
+#include <limits>
#include <sstream>

#include <xlnt/cell/cell.hpp>
--- a/source/detail/number_format/number_formatter.cpp
+++ b/source/detail/number_format/number_formatter.cpp
@@ -24,6 +24,7 @@
#include <algorithm>
#include <cctype>
#include <cmath>
+#include <limits>

#include <xlnt/utils/exceptions.hpp>
#include <detail/default_case.hpp>
8 changes: 8 additions & 0 deletions recipes/xlnt/all/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
cmake_minimum_required(VERSION 3.8)
project(test_package LANGUAGES CXX)

find_package(Xlnt REQUIRED CONFIG)

add_executable(${PROJECT_NAME} test_package.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE xlnt::xlnt)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_11)
26 changes: 26 additions & 0 deletions recipes/xlnt/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import CMake, cmake_layout
import os


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

def layout(self):
cmake_layout(self)

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

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

def test(self):
if can_run(self):
bin_path = os.path.join(self.cpp.build.bindirs[0], "test_package")
self.run(bin_path, env="conanrun")
14 changes: 14 additions & 0 deletions recipes/xlnt/all/test_package/test_package.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include <xlnt/xlnt.hpp>

int main()
{
xlnt::workbook wb;
xlnt::worksheet ws = wb.active_sheet();
ws.cell("A1").value(5);
ws.cell("B2").value("string data");
ws.cell("C3").formula("=RAND()");
ws.merge_cells("C3:C4");
ws.freeze_panes("B2");
wb.save("example.xlsx");
return 0;
}
8 changes: 8 additions & 0 deletions recipes/xlnt/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)
17 changes: 17 additions & 0 deletions recipes/xlnt/all/test_v1_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
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.configure()
cmake.build()

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