diff --git a/recipes/librdata/all/conandata.yml b/recipes/librdata/all/conandata.yml index d864c52bb51ee..6e33f759f684e 100644 --- a/recipes/librdata/all/conandata.yml +++ b/recipes/librdata/all/conandata.yml @@ -2,3 +2,9 @@ sources: "0.0.0.cci.20231003": url: "https://github.com/WizardMac/librdata/archive/33bd276ecb0bbcd8997ccc71a544149b3da0d940.tar.gz" sha256: "fc3e0d655c21d4b5144a0ad73f79a249903b5dde4dc8f7091cd0393d214294a2" +patches: + "0.0.0.cci.20231003": + - patch_file: "patches/0001-build-on-windows.patch" + patch_description: "Enable to build on Windows" + patch_type: "portability" + patch_source: "https://github.com/WizardMac/librdata/pull/52/commits/3dc64149cceb3e41cb9284e09db8e34151147990" \ No newline at end of file diff --git a/recipes/librdata/all/conanfile.py b/recipes/librdata/all/conanfile.py index 37de0daa80130..eff6000e38d4e 100644 --- a/recipes/librdata/all/conanfile.py +++ b/recipes/librdata/all/conanfile.py @@ -2,15 +2,16 @@ from conan import ConanFile from conan.tools.gnu import Autotools, AutotoolsDeps, AutotoolsToolchain -from conan.tools.files import copy, rm, rmdir, get +from conan.tools.files import apply_conandata_patches, export_conandata_patches, copy, rm, rmdir, get from conan.tools.apple import fix_apple_shared_install_name from conan.tools.microsoft import is_msvc +from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps from conan.tools.layout import basic_layout from conan.errors import ConanInvalidConfiguration required_conan_version = ">=2.0.9" -class Libreadstat(ConanFile): +class Librdata(ConanFile): name = "librdata" description = "librdata is a library for read and write R data frames from C" license = "MIT" @@ -29,52 +30,70 @@ class Libreadstat(ConanFile): } implements = ["auto_shared_fpic"] + def export_sources(self): + export_conandata_patches(self) + def layout(self): basic_layout(self, src_folder="src") - def validate(self): - # INFO: rdata is not prepared for Visual Studio, but mingw and msys2 only - # It fails with configure:4072: error: C compiler cannot create executables - # The upstream uses mingw in the CI, not MSVC - if is_msvc(self): - raise ConanInvalidConfiguration(f"{self.ref} does not support Visual Studio. Please use MinGW or MSYS2.") - def requirements(self): self.requires("bzip2/1.0.8") self.requires("zlib/[>=1.2.11 <2]") self.requires("xz_utils/[>=5.4.5 <6]") + if is_msvc(self): + self.requires("libiconv/1.18") def build_requirements(self): self.tool_requires("libtool/2.4.7") # INFO: gettext is required by libtool due macro: AM_ICONV self.tool_requires("gettext/0.22.5") + if is_msvc(self): + self.tool_requires("cmake/[>=3.22 <4]") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) + def _patch_sources(self): + apply_conandata_patches(self) + def generate(self): - tc = AutotoolsToolchain(self) - tc.generate() - dep = AutotoolsDeps(self) - dep.generate() + self._patch_sources() + if is_msvc(self): + tc = CMakeToolchain(self) + tc.generate() + tc = CMakeDeps(self) + tc.generate() + else: + tc = AutotoolsToolchain(self) + tc.generate() + dep = AutotoolsDeps(self) + dep.generate() def build(self): - autotools = Autotools(self) - autotools.autoreconf() - autotools.configure() - autotools.make() + if is_msvc(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + else: + autotools = Autotools(self) + autotools.autoreconf() + autotools.configure() + autotools.make() def package(self): copy(self, pattern="LICENSE*", dst=os.path.join(self.package_folder, "licenses"), src=self.source_folder) - autotools = Autotools(self) - autotools.install() - rm(self, "*.la", os.path.join(self.package_folder, "lib")) - rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig")) - rmdir(self, os.path.join(self.package_folder, "share")) - fix_apple_shared_install_name(self) + if is_msvc(self): + cmake = CMake(self) + cmake.install() + else: + autotools = Autotools(self) + autotools.install() + rm(self, "*.la", os.path.join(self.package_folder, "lib")) + rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig")) + rmdir(self, os.path.join(self.package_folder, "share")) + fix_apple_shared_install_name(self) def package_info(self): - suffix = "_i" if is_msvc(self) and self.options.shared else "" - self.cpp_info.libs = [f"rdata{suffix}"] + self.cpp_info.libs = ["rdata"] if self.settings.os in ("FreeBSD", "Linux"): - self.cpp_info.system_libs.append("m") \ No newline at end of file + self.cpp_info.system_libs.append("m") diff --git a/recipes/librdata/all/patches/0001-build-on-windows.patch b/recipes/librdata/all/patches/0001-build-on-windows.patch new file mode 100644 index 0000000000000..ec9dc21bccfd3 --- /dev/null +++ b/recipes/librdata/all/patches/0001-build-on-windows.patch @@ -0,0 +1,120 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +new file mode 100644 +index 0000000..2875e6f +--- /dev/null ++++ b/CMakeLists.txt +@@ -0,0 +1,84 @@ ++cmake_minimum_required(VERSION 3.15) ++project(librdata LANGUAGES C) ++ ++set(CMAKE_C_STANDARD 11) ++option(BUILD_SHARED_LIBS "Build shared rdata library" OFF) ++option(WITH_ZLIB "Enable zlib compression support" ON) ++option(WITH_BZIP2 "Enable bzip2 compression support" ON) ++option(WITH_LZMA "Enable lzma/xz compression support" ON) ++ ++set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) ++ ++file(GLOB RDATA_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h") ++file(GLOB RDATA_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c") ++ ++if(NOT RDATA_SOURCES) ++ message(FATAL_ERROR "No source files found in src/. Ensure .c files are present.") ++endif() ++ ++add_library(rdata ${RDATA_SOURCES} ${RDATA_HEADERS}) ++target_include_directories(rdata PUBLIC ++ $ ++ $ ++) ++ ++# zlib ++if(WITH_ZLIB) ++ find_package(ZLIB QUIET) ++ if(ZLIB_FOUND) ++ target_compile_definitions(rdata PRIVATE HAVE_ZLIB=1) ++ target_link_libraries(rdata PUBLIC ZLIB::ZLIB) ++ else() ++ message(STATUS "zlib not found; building without zlib support") ++ endif() ++endif() ++ ++# bzip2 ++if(WITH_BZIP2) ++ find_package(BZip2 QUIET) ++ if(BZIP2_FOUND) ++ target_compile_definitions(rdata PRIVATE HAVE_BZIP2=1) ++ if(TARGET BZip2::BZip2) ++ target_link_libraries(rdata PUBLIC BZip2::BZip2) ++ else() ++ target_include_directories(rdata PUBLIC ${BZIP2_INCLUDE_DIR}) ++ target_link_libraries(rdata PUBLIC ${BZIP2_LIBRARIES}) ++ endif() ++ else() ++ message(STATUS "bzip2 not found; building without bzip2 support") ++ endif() ++endif() ++ ++# liblzma / xz ++if(WITH_LZMA) ++ find_path(LZMA_INCLUDE NAMES lzma.h) ++ find_library(LZMA_LIBRARY NAMES lzma) ++ if(LZMA_INCLUDE AND LZMA_LIBRARY) ++ target_compile_definitions(rdata PRIVATE HAVE_LZMA=1) ++ target_include_directories(rdata PUBLIC ${LZMA_INCLUDE}) ++ target_link_libraries(rdata PUBLIC ${LZMA_LIBRARY}) ++ else() ++ message(STATUS "liblzma not found; building without lzma support") ++ endif() ++endif() ++ ++# libiconv ++if(MSVC) ++ find_package(Iconv QUIET) ++ if(Iconv_FOUND) ++ target_compile_definitions(rdata PRIVATE HAVE_Iconv=1) ++ target_link_libraries(rdata PUBLIC Iconv::Iconv) ++ else() ++ message(STATUS "libiconv not found, it's required on Windows build") ++ endif() ++endif() ++ ++# Installation ++install(TARGETS rdata ++ EXPORT librdataTargets ++ ARCHIVE DESTINATION lib ++ LIBRARY DESTINATION lib ++ RUNTIME DESTINATION bin ++) ++install(DIRECTORY src/ DESTINATION include FILES_MATCHING PATTERN "*.h") ++install(EXPORT librdataTargets DESTINATION lib/cmake/librdata NAMESPACE librdata::) +diff --git a/src/rdata_io_unistd.c b/src/rdata_io_unistd.c +index 28830de..742b0cc 100644 +--- a/src/rdata_io_unistd.c ++++ b/src/rdata_io_unistd.c +@@ -1,7 +1,13 @@ + + #include + #include +-#include ++ ++#ifdef _WIN32 ++ #include ++ #include ++#else ++ #include ++#endif + + #include "rdata.h" + #include "rdata_io_unistd.h" +@@ -14,10 +20,6 @@ + #define UNISTD_OPEN_OPTIONS O_RDONLY + #endif + +-#if defined _WIN32 || defined _AIX +-#define lseek lseek64 +-#endif +- + + int rdata_unistd_open_handler(const char *path, void *io_ctx) { + int fd = open(path, UNISTD_OPEN_OPTIONS); \ No newline at end of file diff --git a/recipes/librdata/all/test_package/conanfile.py b/recipes/librdata/all/test_package/conanfile.py index da6493fdf21f2..d3206b7441dda 100644 --- a/recipes/librdata/all/test_package/conanfile.py +++ b/recipes/librdata/all/test_package/conanfile.py @@ -1,6 +1,7 @@ from conan import ConanFile from conan.tools.build import can_run from conan.tools.cmake import cmake_layout, CMake +from conan.tools.microsoft import is_msvc import os @@ -10,6 +11,8 @@ class TestPackageConan(ConanFile): def requirements(self): self.requires(self.tested_reference_str) + if is_msvc(self): + self.tool_requires("cmake/[>=3.22 <4]") def layout(self): cmake_layout(self)