Skip to content

Commit ba7e68a

Browse files
authored
Add conan recipe (#13)
* Add conanfile * Add conan workflow * Use available flatbuffers version * Add flatbuffers as build requirement * Handle conan package name and flatc target * Use var for flatbuffers version * Use hankhsu1996/[email protected] * Use sccache
1 parent 1841ef1 commit ba7e68a

File tree

4 files changed

+172
-6
lines changed

4 files changed

+172
-6
lines changed

.github/workflows/conan.yaml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: Conan
2+
on:
3+
workflow_dispatch:
4+
pull_request:
5+
push:
6+
branches: [main]
7+
8+
jobs:
9+
conan-package:
10+
runs-on: ubuntu-24.04
11+
12+
steps:
13+
- name: Run sccache-cache
14+
uses: mozilla-actions/[email protected]
15+
16+
- name: Checkout repository
17+
uses: actions/checkout@v4
18+
19+
- name: Setup Conan Environment
20+
uses: hankhsu1996/[email protected]
21+
with:
22+
cache-dependencies: true
23+
cache-tool: true
24+
25+
- name: Install conan dependencies
26+
run: |
27+
conan profile detect --force
28+
conan install . --output-folder=build --build=missing -s:a compiler.cppstd=20 -o:a build_tests=True
29+
30+
- name: CMake configuration
31+
run: |
32+
cmake --preset conan-release \
33+
-DSPARROW_IPC_BUILD_TESTS=ON \
34+
-DFETCH_DEPENDENCIES_WITH_CMAKE=MISSING \
35+
-DCMAKE_C_COMPILER_LAUNCHER=sccache \
36+
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache
37+
38+
- name: Build tests
39+
working-directory: build/build/Release
40+
run: cmake --build . --config Release --target test_sparrow_ipc_lib
41+
42+
- name: Run tests
43+
working-directory: build/build/Release
44+
run: cmake --build . --config Release --target run_tests_with_junit_report
45+
46+
- name: Run sccache stat for check
47+
shell: bash
48+
run: ${SCCACHE_PATH} --show-stats

CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,15 @@ foreach(fbs_file IN LISTS FLATBUFFERS_SCHEMAS)
9999
list(APPEND FLATBUFFERS_GENERATED_HEADERS "${FLATBUFFERS_GENERATED_DIR}/${header_name}_generated.h")
100100
endforeach()
101101

102+
if(TARGET flatbuffers::flatc)
103+
set(FLATC_EXECUTABLE flatbuffers::flatc)
104+
else()
105+
set(FLATC_EXECUTABLE flatc)
106+
endif()
107+
102108
add_custom_command(
103109
OUTPUT ${FLATBUFFERS_GENERATED_HEADERS}
104-
COMMAND flatc --cpp -o ${FLATBUFFERS_GENERATED_DIR} --cpp-std c++17 --scoped-enums ${FLATBUFFERS_SCHEMAS}
110+
COMMAND ${FLATC_EXECUTABLE} --cpp -o ${FLATBUFFERS_GENERATED_DIR} --cpp-std c++17 --scoped-enums ${FLATBUFFERS_SCHEMAS}
105111
DEPENDS ${FLATBUFFERS_SCHEMAS}
106112
COMMENT "Generating FlatBuffers C++ headers from schemas"
107113
)

cmake/external_dependencies.cmake

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,23 @@ endif()
1111

1212
function(find_package_or_fetch)
1313
set(options)
14-
set(oneValueArgs PACKAGE_NAME VERSION GIT_REPOSITORY TAG)
14+
set(oneValueArgs CONAN_PKG_NAME PACKAGE_NAME VERSION GIT_REPOSITORY TAG)
1515
set(multiValueArgs)
1616
cmake_parse_arguments(PARSE_ARGV 0 arg
1717
"${options}" "${oneValueArgs}" "${multiValueArgs}"
1818
)
19+
20+
set(actual_pkg_name ${arg_PACKAGE_NAME})
21+
if(arg_CONAN_PKG_NAME)
22+
set(actual_pkg_name ${arg_CONAN_PKG_NAME})
23+
endif()
24+
1925
if(NOT FETCH_DEPENDENCIES_WITH_CMAKE STREQUAL "ON")
20-
find_package(${arg_PACKAGE_NAME} ${FIND_PACKAGE_OPTIONS})
26+
find_package(${actual_pkg_name} ${FIND_PACKAGE_OPTIONS})
2127
endif()
28+
2229
if(FETCH_DEPENDENCIES_WITH_CMAKE STREQUAL "ON" OR FETCH_DEPENDENCIES_WITH_CMAKE STREQUAL "MISSING")
23-
if(NOT ${arg_PACKAGE_NAME}_FOUND)
30+
if(NOT ${actual_pkg_name}_FOUND)
2431
message(STATUS "📦 Fetching ${arg_PACKAGE_NAME}")
2532
FetchContent_Declare(
2633
${arg_PACKAGE_NAME}
@@ -33,7 +40,7 @@ function(find_package_or_fetch)
3340
FetchContent_MakeAvailable(${arg_PACKAGE_NAME})
3441
message(STATUS "\t✅ Fetched ${arg_PACKAGE_NAME}")
3542
else()
36-
message(STATUS "📦 ${arg_PACKAGE_NAME} found here: ${arg_PACKAGE_NAME}_DIR")
43+
message(STATUS "📦 ${actual_pkg_name} found here: ${actual_pkg_name}_DIR")
3744
endif()
3845
endif()
3946
endfunction()
@@ -53,6 +60,7 @@ endif()
5360
set(FLATBUFFERS_BUILD_TESTS OFF)
5461
set(FLATBUFFERS_BUILD_SHAREDLIB ${SPARROW_IPC_BUILD_SHARED})
5562
find_package_or_fetch(
63+
CONAN_PKG_NAME flatbuffers
5664
PACKAGE_NAME FlatBuffers
5765
VERSION v25.2.10
5866
GIT_REPOSITORY https://github.com/google/flatbuffers.git
@@ -71,4 +79,4 @@ if(SPARROW_IPC_BUILD_TESTS)
7179
GIT_REPOSITORY https://github.com/doctest/doctest.git
7280
TAG v2.4.12
7381
)
74-
endif()
82+
endif()

conanfile.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
from conan import ConanFile
2+
from conan.errors import ConanInvalidConfiguration
3+
from conan.tools.build.cppstd import check_min_cppstd
4+
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
5+
from conan.tools.files import copy
6+
from conan.tools.scm import Version
7+
import os
8+
9+
required_conan_version = ">=2.0"
10+
11+
class SparrowIPCRecipe(ConanFile):
12+
name = "sparrow-ipc"
13+
description = "C++20 library for memory-mapped serialization of Apache Arrow data."
14+
license = "BSD-3-Clause"
15+
author = "QuantStack"
16+
url = "https://github.com/QuantStack/sparrow-ipc"
17+
homepage = "https://github.com/QuantStack/sparrow-ipc"
18+
topics = ("arrow", "apache arrow", "columnar format", "dataframe", "ipc", "serialization", "deserialization", "flatbuffers")
19+
package_type = "library"
20+
settings = "os", "arch", "compiler", "build_type"
21+
exports_sources = "include/*", "src/*", "cmake/*", "CMakeLists.txt", "LICENSE"
22+
options = {
23+
"shared": [True, False],
24+
"fPIC": [True, False],
25+
"build_tests": [True, False],
26+
}
27+
default_options = {
28+
"shared": False,
29+
"fPIC": True,
30+
"build_tests": False,
31+
}
32+
33+
_flatbuffers_version = "24.12.23"
34+
35+
def config_options(self):
36+
if self.settings.os == "Windows":
37+
del self.options.fPIC
38+
39+
def configure(self):
40+
if self.options.shared:
41+
self.options.rm_safe("fPIC")
42+
43+
def requirements(self):
44+
self.requires("sparrow/1.0.0")
45+
self.requires(f"flatbuffers/{self._flatbuffers_version}")
46+
if self.options.get_safe("build_tests"):
47+
self.test_requires("doctest/2.4.12")
48+
49+
def build_requirements(self):
50+
self.tool_requires("cmake/[>=3.28.1 <4.2.0]")
51+
self.tool_requires(f"flatbuffers/{self._flatbuffers_version}")
52+
53+
@property
54+
def _min_cppstd(self):
55+
return 20
56+
57+
@property
58+
def _compilers_minimum_version(self):
59+
return {
60+
"apple-clang": "16",
61+
"clang": "18",
62+
"gcc": "12",
63+
"msvc": "194"
64+
}
65+
66+
def validate(self):
67+
if self.settings.compiler.get_safe("cppstd"):
68+
check_min_cppstd(self, self._min_cppstd)
69+
70+
minimum_version = self._compilers_minimum_version.get(
71+
str(self.settings.compiler), False)
72+
if minimum_version and Version(self.settings.compiler.version) < minimum_version:
73+
raise ConanInvalidConfiguration(
74+
f"{self.ref} requires C++{self._min_cppstd}, which your compiler does not support."
75+
)
76+
77+
def layout(self):
78+
cmake_layout(self, src_folder=".")
79+
80+
def generate(self):
81+
deps = CMakeDeps(self)
82+
deps.generate()
83+
84+
tc = CMakeToolchain(self)
85+
tc.variables["SPARROW_IPC_BUILD_SHARED"] = self.options.shared
86+
tc.variables["SPARROW_IPC_BUILD_TESTS"] = self.options.build_tests
87+
tc.generate()
88+
89+
def build(self):
90+
cmake = CMake(self)
91+
cmake.configure()
92+
cmake.build()
93+
94+
def package(self):
95+
copy(self, "LICENSE",
96+
dst=os.path.join(self.package_folder, "licenses"),
97+
src=self.source_folder)
98+
cmake = CMake(self)
99+
cmake.install()
100+
101+
def package_info(self):
102+
self.cpp_info.libs = ["sparrow-ipc"]
103+
self.cpp_info.set_property("cmake_file_name", "sparrow-ipc")
104+
self.cpp_info.set_property("cmake_target_name", "sparrow-ipc::sparrow-ipc")

0 commit comments

Comments
 (0)