Skip to content
Closed
Show file tree
Hide file tree
Changes from all 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
6 changes: 6 additions & 0 deletions recipes/librdata/all/conandata.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
71 changes: 45 additions & 26 deletions recipes/librdata/all/conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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")
self.cpp_info.system_libs.append("m")
120 changes: 120 additions & 0 deletions recipes/librdata/all/patches/0001-build-on-windows.patch
Original file line number Diff line number Diff line change
@@ -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
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
+ $<INSTALL_INTERFACE:include>
+)
+
+# 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 <fcntl.h>
#include <stdlib.h>
-#include <unistd.h>
+
+#ifdef _WIN32
+ #include <io.h>
+ #include <process.h>
+#else
+ #include <unistd.h>
+#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);
3 changes: 3 additions & 0 deletions recipes/librdata/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -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


Expand All @@ -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)
Expand Down