[py-smartredis] New Package (#39098)
* Create a spack package for smartredis python client * make py-SR deps versions match docs * tie SR v0.4.0 to redis-plus-plus v1.3.5 * looser extension lib deps for concretization * Apply suggestions from code review Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com> * Address reviewer feedback --------- Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com>
This commit is contained in:
parent
045c5cea53
commit
78bca131fb
3 changed files with 247 additions and 0 deletions
52
var/spack/repos/builtin/packages/py-smartredis/package.py
Normal file
52
var/spack/repos/builtin/packages/py-smartredis/package.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
class PySmartredis(PythonPackage):
|
||||
"""A Python Interface for the SmartRedis Library Client"""
|
||||
|
||||
homepage = "https://www.craylabs.org/docs/smartredis.html"
|
||||
pypi = "smartredis/smartredis-0.4.0.tar.gz"
|
||||
git = "https://github.com/CrayLabs/SmartRedis"
|
||||
|
||||
maintainers("MattToast")
|
||||
|
||||
version("0.4.1", sha256="fff16ed1eb09648ac3c3f845373beb37f3ffe7414d8745ae36af9daf585f8c5b")
|
||||
version("0.4.0", sha256="d12779aa8bb038e837c25eac41b178aab9e16b729d50ee360b5af8f813d9f1dd")
|
||||
|
||||
depends_on("python@3.7:3.10", type=("build", "run"))
|
||||
depends_on("py-setuptools@42:", type=("build",))
|
||||
|
||||
depends_on("cmake@3.13:", type=("build",))
|
||||
|
||||
# Documented dependencies
|
||||
depends_on("hiredis@1.1:", type=("build", "link", "run"), when="@0.4.1")
|
||||
depends_on("hiredis@1.0:", type=("build", "link", "run"), when="@0.4.0")
|
||||
depends_on("redis-plus-plus@1.3.5: cxxstd=17", type=("build", "link"))
|
||||
|
||||
# Unlisted dependency needed to build the python client. The pybind requirement
|
||||
# can be found:
|
||||
# - in the `build-scripts/build_deps.sh` for SmartRedis <= v0.4.0
|
||||
# - in the `Makefile` under the `pybind` target for SmartRedis >= v0.4.1
|
||||
depends_on("py-pybind11", type=("build",))
|
||||
|
||||
depends_on("py-numpy@1.18.2:", type=("build", "run"))
|
||||
|
||||
# By default, the `setup.py` for SmartRedis <= v0.4.1 will fetch dependencies and
|
||||
# use them to build the extension library; it does not allow users to supply
|
||||
# their own previously obtained dependencies. These patches remove the 'autofetch'
|
||||
# behavior and use the dependencies provided through spack.
|
||||
patch("sr_0_4_1_no_deps.patch", when="@0.4.1")
|
||||
patch("sr_0_4_0_no_deps.patch", when="@0.4.0")
|
||||
|
||||
def setup_build_environment(self, env):
|
||||
spec = self.spec
|
||||
env.set("REDISPP_LIB_DIR", spec["redis-plus-plus"].libs.directories[0])
|
||||
env.set("REDISPP_INC_DIR", spec["redis-plus-plus"].headers.directories[0])
|
||||
env.set("HIREDIS_LIB_DIR", spec["hiredis"].libs.directories[0])
|
||||
env.set("HIREDIS_INC_DIR", spec["hiredis"].headers.directories[0])
|
||||
env.set("PYBIND11_TOOLS", spec["py-pybind11"].prefix.share.cmake.pybind11)
|
|
@ -0,0 +1,101 @@
|
|||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 7dc8931..658d823 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -59,8 +59,20 @@ if (COVERAGE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
-find_library(REDISPP redis++ PATHS ${CMAKE_SOURCE_DIR}/install/lib NO_DEFAULT_PATH REQUIRED)
|
||||
-find_library(HIREDIS hiredis PATHS ${CMAKE_SOURCE_DIR}/install/lib NO_DEFAULT_PATH REQUIRED)
|
||||
+set(REDISPP_LIB_DIR ${CMAKE_SOURCE_DIR}/install/lib CACHE PATH "path to redis++")
|
||||
+set(HIREDIS_LIB_DIR ${CMAKE_SOURCE_DIR}/install/lib CACHE PATH "path to hiredis")
|
||||
+
|
||||
+set(REDISPP_INC_DIR ${CMAKE_SOURCE_DIR}/install/include CACHE PATH "path to redis++")
|
||||
+set(HIREDIS_INC_DIR ${CMAKE_SOURCE_DIR}/install/include CACHE PATH "path to hiredis")
|
||||
+
|
||||
+message("USING RPP PATH: ${REDISPP_LIB_DIR}")
|
||||
+message("USING HIR PATH: ${HIREDIS_LIB_DIR}")
|
||||
+message("USING RPP IPATH: ${REDISPP_INC_DIR}")
|
||||
+message("USING HIR IPATH: ${HIREDIS_INC_DIR}")
|
||||
+
|
||||
+
|
||||
+find_library(REDISPP libredis++.a PATHS ${REDISPP_LIB_DIR} NO_DEFAULT_PATH REQUIRED)
|
||||
+find_library(HIREDIS hiredis PATHS ${HIREDIS_LIB_DIR} NO_DEFAULT_PATH REQUIRED)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
set(EXT_CLIENT_LIBRARIES ${REDISPP} ${HIREDIS})
|
||||
@@ -106,7 +118,8 @@ set(CLIENT_SRC
|
||||
|
||||
include_directories(SYSTEM
|
||||
include
|
||||
- install/include
|
||||
+ ${REDISPP_INC_DIR}
|
||||
+ ${HIREDIS_INC_DIR}
|
||||
)
|
||||
|
||||
if (BUILD_FORTRAN)
|
||||
@@ -148,8 +161,9 @@ install(TARGETS smartredis
|
||||
|
||||
if(BUILD_PYTHON)
|
||||
message("-- Python client build enabled")
|
||||
- add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/pybind
|
||||
- ${CMAKE_SOURCE_DIR}/third-party/pybind/build)
|
||||
+
|
||||
+ set(pybind11_DIR ${CMAKE_SOURCE_DIR}/third-party/pybind/tools)
|
||||
+ find_package(pybind11)
|
||||
|
||||
add_library(smartredis_static STATIC ${CLIENT_SRC})
|
||||
|
||||
diff --git a/setup.py b/setup.py
|
||||
index dd19c6c..4248aef 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -58,9 +58,20 @@ class CMakeBuild(build_ext):
|
||||
build_directory = Path(self.build_temp).resolve()
|
||||
cmake_args = [
|
||||
'-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + str(build_directory),
|
||||
- '-DPYTHON_EXECUTABLE=' + sys.executable
|
||||
+ '-DPYTHON_EXECUTABLE=' + sys.executable,
|
||||
+ '-Dpybind11_DIR=' + str(os.getenv('PYBIND11_TOOLS')),
|
||||
]
|
||||
|
||||
+ for setting in [
|
||||
+ "REDISPP_LIB_DIR",
|
||||
+ "REDISPP_INC_DIR",
|
||||
+ "HIREDIS_LIB_DIR",
|
||||
+ "HIREDIS_INC_DIR",
|
||||
+ ]:
|
||||
+ val = os.getenv(setting)
|
||||
+ if val is not None:
|
||||
+ cmake_args.append(f"-D{setting}={val}")
|
||||
+
|
||||
cfg = 'Debug' if self.debug else 'Release'
|
||||
build_args = ['--config', cfg]
|
||||
build_args += ['--', f'-j{str(NPROC)}']
|
||||
@@ -78,15 +89,8 @@ class CMakeBuild(build_ext):
|
||||
if not build_directory.is_dir():
|
||||
os.makedirs(self.build_temp)
|
||||
|
||||
- print('-'*10, 'Building C dependencies', '-'*40)
|
||||
- make_cmd = shutil.which("make")
|
||||
setup_path = Path(os.path.abspath(os.path.dirname(__file__))).resolve()
|
||||
|
||||
- # build dependencies
|
||||
- subprocess.check_call([f"{make_cmd} deps"],
|
||||
- cwd=setup_path,
|
||||
- shell=True)
|
||||
-
|
||||
# run cmake prep step
|
||||
print('-'*10, 'Running CMake prepare', '-'*40)
|
||||
subprocess.check_call([self.cmake, setup_path] + cmake_args,
|
||||
@@ -99,9 +103,6 @@ class CMakeBuild(build_ext):
|
||||
subprocess.check_call(cmake_cmd,
|
||||
cwd=build_directory)
|
||||
|
||||
- shutil.copytree(setup_path.joinpath("install"),
|
||||
- build_directory.joinpath("install"))
|
||||
-
|
||||
# Move from build temp to final position
|
||||
for ext in self.extensions:
|
||||
self.move_output(ext)
|
|
@ -0,0 +1,94 @@
|
|||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index ca88a4d..30118fc 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -64,13 +64,27 @@ if (SR_PEDANTIC)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
+set(REDISPP_LIB_DIR ${CMAKE_SOURCE_DIR}/install/lib CACHE PATH "path to redis++")
|
||||
+set(REDISPP_INC_DIR ${CMAKE_SOURCE_DIR}/install/include CACHE PATH
|
||||
+ "path to redis++ headers")
|
||||
+
|
||||
+set(HIREDIS_LIB_DIR ${CMAKE_SOURCE_DIR}/install/lib CACHE PATH "path to hiredis")
|
||||
+set(HIREDIS_INC_DIR ${CMAKE_SOURCE_DIR}/install/include CACHE PATH
|
||||
+ "path to hiredis headers")
|
||||
+
|
||||
+message("USING REDIS++ PATH: ${REDISPP_LIB_DIR}")
|
||||
+message("USING REDIS++ INCLUDE PATH: ${REDISPP_INC_DIR}")
|
||||
+
|
||||
+message("USING HIREDIS PATH: ${HIREDIS_LIB_DIR}")
|
||||
+message("USING HIREDIS INCLUDE PATH: ${HIREDIS_INC_DIR}")
|
||||
+
|
||||
# Bring in third-party libaries needed for the SmartRedis library
|
||||
find_library(REDISPP redis++
|
||||
- PATHS ${CMAKE_SOURCE_DIR}/install/lib NO_DEFAULT_PATH
|
||||
+ PATHS ${REDISPP_LIB_DIR} NO_DEFAULT_PATH
|
||||
REQUIRED STATIC
|
||||
)
|
||||
find_library(HIREDIS hiredis
|
||||
- PATHS ${CMAKE_SOURCE_DIR}/install/lib NO_DEFAULT_PATH
|
||||
+ PATHS ${HIREDIS_LIB_DIR} NO_DEFAULT_PATH
|
||||
REQUIRED STATIC
|
||||
)
|
||||
find_package(Threads REQUIRED)
|
||||
@@ -121,7 +135,8 @@ set(CLIENT_SRC
|
||||
# Define include directories for header files
|
||||
include_directories(SYSTEM
|
||||
include
|
||||
- install/include
|
||||
+ ${REDISPP_INC_DIR}
|
||||
+ ${HIREDIS_INC_DIR}
|
||||
)
|
||||
|
||||
# Build the Fortran library
|
||||
@@ -177,8 +192,8 @@ install(TARGETS smartredis
|
||||
# Build the Python library for SmartRedis
|
||||
if(SR_PYTHON)
|
||||
message("-- Python client build enabled")
|
||||
- add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/pybind
|
||||
- ${CMAKE_SOURCE_DIR}/third-party/pybind/build)
|
||||
+ set(pybind11_DIR ${CMAKE_SOURCE_DIR}/third-party/pybind/tools)
|
||||
+ find_package(pybind11)
|
||||
|
||||
pybind11_add_module(smartredisPy
|
||||
src/python/src/pyclient.cpp
|
||||
diff --git a/setup.py b/setup.py
|
||||
index 90493ee..dd075db 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -73,14 +73,6 @@ class CMakeBuild(build_ext):
|
||||
env.get('CXXFLAGS', ''),
|
||||
self.distribution.get_version())
|
||||
|
||||
- # Build dependencies
|
||||
- print('-'*10, 'Building third-party dependencies', '-'*40)
|
||||
- subprocess.check_call(
|
||||
- [self.make, "deps"],
|
||||
- cwd=source_directory,
|
||||
- shell=False
|
||||
- )
|
||||
-
|
||||
# Run CMake config step
|
||||
print('-'*10, 'Configuring build', '-'*40)
|
||||
config_args = [
|
||||
@@ -90,7 +82,19 @@ class CMakeBuild(build_ext):
|
||||
'-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + str(build_directory),
|
||||
'-DPYTHON_EXECUTABLE=' + sys.executable,
|
||||
'-DSR_PYTHON=ON',
|
||||
+ '-Dpybind11_DIR=' + str(os.getenv('PYBIND11_TOOLS')),
|
||||
]
|
||||
+
|
||||
+ for setting in [
|
||||
+ "REDISPP_LIB_DIR",
|
||||
+ "REDISPP_INC_DIR",
|
||||
+ "HIREDIS_LIB_DIR",
|
||||
+ "HIREDIS_INC_DIR",
|
||||
+ ]:
|
||||
+ val = os.getenv(setting)
|
||||
+ if val is not None:
|
||||
+ config_args.append(f"-D{setting}={val}")
|
||||
+
|
||||
subprocess.check_call(
|
||||
[self.cmake] + config_args,
|
||||
cwd=source_directory,
|
Loading…
Reference in a new issue